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 2017/08/12 15:06:43 UTC

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

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site f322bf68e -> c0fcd7f38


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
+<span class="sourceLineNo"

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919<

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>   

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="so

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
index 2c8bb5a..192b7d9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
@@ -119,464 +119,465 @@
 <span class="sourceLineNo">111</span>    List&lt;Cell&gt; list = this.familyMap.get(family);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    if (list == null) {<a name="line.112"></a>
 <span class="sourceLineNo">113</span>      list = new ArrayList&lt;&gt;();<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return list;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /*<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   *<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return new KeyValue(this.row, family, qualifier, ts, KeyValue.Type.Put, value);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * @param family<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * @param qualifier<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @param ts<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param value<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param tags - Specify the Tags as an Array<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tags) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    KeyValue kvWithTag = new KeyValue(this.row, family, qualifier, ts, value, tags);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    return kvWithTag;<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>  /*<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   *<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  KeyValue createPutKeyValue(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      Tag[] tags) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    return new KeyValue(this.row, 0, this.row == null ? 0 : this.row.length,<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        family, 0, family == null ? 0 : family.length,<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        qualifier, ts, KeyValue.Type.Put, value, tags != null ? Arrays.asList(tags) : null);<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>   * Compile the column family (i.e. schema) information<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * into a Map. Useful for parsing and aggregation by debugging,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * logging, and administration tools.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @return Map<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;(this.familyMap.entrySet().size());<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    // ideally, we would also include table information, but that information<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // is not stored in each Operation instance.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    map.put("families", families);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return map;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Useful for debugging, logging, and administration tools.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @return Map<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // we start with the fingerprint map and build on top of it.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    // replace the fingerprint's simple list of families with a<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    // map from column families to lists of qualifiers and kv details<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;&gt; columns = new HashMap&lt;&gt;();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    map.put("families", columns);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    map.put("row", Bytes.toStringBinary(this.row));<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    int colCount = 0;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // iterate through all column families affected<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      // map from this family to details for each cell affected within the family<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      List&lt;Map&lt;String, Object&gt;&gt; qualifierDetails = new ArrayList&lt;&gt;();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      columns.put(Bytes.toStringBinary(entry.getKey()), qualifierDetails);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      colCount += entry.getValue().size();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (maxCols &lt;= 0) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        continue;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      // add details for each cell<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      for (Cell cell: entry.getValue()) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        if (--maxCols &lt;= 0) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          continue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        Map&lt;String, Object&gt; cellMap = cellToStringMap(cell);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        qualifierDetails.add(cellMap);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    map.put("totalColumns", colCount);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // add the id if set<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (getId() != null) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      map.put("id", getId());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // Add the TTL if set<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // Long.MAX_VALUE is the default, and is interpreted to mean this attribute<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // has not been set.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    if (getTTL() != Long.MAX_VALUE) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      map.put("ttl", getTTL());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return map;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private static Map&lt;String, Object&gt; cellToStringMap(Cell c) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    stringMap.put("qualifier", Bytes.toStringBinary(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.223"></a>
-<span class="sourceLineNo">224</span>                c.getQualifierLength()));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    stringMap.put("timestamp", c.getTimestamp());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    stringMap.put("vlen", c.getValueLength());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    List&lt;Tag&gt; tags = CellUtil.getTags(c);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (tags != null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      List&lt;String&gt; tagsString = new ArrayList&lt;&gt;(tags.size());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      for (Tag t : tags) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        tagsString.add((t.getType()) + ":" + Bytes.toStringBinary(TagUtil.cloneValue(t)));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      stringMap.put("tag", tagsString);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    return stringMap;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Set the durability for this mutation<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * @param d<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public Mutation setDurability(Durability d) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.durability = d;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return this;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  /** Get the current durability */<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  public Durability getDurability() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return this.durability;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Method for retrieving the put's familyMap<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @return familyMap<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; getFamilyCellMap() {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return this.familyMap;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * Method for setting the put's familyMap<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  public Mutation setFamilyCellMap(NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; map) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // TODO: Shut this down or move it up to be a Constructor.  Get new object rather than change<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    // this internal data member.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    this.familyMap = map;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return this;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * Method to check if the familyMap is empty<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return true if empty, false otherwise<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public boolean isEmpty() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return familyMap.isEmpty();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * Method for retrieving the delete's row<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return row<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public byte [] getRow() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return this.row;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  public int compareTo(final Row d) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    return Bytes.compareTo(this.getRow(), d.getRow());<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<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>   * Method for retrieving the timestamp<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * @return timestamp<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public long getTimeStamp() {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    return this.ts;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * Marks that the clusters with the given clusterIds have consumed the mutation<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * @param clusterIds of the clusters that have consumed the mutation<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public Mutation setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    ByteArrayDataOutput out = ByteStreams.newDataOutput();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    out.writeInt(clusterIds.size());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    for (UUID clusterId : clusterIds) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      out.writeLong(clusterId.getMostSignificantBits());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      out.writeLong(clusterId.getLeastSignificantBits());<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    setAttribute(CONSUMED_CLUSTER_IDS, out.toByteArray());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return this;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return the set of clusterIds that have consumed the mutation<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    List&lt;UUID&gt; clusterIds = new ArrayList&lt;&gt;();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    byte[] bytes = getAttribute(CONSUMED_CLUSTER_IDS);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if(bytes != null) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      ByteArrayDataInput in = ByteStreams.newDataInput(bytes);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      int numClusters = in.readInt();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      for(int i=0; i&lt;numClusters; i++){<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        clusterIds.add(new UUID(in.readLong(), in.readLong()));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    return clusterIds;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /**<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * Sets the visibility expression associated with cells in this Mutation.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * It is illegal to set &lt;code&gt;CellVisibility&lt;/code&gt; on &lt;code&gt;Delete&lt;/code&gt; mutation.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @param expression<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public Mutation setCellVisibility(CellVisibility expression) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        toCellVisibility(expression).toByteArray());<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return this;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @return CellVisibility associated with cells in this Mutation.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * @throws DeserializationException<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   */<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  public CellVisibility getCellVisibility() throws DeserializationException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[] cellVisibilityBytes = this.getAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    if (cellVisibilityBytes == null) return null;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    return toCellVisibility(cellVisibilityBytes);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  /**<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * Create a protocol buffer CellVisibility based on a client CellVisibility.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param cellVisibility<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @return a protocol buffer CellVisibility<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  static ClientProtos.CellVisibility toCellVisibility(CellVisibility cellVisibility) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    builder.setExpression(cellVisibility.getExpression());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    return builder.build();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * Convert a protocol buffer CellVisibility to a client CellVisibility<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   *<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @param proto<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @return the converted client CellVisibility<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private static CellVisibility toCellVisibility(ClientProtos.CellVisibility proto) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (proto == null) return null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return new CellVisibility(proto.getExpression());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * Convert a protocol buffer CellVisibility bytes to a client CellVisibility<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @param protoBytes<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @return the converted client CellVisibility<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @throws DeserializationException<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private static CellVisibility toCellVisibility(byte[] protoBytes) throws DeserializationException {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    if (protoBytes == null) return null;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    ClientProtos.CellVisibility proto = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      ProtobufUtil.mergeFrom(builder, protoBytes);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      proto = builder.build();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    } catch (IOException e) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      throw new DeserializationException(e);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    return toCellVisibility(proto);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>  /**<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * Number of KeyValues carried by this Mutation.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * @return the total number of KeyValues<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  public int size() {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    int size = 0;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    for (List&lt;Cell&gt; cells : this.familyMap.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      size += cells.size();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return size;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  /**<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return the number of different families<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public int numFamilies() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    return familyMap.size();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @return Calculate what Mutation adds to class heap size.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  @Override<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public long heapSize() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    long heapsize = MUTATION_OVERHEAD;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // Adding row<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    heapsize += ClassSize.align(ClassSize.ARRAY + this.row.length);<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Adding map overhead<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    heapsize +=<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      ClassSize.align(this.familyMap.size() * ClassSize.MAP_ENTRY);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      //Adding key overhead<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      heapsize +=<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        ClassSize.align(ClassSize.ARRAY + entry.getKey().length);<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      //This part is kinds tricky since the JVM can reuse references if you<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      //store the same value, but have a good match with SizeOf at the moment<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      //Adding value overhead<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      heapsize += ClassSize.align(ClassSize.ARRAYLIST);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      int size = entry.getValue().size();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      heapsize += ClassSize.align(ClassSize.ARRAY +<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          size * ClassSize.REFERENCE);<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for(Cell cell : entry.getValue()) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        heapsize += CellUtil.estimatedHeapSizeOf(cell);<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>    heapsize += getAttributeSize();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    heapsize += extraHeapSize();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return ClassSize.align(heapsize);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * @return The serialized ACL for this operation, or null if none<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public byte[] getACL() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return getAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @param user User short name<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * @param perms Permissions for the user<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public Mutation setACL(String user, Permission perms) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      AccessControlUtil.toUsersAndPermissions(user, perms).toByteArray());<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return this;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * @param perms A map of permissions for a user or users<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public Mutation setACL(Map&lt;String, Permission&gt; perms) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    ListMultimap&lt;String, Permission&gt; permMap = ArrayListMultimap.create();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    for (Map.Entry&lt;String, Permission&gt; entry : perms.entrySet()) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      permMap.put(entry.getKey(), entry.getValue());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      AccessControlUtil.toUsersAndPermissions(permMap).toByteArray());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    return this;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * Return the TTL requested for the result of the mutation, in milliseconds.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * @return the TTL requested for the result of the mutation, in milliseconds,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * or Long.MAX_VALUE if unset<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  public long getTTL() {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    byte[] ttlBytes = getAttribute(OP_ATTRIBUTE_TTL);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    if (ttlBytes != null) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      return Bytes.toLong(ttlBytes);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    return Long.MAX_VALUE;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  /**<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * Set the TTL desired for the result of the mutation, in milliseconds.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param ttl the TTL desired for the result of the mutation, in milliseconds<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return this<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public Mutation setTTL(long ttl) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    setAttribute(OP_ATTRIBUTE_TTL, Bytes.toBytes(ttl));<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return this;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * @return current value for returnResults<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  // Used by Increment and Append only.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  @InterfaceAudience.Private<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  protected boolean isReturnResults() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    byte[] v = getAttribute(RETURN_RESULTS);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    return v == null ? true : Bytes.toBoolean(v);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  @InterfaceAudience.Private<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  // Used by Increment and Append only.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  protected Mutation setReturnResults(boolean returnResults) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    setAttribute(RETURN_RESULTS, Bytes.toBytes(returnResults));<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    return this;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>  /**<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * Subclasses should override this method to add the heap size of their own fields.<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @return the heap size to add (will be aligned).<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   */<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  protected long extraHeapSize(){<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return 0L;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">114</span>      this.familyMap.put(family, list);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return list;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /*<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return new KeyValue(this.row, family, qualifier, ts, KeyValue.Type.Put, value);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @param family<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * @param qualifier<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param ts<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param value<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param tags - Specify the Tags as an Array<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tags) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    KeyValue kvWithTag = new KeyValue(this.row, family, qualifier, ts, value, tags);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    return kvWithTag;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  /*<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   *<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  KeyValue createPutKeyValue(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      Tag[] tags) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    return new KeyValue(this.row, 0, this.row == null ? 0 : this.row.length,<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        family, 0, family == null ? 0 : family.length,<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        qualifier, ts, KeyValue.Type.Put, value, tags != null ? Arrays.asList(tags) : null);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  /**<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Compile the column family (i.e. schema) information<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * into a Map. Useful for parsing and aggregation by debugging,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * logging, and administration tools.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;(this.familyMap.entrySet().size());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    // ideally, we would also include table information, but that information<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    // is not stored in each Operation instance.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    map.put("families", families);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return map;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Useful for debugging, logging, and administration tools.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * @return Map<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // we start with the fingerprint map and build on top of it.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // replace the fingerprint's simple list of families with a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // map from column families to lists of qualifiers and kv details<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;&gt; columns = new HashMap&lt;&gt;();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    map.put("families", columns);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    map.put("row", Bytes.toStringBinary(this.row));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    int colCount = 0;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // iterate through all column families affected<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // map from this family to details for each cell affected within the family<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      List&lt;Map&lt;String, Object&gt;&gt; qualifierDetails = new ArrayList&lt;&gt;();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      columns.put(Bytes.toStringBinary(entry.getKey()), qualifierDetails);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      colCount += entry.getValue().size();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      if (maxCols &lt;= 0) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        continue;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // add details for each cell<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      for (Cell cell: entry.getValue()) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        if (--maxCols &lt;= 0) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          continue;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        Map&lt;String, Object&gt; cellMap = cellToStringMap(cell);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        qualifierDetails.add(cellMap);<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>    map.put("totalColumns", colCount);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    // add the id if set<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    if (getId() != null) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      map.put("id", getId());<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // Add the TTL if set<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // Long.MAX_VALUE is the default, and is interpreted to mean this attribute<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    // has not been set.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    if (getTTL() != Long.MAX_VALUE) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      map.put("ttl", getTTL());<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return map;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private static Map&lt;String, Object&gt; cellToStringMap(Cell c) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    stringMap.put("qualifier", Bytes.toStringBinary(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>                c.getQualifierLength()));<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    stringMap.put("timestamp", c.getTimestamp());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    stringMap.put("vlen", c.getValueLength());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    List&lt;Tag&gt; tags = CellUtil.getTags(c);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (tags != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      List&lt;String&gt; tagsString = new ArrayList&lt;&gt;(tags.size());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      for (Tag t : tags) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        tagsString.add((t.getType()) + ":" + Bytes.toStringBinary(TagUtil.cloneValue(t)));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      stringMap.put("tag", tagsString);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return stringMap;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Set the durability for this mutation<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * @param d<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  public Mutation setDurability(Durability d) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    this.durability = d;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return this;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /** Get the current durability */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public Durability getDurability() {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    return this.durability;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  /**<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * Method for retrieving the put's familyMap<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @return familyMap<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; getFamilyCellMap() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    return this.familyMap;<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>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Method for setting the put's familyMap<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public Mutation setFamilyCellMap(NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; map) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // TODO: Shut this down or move it up to be a Constructor.  Get new object rather than change<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // this internal data member.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.familyMap = map;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return this;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * Method to check if the familyMap is empty<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @return true if empty, false otherwise<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   */<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public boolean isEmpty() {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return familyMap.isEmpty();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * Method for retrieving the delete's row<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @return row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  public byte [] getRow() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return this.row;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public int compareTo(final Row d) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return Bytes.compareTo(this.getRow(), d.getRow());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * Method for retrieving the timestamp<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @return timestamp<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   */<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public long getTimeStamp() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return this.ts;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Marks that the clusters with the given clusterIds have consumed the mutation<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param clusterIds of the clusters that have consumed the mutation<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Mutation setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    ByteArrayDataOutput out = ByteStreams.newDataOutput();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    out.writeInt(clusterIds.size());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    for (UUID clusterId : clusterIds) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      out.writeLong(clusterId.getMostSignificantBits());<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      out.writeLong(clusterId.getLeastSignificantBits());<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    setAttribute(CONSUMED_CLUSTER_IDS, out.toByteArray());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return this;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return the set of clusterIds that have consumed the mutation<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    List&lt;UUID&gt; clusterIds = new ArrayList&lt;&gt;();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    byte[] bytes = getAttribute(CONSUMED_CLUSTER_IDS);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if(bytes != null) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      ByteArrayDataInput in = ByteStreams.newDataInput(bytes);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      int numClusters = in.readInt();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      for(int i=0; i&lt;numClusters; i++){<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        clusterIds.add(new UUID(in.readLong(), in.readLong()));<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 clusterIds;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * Sets the visibility expression associated with cells in this Mutation.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * It is illegal to set &lt;code&gt;CellVisibility&lt;/code&gt; on &lt;code&gt;Delete&lt;/code&gt; mutation.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param expression<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public Mutation setCellVisibility(CellVisibility expression) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        toCellVisibility(expression).toByteArray());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    return this;<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>   * @return CellVisibility associated with cells in this Mutation.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @throws DeserializationException<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  public CellVisibility getCellVisibility() throws DeserializationException {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[] cellVisibilityBytes = this.getAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    if (cellVisibilityBytes == null) return null;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    return toCellVisibility(cellVisibilityBytes);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  /**<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * Create a protocol buffer CellVisibility based on a client CellVisibility.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   *<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @param cellVisibility<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @return a protocol buffer CellVisibility<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  static ClientProtos.CellVisibility toCellVisibility(CellVisibility cellVisibility) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    builder.setExpression(cellVisibility.getExpression());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return builder.build();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * Convert a protocol buffer CellVisibility to a client CellVisibility<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * @param proto<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return the converted client CellVisibility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private static CellVisibility toCellVisibility(ClientProtos.CellVisibility proto) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    if (proto == null) return null;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new CellVisibility(proto.getExpression());<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Convert a protocol buffer CellVisibility bytes to a client CellVisibility<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param protoBytes<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @return the converted client CellVisibility<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @throws DeserializationException<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  private static CellVisibility toCellVisibility(byte[] protoBytes) throws DeserializationException {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    if (protoBytes == null) return null;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    ClientProtos.CellVisibility proto = null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    try {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      ProtobufUtil.mergeFrom(builder, protoBytes);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      proto = builder.build();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    } catch (IOException e) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      throw new DeserializationException(e);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return toCellVisibility(proto);<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>   * Number of KeyValues carried by this Mutation.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @return the total number of KeyValues<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public int size() {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    int size = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    for (List&lt;Cell&gt; cells : this.familyMap.values()) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      size += cells.size();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return size;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  /**<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @return the number of different families<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public int numFamilies() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return familyMap.size();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * @return Calculate what Mutation adds to class heap size.<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Override<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public long heapSize() {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    long heapsize = MUTATION_OVERHEAD;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Adding row<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    heapsize += ClassSize.align(ClassSize.ARRAY + this.row.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Adding map overhead<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    heapsize +=<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      ClassSize.align(this.familyMap.size() * ClassSize.MAP_ENTRY);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      //Adding key overhead<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      heapsize +=<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        ClassSize.align(ClassSize.ARRAY + entry.getKey().length);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      //This part is kinds tricky since the JVM can reuse references if you<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      //store the same value, but have a good match with SizeOf at the moment<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      //Adding value overhead<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      heapsize += ClassSize.align(ClassSize.ARRAYLIST);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      int size = entry.getValue().size();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      heapsize += ClassSize.align(ClassSize.ARRAY +<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          size * ClassSize.REFERENCE);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for(Cell cell : entry.getValue()) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        heapsize += CellUtil.estimatedHeapSizeOf(cell);<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>    heapsize += getAttributeSize();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    heapsize += extraHeapSize();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return ClassSize.align(heapsize);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * @return The serialized ACL for this operation, or null if none<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   */<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public byte[] getACL() {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    return getAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  /**<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   * @param user User short name<a name="line.457"></a>
+<span class="sourceLineNo">458</span>   * @param perms Permissions for the user<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   */<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  public Mutation setACL(String user, Permission perms) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      AccessControlUtil.toUsersAndPermissions(user, perms).toByteArray());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    return this;<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>  /**<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * @param perms A map of permissions for a user or users<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  public Mutation setACL(Map&lt;String, Permission&gt; perms) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    ListMultimap&lt;String, Permission&gt; permMap = ArrayListMultimap.create();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    for (Map.Entry&lt;String, Permission&gt; entry : perms.entrySet()) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      permMap.put(entry.getKey(), entry.getValue());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      AccessControlUtil.toUsersAndPermissions(permMap).toByteArray());<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    return this;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
+<span class="sourceLineNo">478</span><a name="line.478"></a>
+<span class="sourceLineNo">479</span>  /**<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Return the TTL requested for the result of the mutation, in milliseconds.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return the TTL requested for the result of the mutation, in milliseconds,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * or Long.MAX_VALUE if unset<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   */<a name="line.483"></a>
+<span class="sourceLineNo">484</span>  public long getTTL() {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    byte[] ttlBytes = getAttribute(OP_ATTRIBUTE_TTL);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    if (ttlBytes != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      return Bytes.toLong(ttlBytes);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    return Long.MAX_VALUE;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  }<a name="line.490"></a>
+<span class="sourceLineNo">491</span><a name="line.491"></a>
+<span class="sourceLineNo">492</span>  /**<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * Set the TTL desired for the result of the mutation, in milliseconds.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param ttl the TTL desired for the result of the mutation, in milliseconds<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @return this<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public Mutation setTTL(long ttl) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    setAttribute(OP_ATTRIBUTE_TTL, Bytes.toBytes(ttl));<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return this;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * @return current value for returnResults<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  // Used by Increment and Append only.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>  @InterfaceAudience.Private<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  protected boolean isReturnResults() {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    byte[] v = getAttribute(RETURN_RESULTS);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    return v == null ? true : Bytes.toBoolean(v);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  @InterfaceAudience.Private<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  // Used by Increment and Append only.<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  protected Mutation setReturnResults(boolean returnResults) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    setAttribute(RETURN_RESULTS, Bytes.toBytes(returnResults));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return this;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Subclasses should override this method to add the heap size of their own fields.<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * @return the heap size to add (will be aligned).<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  protected long extraHeapSize(){<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    return 0L;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
 <span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * @param row Row to check<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  static byte [] checkRow(final byte [] row) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return checkRow(row, 0, row == null? 0: row.length);<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>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * @param row Row to check<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * @param offset<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * @param length<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static byte [] checkRow(final byte [] row, final int offset, final int length) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    if (row == null) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    if (length == 0) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    if (length &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      throw new IllegalArgumentException("Row length " + length + " is &gt; " +<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        HConstants.MAX_ROW_LENGTH);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    return row;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>  static void checkRow(ByteBuffer row) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (row == null) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (row.remaining() == 0) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (row.remaining() &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      throw new IllegalArgumentException("Row length " + row.remaining() + " is &gt; " +<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HConstants.MAX_ROW_LENGTH);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>}<a name="line.571"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  /**<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * @param row Row to check<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  static byte [] checkRow(final byte [] row) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    return checkRow(row, 0, row == null? 0: row.length);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>   * @param row Row to check<a name="line.539"></a>
+<span class="sourceLineNo">540</span>   * @param offset<a name="line.540"></a>
+<span class="sourceLineNo">541</span>   * @param length<a name="line.541"></a>
+<span class="sourceLineNo">542</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   */<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  static byte [] checkRow(final byte [] row, final int offset, final int length) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    if (row == null) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (length == 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    if (length &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      throw new IllegalArgumentException("Row length " + length + " is &gt; " +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        HConstants.MAX_ROW_LENGTH);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    return row;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>  static void checkRow(ByteBuffer row) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    if (row == null) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    if (row.remaining() == 0) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    if (row.remaining() &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      throw new IllegalArgumentException("Row length " + row.remaining() + " is &gt; " +<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HConstants.MAX_ROW_LENGTH);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
+<span class="sourceLineNo">572</span>}<a name="line.572"></a>
 
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index aa27927..cb2fcfd 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -336,7 +336,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/checkstyle.html b/hbase-annotations/checkstyle.html
index 39ba79e..004ec5f 100644
--- a/hbase-annotations/checkstyle.html
+++ b/hbase-annotations/checkstyle.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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -273,7 +273,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependencies.html b/hbase-annotations/dependencies.html
index 6a7be7c..9a86c22 100644
--- a/hbase-annotations/dependencies.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -377,7 +377,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-convergence.html b/hbase-annotations/dependency-convergence.html
index bfebf13..cf9a535 100644
--- a/hbase-annotations/dependency-convergence.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-info.html b/hbase-annotations/dependency-info.html
index a9ee515..19658a6 100644
--- a/hbase-annotations/dependency-info.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-management.html b/hbase-annotations/dependency-management.html
index 4b6de87..4a4ef4f 100644
--- a/hbase-annotations/dependency-management.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/index.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/index.html b/hbase-annotations/index.html
index 7f36a5c..d80e2dc 100644
--- a/hbase-annotations/index.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/integration.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/integration.html b/hbase-annotations/integration.html
index 52657d9..faf5766 100644
--- a/hbase-annotations/integration.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/issue-tracking.html b/hbase-annotations/issue-tracking.html
index 0f55512..fededa3 100644
--- a/hbase-annotations/issue-tracking.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/license.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/license.html b/hbase-annotations/license.html
index 503b958..dcef226 100644
--- a/hbase-annotations/license.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/mail-lists.html b/hbase-annotations/mail-lists.html
index c8a4ee2..af24df0 100644
--- a/hbase-annotations/mail-lists.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugin-management.html b/hbase-annotations/plugin-management.html
index 5fb8580..b8d6e64 100644
--- a/hbase-annotations/plugin-management.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugins.html b/hbase-annotations/plugins.html
index 78f688a..a4166a0 100644
--- a/hbase-annotations/plugins.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -222,7 +222,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-info.html b/hbase-annotations/project-info.html
index 64572f5..5f217b6 100644
--- a/hbase-annotations/project-info.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-reports.html b/hbase-annotations/project-reports.html
index af83283..f2e9253 100644
--- a/hbase-annotations/project-reports.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-summary.html b/hbase-annotations/project-summary.html
index 36229de..552ac1e 100644
--- a/hbase-annotations/project-summary.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/source-repository.html b/hbase-annotations/source-repository.html
index bb74104..e6b86f0 100644
--- a/hbase-annotations/source-repository.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-annotations/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/team-list.html b/hbase-annotations/team-list.html
index ff13554..fec06db 100644
--- a/hbase-annotations/team-list.html
+++ b/hbase-annotations/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependencies.html b/hbase-archetypes/dependencies.html
index 680a66f..29461ad 100644
--- a/hbase-archetypes/dependencies.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -354,7 +354,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-convergence.html b/hbase-archetypes/dependency-convergence.html
index c69a281..2f6bb30 100644
--- a/hbase-archetypes/dependency-convergence.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-info.html b/hbase-archetypes/dependency-info.html
index 700d7b7..cee7bb1 100644
--- a/hbase-archetypes/dependency-info.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-management.html b/hbase-archetypes/dependency-management.html
index 4a61fe4..080d159 100644
--- a/hbase-archetypes/dependency-management.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependencies.html b/hbase-archetypes/hbase-archetype-builder/dependencies.html
index bd326e9..9788708 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependencies.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -354,7 +354,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html b/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
index 564a95e..298502f 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-info.html b/hbase-archetypes/hbase-archetype-builder/dependency-info.html
index 92cba8b..f835706 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-info.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-management.html b/hbase-archetypes/hbase-archetype-builder/dependency-management.html
index 24a5f80..8eebc7d 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-management.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/index.html b/hbase-archetypes/hbase-archetype-builder/index.html
index 39dfbd7..6cc4ce1 100644
--- a/hbase-archetypes/hbase-archetype-builder/index.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/integration.html b/hbase-archetypes/hbase-archetype-builder/integration.html
index 7ad9185..103dd7b 100644
--- a/hbase-archetypes/hbase-archetype-builder/integration.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/issue-tracking.html b/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
index 813484a..14bb382 100644
--- a/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/license.html b/hbase-archetypes/hbase-archetype-builder/license.html
index a681211..f2019c0 100644
--- a/hbase-archetypes/hbase-archetype-builder/license.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/mail-lists.html b/hbase-archetypes/hbase-archetype-builder/mail-lists.html
index b63fc70..d037bc6 100644
--- a/hbase-archetypes/hbase-archetype-builder/mail-lists.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/plugin-management.html b/hbase-archetypes/hbase-archetype-builder/plugin-management.html
index 043ac7f..52302e0 100644
--- a/hbase-archetypes/hbase-archetype-builder/plugin-management.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/plugins.html b/hbase-archetypes/hbase-archetype-builder/plugins.html
index 106dcc5..de18d2b 100644
--- a/hbase-archetypes/hbase-archetype-builder/plugins.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -214,7 +214,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/project-info.html b/hbase-archetypes/hbase-archetype-builder/project-info.html
index fe2448f..9c883a6 100644
--- a/hbase-archetypes/hbase-archetype-builder/project-info.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/project-summary.html b/hbase-archetypes/hbase-archetype-builder/project-summary.html
index a45b67e..f432d98 100644
--- a/hbase-archetypes/hbase-archetype-builder/project-summary.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -163,7 +163,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/source-repository.html b/hbase-archetypes/hbase-archetype-builder/source-repository.html
index cb5e8a6..bf2b669 100644
--- a/hbase-archetypes/hbase-archetype-builder/source-repository.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-archetype-builder/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/team-list.html b/hbase-archetypes/hbase-archetype-builder/team-list.html
index 180f517..0c89b48 100644
--- a/hbase-archetypes/hbase-archetype-builder/team-list.html
+++ b/hbase-archetypes/hbase-archetype-builder/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/checkstyle.html b/hbase-archetypes/hbase-client-project/checkstyle.html
index 243892a..a566573 100644
--- a/hbase-archetypes/hbase-client-project/checkstyle.html
+++ b/hbase-archetypes/hbase-client-project/checkstyle.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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -150,7 +150,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependencies.html b/hbase-archetypes/hbase-client-project/dependencies.html
index 248f6be..5d728bf 100644
--- a/hbase-archetypes/hbase-client-project/dependencies.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -4184,7 +4184,7 @@ The following provides more details on the included cryptographic software:
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-convergence.html b/hbase-archetypes/hbase-client-project/dependency-convergence.html
index b6049b3..2db024a 100644
--- a/hbase-archetypes/hbase-client-project/dependency-convergence.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-info.html b/hbase-archetypes/hbase-client-project/dependency-info.html
index 2b59e30..183b358 100644
--- a/hbase-archetypes/hbase-client-project/dependency-info.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-management.html b/hbase-archetypes/hbase-client-project/dependency-management.html
index e91685b..da3b72a 100644
--- a/hbase-archetypes/hbase-client-project/dependency-management.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/index.html b/hbase-archetypes/hbase-client-project/index.html
index 11f0e7a..09061f1 100644
--- a/hbase-archetypes/hbase-client-project/index.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/integration.html b/hbase-archetypes/hbase-client-project/integration.html
index 2bd2641..09a323a 100644
--- a/hbase-archetypes/hbase-client-project/integration.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/issue-tracking.html b/hbase-archetypes/hbase-client-project/issue-tracking.html
index 1dd7d66..f584d37 100644
--- a/hbase-archetypes/hbase-client-project/issue-tracking.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/license.html b/hbase-archetypes/hbase-client-project/license.html
index f7dd68c..b5c2bc2 100644
--- a/hbase-archetypes/hbase-client-project/license.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/mail-lists.html b/hbase-archetypes/hbase-client-project/mail-lists.html
index abe647d..0c52610 100644
--- a/hbase-archetypes/hbase-client-project/mail-lists.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/plugin-management.html b/hbase-archetypes/hbase-client-project/plugin-management.html
index 7217d95..2db22cc 100644
--- a/hbase-archetypes/hbase-client-project/plugin-management.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/plugins.html b/hbase-archetypes/hbase-client-project/plugins.html
index ff8cb05..0dfc40f 100644
--- a/hbase-archetypes/hbase-client-project/plugins.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -222,7 +222,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-info.html b/hbase-archetypes/hbase-client-project/project-info.html
index 7810637..032f48a 100644
--- a/hbase-archetypes/hbase-client-project/project-info.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-reports.html b/hbase-archetypes/hbase-client-project/project-reports.html
index bc0561d..8938348 100644
--- a/hbase-archetypes/hbase-client-project/project-reports.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-summary.html b/hbase-archetypes/hbase-client-project/project-summary.html
index 10ec651..eb25085 100644
--- a/hbase-archetypes/hbase-client-project/project-summary.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/source-repository.html b/hbase-archetypes/hbase-client-project/source-repository.html
index 18cc73e..8bc44ae 100644
--- a/hbase-archetypes/hbase-client-project/source-repository.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/team-list.html b/hbase-archetypes/hbase-client-project/team-list.html
index eebcfd9..f02edef 100644
--- a/hbase-archetypes/hbase-client-project/team-list.html
+++ b/hbase-archetypes/hbase-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/checkstyle.html b/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
index 4132974..c206a2b 100644
--- a/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
+++ b/hbase-archetypes/hbase-shaded-client-project/checkstyle.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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -150,7 +150,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependencies.html b/hbase-archetypes/hbase-shaded-client-project/dependencies.html
index 8c186de..00f5159 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependencies.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -4208,7 +4208,7 @@ These include: bzip2, gzip, pack200, xz and ar, cpio, jar, tar, zip, dump.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html b/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
index b31a0f2..c82f9e5 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-info.html b/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
index 4cc980b..4b075ef 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-management.html b/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
index 6fbf14a..2132465 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/index.html b/hbase-archetypes/hbase-shaded-client-project/index.html
index 0f75469..2cad47e 100644
--- a/hbase-archetypes/hbase-shaded-client-project/index.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/integration.html b/hbase-archetypes/hbase-shaded-client-project/integration.html
index cd5e4ba..dfae4e5 100644
--- a/hbase-archetypes/hbase-shaded-client-project/integration.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html b/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
index f774f0e..034ac5f 100644
--- a/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/license.html b/hbase-archetypes/hbase-shaded-client-project/license.html
index 27b0853..b98b021 100644
--- a/hbase-archetypes/hbase-shaded-client-project/license.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/mail-lists.html b/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
index 9580bf7..f9f0cc2 100644
--- a/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/plugin-management.html b/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
index b5c4279..12cf641 100644
--- a/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/plugins.html b/hbase-archetypes/hbase-shaded-client-project/plugins.html
index 4d8ad4a..d4dd1f3 100644
--- a/hbase-archetypes/hbase-shaded-client-project/plugins.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -222,7 +222,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span class="sourc

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
index af42219..a9770f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
@@ -61,32 +61,32 @@
 <span class="sourceLineNo">053</span>import org.apache.hadoop.conf.Configuration;<a name="line.53"></a>
 <span class="sourceLineNo">054</span>import org.apache.hadoop.fs.FileSystem;<a name="line.54"></a>
 <span class="sourceLineNo">055</span>import org.apache.hadoop.fs.Path;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HConstants;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.ServerName;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableName;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.Result;<a name="line.81"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HConstants;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerName;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableName;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.Result;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.82"></a>
 <span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.coprocessor.BypassCoprocessorException;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.84"></a>
@@ -172,45 +172,45 @@
 <span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.replication.regionserver.Replication;<a name="line.164"></a>
 <span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.165"></a>
 <span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.zookeeper.KeeperException;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.eclipse.jetty.server.Server;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.205"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>import org.apache.zookeeper.KeeperException;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>import org.eclipse.jetty.server.Server;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
 <span class="sourceLineNo">206</span>import com.google.protobuf.Descriptors;<a name="line.206"></a>
 <span class="sourceLineNo">207</span>import com.google.protobuf.Service;<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
@@ -1945,14 +1945,14 @@
 <span class="sourceLineNo">1937</span>      }<a name="line.1937"></a>
 <span class="sourceLineNo">1938</span><a name="line.1938"></a>
 <span class="sourceLineNo">1939</span>      // 3. blocking file count<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>      String sbfc = htd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>      if (sbfc != null) {<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sbfc);<a name="line.1942"></a>
+<span class="sourceLineNo">1940</span>      sv = hcd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (sv != null) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sv);<a name="line.1942"></a>
 <span class="sourceLineNo">1943</span>      }<a name="line.1943"></a>
 <span class="sourceLineNo">1944</span>      if (blockingFileCount &lt; 1000) {<a name="line.1944"></a>
 <span class="sourceLineNo">1945</span>        message =<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>            "blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000";<a name="line.1947"></a>
+<span class="sourceLineNo">1946</span>            "Blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000 for column family "+ hcd.getNameAsString();<a name="line.1947"></a>
 <span class="sourceLineNo">1948</span>        throw new IOException(message);<a name="line.1948"></a>
 <span class="sourceLineNo">1949</span>      }<a name="line.1949"></a>
 <span class="sourceLineNo">1950</span>    }<a name="line.1950"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
index 7ee3fb6..9112346 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ServerManager.html
@@ -1036,15 +1036,22 @@
 <span class="sourceLineNo">1028</span>    flushedSequenceIdByRegion.remove(encodedName);<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>  /**<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  public void removeRegions(final List&lt;HRegionInfo&gt; regions) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    for (HRegionInfo hri: regions) {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      removeRegion(hri);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>  }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>}<a name="line.1039"></a>
+<span class="sourceLineNo">1031</span>  @VisibleForTesting<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  public boolean isRegionInServerManagerStates(final HRegionInfo hri) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    final byte[] encodedName = hri.getEncodedNameAsBytes();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    return (storeFlushedSequenceIdsByRegion.containsKey(encodedName)<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || flushedSequenceIdByRegion.containsKey(encodedName));<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>  /**<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>   * Called by delete table and similar to notify the ServerManager that a region was removed.<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>   */<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>  public void removeRegions(final List&lt;HRegionInfo&gt; regions) {<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    for (HRegionInfo hri: regions) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>      removeRegion(hri);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>  }<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>}<a name="line.1046"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
index 6422e20..35a66e0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html
@@ -521,7 +521,7 @@
 <span class="sourceLineNo">513</span>  throws IOException {<a name="line.513"></a>
 <span class="sourceLineNo">514</span>    GetRegionInfoResponse response =<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      Util.getRegionInfoResponse(env, rs.getServerName(), rs.getRegion());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    return response.hasSplittable() &amp;&amp; response.getSplittable();<a name="line.516"></a>
+<span class="sourceLineNo">516</span>    return response.hasMergeable() &amp;&amp; response.getMergeable();<a name="line.516"></a>
 <span class="sourceLineNo">517</span>  }<a name="line.517"></a>
 <span class="sourceLineNo">518</span><a name="line.518"></a>
 <span class="sourceLineNo">519</span>  /**<a name="line.519"></a>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceL

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span class="

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class=

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
index 2c8bb5a..192b7d9 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Mutation.html
@@ -119,464 +119,465 @@
 <span class="sourceLineNo">111</span>    List&lt;Cell&gt; list = this.familyMap.get(family);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    if (list == null) {<a name="line.112"></a>
 <span class="sourceLineNo">113</span>      list = new ArrayList&lt;&gt;();<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return list;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /*<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   *<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return new KeyValue(this.row, family, qualifier, ts, KeyValue.Type.Put, value);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * @param family<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * @param qualifier<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @param ts<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param value<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param tags - Specify the Tags as an Array<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tags) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    KeyValue kvWithTag = new KeyValue(this.row, family, qualifier, ts, value, tags);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    return kvWithTag;<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>  /*<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   *<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  KeyValue createPutKeyValue(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      Tag[] tags) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    return new KeyValue(this.row, 0, this.row == null ? 0 : this.row.length,<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        family, 0, family == null ? 0 : family.length,<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        qualifier, ts, KeyValue.Type.Put, value, tags != null ? Arrays.asList(tags) : null);<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>   * Compile the column family (i.e. schema) information<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * into a Map. Useful for parsing and aggregation by debugging,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * logging, and administration tools.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @return Map<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;(this.familyMap.entrySet().size());<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    // ideally, we would also include table information, but that information<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // is not stored in each Operation instance.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    map.put("families", families);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return map;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Useful for debugging, logging, and administration tools.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @return Map<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // we start with the fingerprint map and build on top of it.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    // replace the fingerprint's simple list of families with a<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    // map from column families to lists of qualifiers and kv details<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;&gt; columns = new HashMap&lt;&gt;();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    map.put("families", columns);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    map.put("row", Bytes.toStringBinary(this.row));<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    int colCount = 0;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // iterate through all column families affected<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      // map from this family to details for each cell affected within the family<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      List&lt;Map&lt;String, Object&gt;&gt; qualifierDetails = new ArrayList&lt;&gt;();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      columns.put(Bytes.toStringBinary(entry.getKey()), qualifierDetails);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      colCount += entry.getValue().size();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (maxCols &lt;= 0) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        continue;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      // add details for each cell<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      for (Cell cell: entry.getValue()) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        if (--maxCols &lt;= 0) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          continue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        Map&lt;String, Object&gt; cellMap = cellToStringMap(cell);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        qualifierDetails.add(cellMap);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    map.put("totalColumns", colCount);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // add the id if set<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (getId() != null) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      map.put("id", getId());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // Add the TTL if set<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // Long.MAX_VALUE is the default, and is interpreted to mean this attribute<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // has not been set.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    if (getTTL() != Long.MAX_VALUE) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      map.put("ttl", getTTL());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return map;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private static Map&lt;String, Object&gt; cellToStringMap(Cell c) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    stringMap.put("qualifier", Bytes.toStringBinary(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.223"></a>
-<span class="sourceLineNo">224</span>                c.getQualifierLength()));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    stringMap.put("timestamp", c.getTimestamp());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    stringMap.put("vlen", c.getValueLength());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    List&lt;Tag&gt; tags = CellUtil.getTags(c);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (tags != null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      List&lt;String&gt; tagsString = new ArrayList&lt;&gt;(tags.size());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      for (Tag t : tags) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        tagsString.add((t.getType()) + ":" + Bytes.toStringBinary(TagUtil.cloneValue(t)));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      stringMap.put("tag", tagsString);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    return stringMap;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Set the durability for this mutation<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * @param d<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public Mutation setDurability(Durability d) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.durability = d;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return this;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  /** Get the current durability */<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  public Durability getDurability() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return this.durability;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Method for retrieving the put's familyMap<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @return familyMap<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; getFamilyCellMap() {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return this.familyMap;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * Method for setting the put's familyMap<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  public Mutation setFamilyCellMap(NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; map) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // TODO: Shut this down or move it up to be a Constructor.  Get new object rather than change<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    // this internal data member.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    this.familyMap = map;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return this;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * Method to check if the familyMap is empty<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return true if empty, false otherwise<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public boolean isEmpty() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return familyMap.isEmpty();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * Method for retrieving the delete's row<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return row<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public byte [] getRow() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    return this.row;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  public int compareTo(final Row d) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    return Bytes.compareTo(this.getRow(), d.getRow());<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<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>   * Method for retrieving the timestamp<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * @return timestamp<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public long getTimeStamp() {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    return this.ts;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * Marks that the clusters with the given clusterIds have consumed the mutation<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * @param clusterIds of the clusters that have consumed the mutation<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public Mutation setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    ByteArrayDataOutput out = ByteStreams.newDataOutput();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    out.writeInt(clusterIds.size());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    for (UUID clusterId : clusterIds) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      out.writeLong(clusterId.getMostSignificantBits());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      out.writeLong(clusterId.getLeastSignificantBits());<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    setAttribute(CONSUMED_CLUSTER_IDS, out.toByteArray());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return this;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return the set of clusterIds that have consumed the mutation<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    List&lt;UUID&gt; clusterIds = new ArrayList&lt;&gt;();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    byte[] bytes = getAttribute(CONSUMED_CLUSTER_IDS);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if(bytes != null) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      ByteArrayDataInput in = ByteStreams.newDataInput(bytes);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      int numClusters = in.readInt();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      for(int i=0; i&lt;numClusters; i++){<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        clusterIds.add(new UUID(in.readLong(), in.readLong()));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    return clusterIds;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /**<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * Sets the visibility expression associated with cells in this Mutation.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * It is illegal to set &lt;code&gt;CellVisibility&lt;/code&gt; on &lt;code&gt;Delete&lt;/code&gt; mutation.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @param expression<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public Mutation setCellVisibility(CellVisibility expression) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        toCellVisibility(expression).toByteArray());<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return this;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @return CellVisibility associated with cells in this Mutation.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * @throws DeserializationException<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   */<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  public CellVisibility getCellVisibility() throws DeserializationException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[] cellVisibilityBytes = this.getAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    if (cellVisibilityBytes == null) return null;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    return toCellVisibility(cellVisibilityBytes);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  /**<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * Create a protocol buffer CellVisibility based on a client CellVisibility.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param cellVisibility<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @return a protocol buffer CellVisibility<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  static ClientProtos.CellVisibility toCellVisibility(CellVisibility cellVisibility) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    builder.setExpression(cellVisibility.getExpression());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    return builder.build();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * Convert a protocol buffer CellVisibility to a client CellVisibility<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   *<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @param proto<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @return the converted client CellVisibility<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private static CellVisibility toCellVisibility(ClientProtos.CellVisibility proto) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (proto == null) return null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return new CellVisibility(proto.getExpression());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * Convert a protocol buffer CellVisibility bytes to a client CellVisibility<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @param protoBytes<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @return the converted client CellVisibility<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @throws DeserializationException<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private static CellVisibility toCellVisibility(byte[] protoBytes) throws DeserializationException {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    if (protoBytes == null) return null;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    ClientProtos.CellVisibility proto = null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      ProtobufUtil.mergeFrom(builder, protoBytes);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      proto = builder.build();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    } catch (IOException e) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      throw new DeserializationException(e);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    return toCellVisibility(proto);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>  /**<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * Number of KeyValues carried by this Mutation.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * @return the total number of KeyValues<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  public int size() {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    int size = 0;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    for (List&lt;Cell&gt; cells : this.familyMap.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      size += cells.size();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return size;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  /**<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return the number of different families<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public int numFamilies() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    return familyMap.size();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @return Calculate what Mutation adds to class heap size.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  @Override<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public long heapSize() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    long heapsize = MUTATION_OVERHEAD;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // Adding row<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    heapsize += ClassSize.align(ClassSize.ARRAY + this.row.length);<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Adding map overhead<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    heapsize +=<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      ClassSize.align(this.familyMap.size() * ClassSize.MAP_ENTRY);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      //Adding key overhead<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      heapsize +=<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        ClassSize.align(ClassSize.ARRAY + entry.getKey().length);<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      //This part is kinds tricky since the JVM can reuse references if you<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      //store the same value, but have a good match with SizeOf at the moment<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      //Adding value overhead<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      heapsize += ClassSize.align(ClassSize.ARRAYLIST);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      int size = entry.getValue().size();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      heapsize += ClassSize.align(ClassSize.ARRAY +<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          size * ClassSize.REFERENCE);<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for(Cell cell : entry.getValue()) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        heapsize += CellUtil.estimatedHeapSizeOf(cell);<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>    heapsize += getAttributeSize();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    heapsize += extraHeapSize();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return ClassSize.align(heapsize);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * @return The serialized ACL for this operation, or null if none<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public byte[] getACL() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return getAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @param user User short name<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * @param perms Permissions for the user<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public Mutation setACL(String user, Permission perms) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      AccessControlUtil.toUsersAndPermissions(user, perms).toByteArray());<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return this;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * @param perms A map of permissions for a user or users<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public Mutation setACL(Map&lt;String, Permission&gt; perms) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    ListMultimap&lt;String, Permission&gt; permMap = ArrayListMultimap.create();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    for (Map.Entry&lt;String, Permission&gt; entry : perms.entrySet()) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      permMap.put(entry.getKey(), entry.getValue());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      AccessControlUtil.toUsersAndPermissions(permMap).toByteArray());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    return this;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * Return the TTL requested for the result of the mutation, in milliseconds.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * @return the TTL requested for the result of the mutation, in milliseconds,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * or Long.MAX_VALUE if unset<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  public long getTTL() {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    byte[] ttlBytes = getAttribute(OP_ATTRIBUTE_TTL);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    if (ttlBytes != null) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      return Bytes.toLong(ttlBytes);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    return Long.MAX_VALUE;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  /**<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * Set the TTL desired for the result of the mutation, in milliseconds.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param ttl the TTL desired for the result of the mutation, in milliseconds<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return this<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public Mutation setTTL(long ttl) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    setAttribute(OP_ATTRIBUTE_TTL, Bytes.toBytes(ttl));<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return this;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * @return current value for returnResults<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  // Used by Increment and Append only.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  @InterfaceAudience.Private<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  protected boolean isReturnResults() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    byte[] v = getAttribute(RETURN_RESULTS);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    return v == null ? true : Bytes.toBoolean(v);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  @InterfaceAudience.Private<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  // Used by Increment and Append only.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  protected Mutation setReturnResults(boolean returnResults) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    setAttribute(RETURN_RESULTS, Bytes.toBytes(returnResults));<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    return this;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>  /**<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * Subclasses should override this method to add the heap size of their own fields.<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @return the heap size to add (will be aligned).<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   */<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  protected long extraHeapSize(){<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return 0L;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">114</span>      this.familyMap.put(family, list);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return list;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /*<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return new KeyValue(this.row, family, qualifier, ts, KeyValue.Type.Put, value);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @param family<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * @param qualifier<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param ts<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param value<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param tags - Specify the Tags as an Array<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  KeyValue createPutKeyValue(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tags) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    KeyValue kvWithTag = new KeyValue(this.row, family, qualifier, ts, value, tags);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    return kvWithTag;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  /*<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * Create a KeyValue with this objects row key and the Put identifier.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   *<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @return a KeyValue with this objects row key and the Put identifier.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  KeyValue createPutKeyValue(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      Tag[] tags) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    return new KeyValue(this.row, 0, this.row == null ? 0 : this.row.length,<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        family, 0, family == null ? 0 : family.length,<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        qualifier, ts, KeyValue.Type.Put, value, tags != null ? Arrays.asList(tags) : null);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  /**<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Compile the column family (i.e. schema) information<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * into a Map. Useful for parsing and aggregation by debugging,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * logging, and administration tools.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;(this.familyMap.entrySet().size());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    // ideally, we would also include table information, but that information<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    // is not stored in each Operation instance.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    map.put("families", families);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return map;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Useful for debugging, logging, and administration tools.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * @return Map<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // we start with the fingerprint map and build on top of it.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // replace the fingerprint's simple list of families with a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // map from column families to lists of qualifiers and kv details<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;&gt; columns = new HashMap&lt;&gt;();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    map.put("families", columns);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    map.put("row", Bytes.toStringBinary(this.row));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    int colCount = 0;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // iterate through all column families affected<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // map from this family to details for each cell affected within the family<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      List&lt;Map&lt;String, Object&gt;&gt; qualifierDetails = new ArrayList&lt;&gt;();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      columns.put(Bytes.toStringBinary(entry.getKey()), qualifierDetails);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      colCount += entry.getValue().size();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      if (maxCols &lt;= 0) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        continue;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // add details for each cell<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      for (Cell cell: entry.getValue()) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        if (--maxCols &lt;= 0) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          continue;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        Map&lt;String, Object&gt; cellMap = cellToStringMap(cell);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        qualifierDetails.add(cellMap);<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>    map.put("totalColumns", colCount);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    // add the id if set<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    if (getId() != null) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      map.put("id", getId());<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // Add the TTL if set<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // Long.MAX_VALUE is the default, and is interpreted to mean this attribute<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    // has not been set.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    if (getTTL() != Long.MAX_VALUE) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      map.put("ttl", getTTL());<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return map;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private static Map&lt;String, Object&gt; cellToStringMap(Cell c) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    stringMap.put("qualifier", Bytes.toStringBinary(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>                c.getQualifierLength()));<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    stringMap.put("timestamp", c.getTimestamp());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    stringMap.put("vlen", c.getValueLength());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    List&lt;Tag&gt; tags = CellUtil.getTags(c);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (tags != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      List&lt;String&gt; tagsString = new ArrayList&lt;&gt;(tags.size());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      for (Tag t : tags) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        tagsString.add((t.getType()) + ":" + Bytes.toStringBinary(TagUtil.cloneValue(t)));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      stringMap.put("tag", tagsString);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return stringMap;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Set the durability for this mutation<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * @param d<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  public Mutation setDurability(Durability d) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    this.durability = d;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return this;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /** Get the current durability */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public Durability getDurability() {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    return this.durability;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  /**<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * Method for retrieving the put's familyMap<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @return familyMap<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; getFamilyCellMap() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    return this.familyMap;<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>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Method for setting the put's familyMap<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public Mutation setFamilyCellMap(NavigableMap&lt;byte [], List&lt;Cell&gt;&gt; map) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // TODO: Shut this down or move it up to be a Constructor.  Get new object rather than change<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // this internal data member.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.familyMap = map;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return this;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * Method to check if the familyMap is empty<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @return true if empty, false otherwise<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   */<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public boolean isEmpty() {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return familyMap.isEmpty();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * Method for retrieving the delete's row<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @return row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  public byte [] getRow() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return this.row;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public int compareTo(final Row d) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return Bytes.compareTo(this.getRow(), d.getRow());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * Method for retrieving the timestamp<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @return timestamp<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   */<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public long getTimeStamp() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return this.ts;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Marks that the clusters with the given clusterIds have consumed the mutation<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param clusterIds of the clusters that have consumed the mutation<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Mutation setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    ByteArrayDataOutput out = ByteStreams.newDataOutput();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    out.writeInt(clusterIds.size());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    for (UUID clusterId : clusterIds) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      out.writeLong(clusterId.getMostSignificantBits());<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      out.writeLong(clusterId.getLeastSignificantBits());<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    setAttribute(CONSUMED_CLUSTER_IDS, out.toByteArray());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return this;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return the set of clusterIds that have consumed the mutation<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    List&lt;UUID&gt; clusterIds = new ArrayList&lt;&gt;();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    byte[] bytes = getAttribute(CONSUMED_CLUSTER_IDS);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if(bytes != null) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      ByteArrayDataInput in = ByteStreams.newDataInput(bytes);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      int numClusters = in.readInt();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      for(int i=0; i&lt;numClusters; i++){<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        clusterIds.add(new UUID(in.readLong(), in.readLong()));<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 clusterIds;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * Sets the visibility expression associated with cells in this Mutation.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * It is illegal to set &lt;code&gt;CellVisibility&lt;/code&gt; on &lt;code&gt;Delete&lt;/code&gt; mutation.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param expression<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public Mutation setCellVisibility(CellVisibility expression) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        toCellVisibility(expression).toByteArray());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    return this;<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>   * @return CellVisibility associated with cells in this Mutation.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @throws DeserializationException<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  public CellVisibility getCellVisibility() throws DeserializationException {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[] cellVisibilityBytes = this.getAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    if (cellVisibilityBytes == null) return null;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    return toCellVisibility(cellVisibilityBytes);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  /**<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * Create a protocol buffer CellVisibility based on a client CellVisibility.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   *<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @param cellVisibility<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @return a protocol buffer CellVisibility<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  static ClientProtos.CellVisibility toCellVisibility(CellVisibility cellVisibility) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    builder.setExpression(cellVisibility.getExpression());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return builder.build();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * Convert a protocol buffer CellVisibility to a client CellVisibility<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * @param proto<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return the converted client CellVisibility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private static CellVisibility toCellVisibility(ClientProtos.CellVisibility proto) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    if (proto == null) return null;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new CellVisibility(proto.getExpression());<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Convert a protocol buffer CellVisibility bytes to a client CellVisibility<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param protoBytes<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @return the converted client CellVisibility<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @throws DeserializationException<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  private static CellVisibility toCellVisibility(byte[] protoBytes) throws DeserializationException {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    if (protoBytes == null) return null;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    ClientProtos.CellVisibility proto = null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    try {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      ProtobufUtil.mergeFrom(builder, protoBytes);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      proto = builder.build();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    } catch (IOException e) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      throw new DeserializationException(e);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return toCellVisibility(proto);<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>   * Number of KeyValues carried by this Mutation.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @return the total number of KeyValues<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public int size() {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    int size = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    for (List&lt;Cell&gt; cells : this.familyMap.values()) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      size += cells.size();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return size;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  /**<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @return the number of different families<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public int numFamilies() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return familyMap.size();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * @return Calculate what Mutation adds to class heap size.<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Override<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public long heapSize() {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    long heapsize = MUTATION_OVERHEAD;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Adding row<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    heapsize += ClassSize.align(ClassSize.ARRAY + this.row.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Adding map overhead<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    heapsize +=<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      ClassSize.align(this.familyMap.size() * ClassSize.MAP_ENTRY);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry : this.familyMap.entrySet()) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      //Adding key overhead<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      heapsize +=<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        ClassSize.align(ClassSize.ARRAY + entry.getKey().length);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      //This part is kinds tricky since the JVM can reuse references if you<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      //store the same value, but have a good match with SizeOf at the moment<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      //Adding value overhead<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      heapsize += ClassSize.align(ClassSize.ARRAYLIST);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      int size = entry.getValue().size();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      heapsize += ClassSize.align(ClassSize.ARRAY +<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          size * ClassSize.REFERENCE);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for(Cell cell : entry.getValue()) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        heapsize += CellUtil.estimatedHeapSizeOf(cell);<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>    heapsize += getAttributeSize();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    heapsize += extraHeapSize();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return ClassSize.align(heapsize);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * @return The serialized ACL for this operation, or null if none<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   */<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public byte[] getACL() {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    return getAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  /**<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   * @param user User short name<a name="line.457"></a>
+<span class="sourceLineNo">458</span>   * @param perms Permissions for the user<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   */<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  public Mutation setACL(String user, Permission perms) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      AccessControlUtil.toUsersAndPermissions(user, perms).toByteArray());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    return this;<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>  /**<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * @param perms A map of permissions for a user or users<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  public Mutation setACL(Map&lt;String, Permission&gt; perms) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    ListMultimap&lt;String, Permission&gt; permMap = ArrayListMultimap.create();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    for (Map.Entry&lt;String, Permission&gt; entry : perms.entrySet()) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      permMap.put(entry.getKey(), entry.getValue());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL,<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      AccessControlUtil.toUsersAndPermissions(permMap).toByteArray());<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    return this;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
+<span class="sourceLineNo">478</span><a name="line.478"></a>
+<span class="sourceLineNo">479</span>  /**<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Return the TTL requested for the result of the mutation, in milliseconds.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return the TTL requested for the result of the mutation, in milliseconds,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * or Long.MAX_VALUE if unset<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   */<a name="line.483"></a>
+<span class="sourceLineNo">484</span>  public long getTTL() {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    byte[] ttlBytes = getAttribute(OP_ATTRIBUTE_TTL);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    if (ttlBytes != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      return Bytes.toLong(ttlBytes);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    return Long.MAX_VALUE;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  }<a name="line.490"></a>
+<span class="sourceLineNo">491</span><a name="line.491"></a>
+<span class="sourceLineNo">492</span>  /**<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * Set the TTL desired for the result of the mutation, in milliseconds.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param ttl the TTL desired for the result of the mutation, in milliseconds<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @return this<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public Mutation setTTL(long ttl) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    setAttribute(OP_ATTRIBUTE_TTL, Bytes.toBytes(ttl));<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return this;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * @return current value for returnResults<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  // Used by Increment and Append only.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>  @InterfaceAudience.Private<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  protected boolean isReturnResults() {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    byte[] v = getAttribute(RETURN_RESULTS);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    return v == null ? true : Bytes.toBoolean(v);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  @InterfaceAudience.Private<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  // Used by Increment and Append only.<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  protected Mutation setReturnResults(boolean returnResults) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    setAttribute(RETURN_RESULTS, Bytes.toBytes(returnResults));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return this;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Subclasses should override this method to add the heap size of their own fields.<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * @return the heap size to add (will be aligned).<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  protected long extraHeapSize(){<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    return 0L;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
 <span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * @param row Row to check<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  static byte [] checkRow(final byte [] row) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return checkRow(row, 0, row == null? 0: row.length);<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>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * @param row Row to check<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * @param offset<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * @param length<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static byte [] checkRow(final byte [] row, final int offset, final int length) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    if (row == null) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    if (length == 0) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    if (length &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      throw new IllegalArgumentException("Row length " + length + " is &gt; " +<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        HConstants.MAX_ROW_LENGTH);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    return row;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>  static void checkRow(ByteBuffer row) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (row == null) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (row.remaining() == 0) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (row.remaining() &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      throw new IllegalArgumentException("Row length " + row.remaining() + " is &gt; " +<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HConstants.MAX_ROW_LENGTH);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>}<a name="line.571"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  /**<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * @param row Row to check<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  static byte [] checkRow(final byte [] row) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    return checkRow(row, 0, row == null? 0: row.length);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>   * @param row Row to check<a name="line.539"></a>
+<span class="sourceLineNo">540</span>   * @param offset<a name="line.540"></a>
+<span class="sourceLineNo">541</span>   * @param length<a name="line.541"></a>
+<span class="sourceLineNo">542</span>   * @throws IllegalArgumentException Thrown if &lt;code&gt;row&lt;/code&gt; is empty or null or<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * &amp;gt; {@link HConstants#MAX_ROW_LENGTH}<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * @return &lt;code&gt;row&lt;/code&gt;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   */<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  static byte [] checkRow(final byte [] row, final int offset, final int length) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    if (row == null) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (length == 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    if (length &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      throw new IllegalArgumentException("Row length " + length + " is &gt; " +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        HConstants.MAX_ROW_LENGTH);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    return row;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>  static void checkRow(ByteBuffer row) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    if (row == null) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      throw new IllegalArgumentException("Row buffer is null");<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    if (row.remaining() == 0) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      throw new IllegalArgumentException("Row length is 0");<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    if (row.remaining() &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      throw new IllegalArgumentException("Row length " + row.remaining() + " is &gt; " +<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HConstants.MAX_ROW_LENGTH);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
+<span class="sourceLineNo">572</span>}<a name="line.572"></a>
 
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/client/Increment.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/Increment.html b/devapidocs/org/apache/hadoop/hbase/client/Increment.html
index 01308c9..4e221bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/Increment.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/Increment.html
@@ -513,7 +513,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.119">addColumn</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.118">addColumn</a>(byte[]&nbsp;family,
                            byte[]&nbsp;qualifier,
                            long&nbsp;amount)</pre>
 <div class="block">Increment the column from the specific family with the specified qualifier
@@ -536,7 +536,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.134">getTimeRange</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.132">getTimeRange</a>()</pre>
 <div class="block">Gets the TimeRange used for this increment.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -550,7 +550,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.152">setTimeRange</a>(long&nbsp;minStamp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.150">setTimeRange</a>(long&nbsp;minStamp,
                               long&nbsp;maxStamp)
                        throws <a href="http://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">Sets the TimeRange to be used on the Get for this increment.
@@ -578,7 +578,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setReturnResults</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.163">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.161">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setReturnResults-boolean-">setReturnResults</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -595,7 +595,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>isReturnResults</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.172">isReturnResults</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.170">isReturnResults</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#isReturnResults--">isReturnResults</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -610,7 +610,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>numFamilies</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.181">numFamilies</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.179">numFamilies</a>()</pre>
 <div class="block">Method for retrieving the number of families to increment from</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -626,7 +626,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>hasFamilies</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.189">hasFamilies</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.187">hasFamilies</a>()</pre>
 <div class="block">Method for checking if any families have been inserted into this Increment</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -640,7 +640,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyMapOfLongs</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.201">getFamilyMapOfLongs</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.199">getFamilyMapOfLongs</a>()</pre>
 <div class="block">Before 0.95, when you called Increment#getFamilyMap(), you got back
  a map of families to a list of Longs.  Now, <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#getFamilyCellMap--"><code>Mutation.getFamilyCellMap()</code></a> returns
  families by list of Cells.  This method has been added so you can have the
@@ -659,7 +659,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.219">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.217">toString</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Operation.html#toString--">Operation</a></code></span></div>
 <div class="block">Produces a string representation of this Operation. It defaults to a JSON
  representation, but falls back to a string representation of the
@@ -678,7 +678,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.261">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;i)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.259">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;i)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://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="http://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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;</code></dd>
@@ -693,7 +693,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.267">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.265">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -706,7 +706,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.274">equals</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.272">equals</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -719,7 +719,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>extraHeapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.287">extraHeapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.285">extraHeapSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#extraHeapSize--">Mutation</a></code></span></div>
 <div class="block">Subclasses should override this method to add the heap size of their own fields.</div>
 <dl>
@@ -736,7 +736,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setAttribute</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.292">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.290">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                               byte[]&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Attributes.html#setAttribute-java.lang.String-byte:A-">Attributes</a></code></span></div>
 <div class="block">Sets an attribute.
@@ -759,7 +759,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.297">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.295">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setId-java.lang.String-">OperationWithAttributes</a></code></span></div>
 <div class="block">This method allows you to set an identifier on an operation. The original
  motivation for this was to allow the identifier to be used in slow query
@@ -780,7 +780,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.302">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.300">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setDurability-org.apache.hadoop.hbase.client.Durability-">Mutation</a></code></span></div>
 <div class="block">Set the durability for this mutation</div>
 <dl>
@@ -795,7 +795,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.307">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.305">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setFamilyCellMap-java.util.NavigableMap-">Mutation</a></code></span></div>
 <div class="block">Method for setting the put's familyMap</div>
 <dl>
@@ -810,7 +810,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.312">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.310">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setClusterIds-java.util.List-">Mutation</a></code></span></div>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
@@ -827,7 +827,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.317">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.315">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setCellVisibility-org.apache.hadoop.hbase.security.visibility.CellVisibility-">Mutation</a></code></span></div>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
@@ -843,7 +843,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.322">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.320">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                         <a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -860,7 +860,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.327">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.325">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setACL-java.util.Map-">setACL</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -875,7 +875,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.332">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.330">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setTTL-long-">Mutation</a></code></span></div>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>
@@ -894,7 +894,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setPriority</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.337">setPriority</a>(int&nbsp;priority)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.335">setPriority</a>(int&nbsp;priority)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setPriority-int-">setPriority</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html" title="class in org.apache.hadoop.hbase.client">OperationWithAttributes</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/client/Mutation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/Mutation.html b/devapidocs/org/apache/hadoop/hbase/client/Mutation.html
index 95cc783..2ca073a 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/Mutation.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/Mutation.html
@@ -613,7 +613,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>createPutKeyValue</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.123">createPutKeyValue</a>(byte[]&nbsp;family,
+<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.124">createPutKeyValue</a>(byte[]&nbsp;family,
                            byte[]&nbsp;qualifier,
                            long&nbsp;ts,
                            byte[]&nbsp;value)</pre>
@@ -625,7 +625,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>createPutKeyValue</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.136">createPutKeyValue</a>(byte[]&nbsp;family,
+<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.137">createPutKeyValue</a>(byte[]&nbsp;family,
                            byte[]&nbsp;qualifier,
                            long&nbsp;ts,
                            byte[]&nbsp;value,
@@ -649,7 +649,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>createPutKeyValue</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.146">createPutKeyValue</a>(byte[]&nbsp;family,
+<pre><a href="../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase">KeyValue</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.147">createPutKeyValue</a>(byte[]&nbsp;family,
                            <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                            long&nbsp;ts,
                            <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value,
@@ -662,7 +662,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFingerprint</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.160">getFingerprint</a>()</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.161">getFingerprint</a>()</pre>
 <div class="block">Compile the column family (i.e. schema) information
  into a Map. Useful for parsing and aggregation by debugging,
  logging, and administration tools.</div>
@@ -680,7 +680,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toMap</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.180">toMap</a>(int&nbsp;maxCols)</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.181">toMap</a>(int&nbsp;maxCols)</pre>
 <div class="block">Compile the details beyond the scope of getFingerprint (row, columns,
  timestamps, etc.) into a Map along with the fingerprinted information.
  Useful for debugging, logging, and administration tools.</div>
@@ -700,7 +700,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>cellToStringMap</h4>
-<pre>private static&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.221">cellToStringMap</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</pre>
+<pre>private static&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.222">cellToStringMap</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</pre>
 </li>
 </ul>
 <a name="setDurability-org.apache.hadoop.hbase.client.Durability-">
@@ -709,7 +709,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.242">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.243">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block">Set the durability for this mutation</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -723,7 +723,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.248">getDurability</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.249">getDurability</a>()</pre>
 <div class="block">Get the current durability</div>
 </li>
 </ul>
@@ -733,7 +733,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyCellMap</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.256">getFamilyCellMap</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.257">getFamilyCellMap</a>()</pre>
 <div class="block">Method for retrieving the put's familyMap</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -747,7 +747,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.263">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.264">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block">Method for setting the put's familyMap</div>
 </li>
 </ul>
@@ -757,7 +757,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.274">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.275">isEmpty</a>()</pre>
 <div class="block">Method to check if the familyMap is empty</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -771,7 +771,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getRow</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.283">getRow</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.284">getRow</a>()</pre>
 <div class="block">Method for retrieving the delete's row</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -787,7 +787,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.288">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;d)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.289">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;d)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://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="http://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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;</code></dd>
@@ -800,7 +800,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeStamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.296">getTimeStamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.297">getTimeStamp</a>()</pre>
 <div class="block">Method for retrieving the timestamp</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -814,7 +814,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.304">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.305">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -828,7 +828,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterIds</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.318">getClusterIds</a>()</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.319">getClusterIds</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the set of clusterIds that have consumed the mutation</dd>
@@ -841,7 +841,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.336">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.337">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
 <dl>
@@ -856,7 +856,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.346">getCellVisibility</a>()
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.347">getCellVisibility</a>()
                                  throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/DeserializationException.html" title="class in org.apache.hadoop.hbase.exceptions">DeserializationException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -872,7 +872,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toCellVisibility</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CellVisibility&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.358">toCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;cellVisibility)</pre>
+<pre>static&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CellVisibility&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.359">toCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;cellVisibility)</pre>
 <div class="block">Create a protocol buffer CellVisibility based on a client CellVisibility.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -888,7 +888,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toCellVisibility</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.370">toCellVisibility</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CellVisibility&nbsp;proto)</pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.371">toCellVisibility</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CellVisibility&nbsp;proto)</pre>
 <div class="block">Convert a protocol buffer CellVisibility to a client CellVisibility</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -904,7 +904,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toCellVisibility</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.382">toCellVisibility</a>(byte[]&nbsp;protoBytes)
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.383">toCellVisibility</a>(byte[]&nbsp;protoBytes)
                                         throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/DeserializationException.html" title="class in org.apache.hadoop.hbase.exceptions">DeserializationException</a></pre>
 <div class="block">Convert a protocol buffer CellVisibility bytes to a client CellVisibility</div>
 <dl>
@@ -923,7 +923,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.399">size</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.400">size</a>()</pre>
 <div class="block">Number of KeyValues carried by this Mutation.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -937,7 +937,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>numFamilies</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.410">numFamilies</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.411">numFamilies</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of different families</dd>
@@ -950,7 +950,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.418">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.419">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize--">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -965,7 +965,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getACL</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.451">getACL</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.452">getACL</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The serialized ACL for this operation, or null if none</dd>
@@ -978,7 +978,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.459">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.460">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                        <a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&nbsp;perms)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -993,7 +993,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.468">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.469">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>perms</code> - A map of permissions for a user or users</dd>
@@ -1006,7 +1006,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTTL</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.483">getTTL</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.484">getTTL</a>()</pre>
 <div class="block">Return the TTL requested for the result of the mutation, in milliseconds.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1021,7 +1021,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.496">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.497">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1038,7 +1038,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <li class="blockList">
 <h4>isReturnResults</h4>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.506">isReturnResults</a>()</pre>
+protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.507">isReturnResults</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>current value for returnResults</dd>
@@ -1052,7 +1052,7 @@ protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/h
 <li class="blockList">
 <h4>setReturnResults</h4>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.513">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
+protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.514">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
 </li>
 </ul>
 <a name="extraHeapSize--">
@@ -1061,7 +1061,7 @@ protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.h
 <ul class="blockList">
 <li class="blockList">
 <h4>extraHeapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.522">extraHeapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.523">extraHeapSize</a>()</pre>
 <div class="block">Subclasses should override this method to add the heap size of their own fields.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1075,7 +1075,7 @@ protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.h
 <ul class="blockList">
 <li class="blockList">
 <h4>checkRow</h4>
-<pre>static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.533">checkRow</a>(byte[]&nbsp;row)</pre>
+<pre>static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.534">checkRow</a>(byte[]&nbsp;row)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>row</code> - Row to check</dd>
@@ -1093,7 +1093,7 @@ protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.h
 <ul class="blockList">
 <li class="blockList">
 <h4>checkRow</h4>
-<pre>static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.545">checkRow</a>(byte[]&nbsp;row,
+<pre>static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.546">checkRow</a>(byte[]&nbsp;row,
                        int&nbsp;offset,
                        int&nbsp;length)</pre>
 <dl>
@@ -1115,7 +1115,7 @@ protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkRow</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.559">checkRow</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;row)</pre>
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.560">checkRow</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/client/Put.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/Put.html b/devapidocs/org/apache/hadoop/hbase/client/Put.html
index 2a09e00..5618db4 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/Put.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/Put.html
@@ -728,7 +728,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>addImmutable</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.228">addImmutable</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.227">addImmutable</a>(byte[]&nbsp;family,
                         byte[]&nbsp;qualifier,
                         long&nbsp;ts,
                         byte[]&nbsp;value)</pre>
@@ -744,7 +744,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <li class="blockList">
 <h4>addImmutable</h4>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.252">addImmutable</a>(byte[]&nbsp;family,
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.250">addImmutable</a>(byte[]&nbsp;family,
                                                    byte[]&nbsp;qualifier,
                                                    long&nbsp;ts,
                                                    byte[]&nbsp;value,
@@ -762,7 +762,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <li class="blockList">
 <h4>addImmutable</h4>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.267">addImmutable</a>(byte[]&nbsp;family,
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.264">addImmutable</a>(byte[]&nbsp;family,
                                                    <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                                                    long&nbsp;ts,
                                                    <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value,
@@ -779,7 +779,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.289">addColumn</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.285">addColumn</a>(byte[]&nbsp;family,
                      <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                      long&nbsp;ts,
                      <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value)</pre>
@@ -802,7 +802,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>addImmutable</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.305">addImmutable</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.300">addImmutable</a>(byte[]&nbsp;family,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                         long&nbsp;ts,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value)</pre>
@@ -817,7 +817,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.324">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.318">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
         throws <a href="http://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">Add the specified KeyValue to this Put operation.  Operation assumes that
  the passed KeyValue is immutable and its backing array will not be modified
@@ -838,7 +838,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.347">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.340">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
  a value assigned to the given family &amp; qualifier.
@@ -859,7 +859,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.362">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.355">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    long&nbsp;ts)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
@@ -882,7 +882,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.377">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.370">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    byte[]&nbsp;value)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
@@ -905,7 +905,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.393">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.386">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    long&nbsp;ts,
                    byte[]&nbsp;value)</pre>
@@ -930,7 +930,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.411">has</a>(byte[]&nbsp;family,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.404">has</a>(byte[]&nbsp;family,
                     byte[]&nbsp;qualifier,
                     long&nbsp;ts,
                     byte[]&nbsp;value,
@@ -944,7 +944,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.464">get</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.457">get</a>(byte[]&nbsp;family,
                       byte[]&nbsp;qualifier)</pre>
 <div class="block">Returns a list of all KeyValue objects with matching column family and qualifier.</div>
 <dl>
@@ -963,7 +963,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setAttribute</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.475">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.468">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                         byte[]&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Attributes.html#setAttribute-java.lang.String-byte:A-">Attributes</a></code></span></div>
 <div class="block">Sets an attribute.
@@ -986,7 +986,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.480">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.473">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setId-java.lang.String-">OperationWithAttributes</a></code></span></div>
 <div class="block">This method allows you to set an identifier on an operation. The original
  motivation for this was to allow the identifier to be used in slow query
@@ -1007,7 +1007,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.485">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.478">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setDurability-org.apache.hadoop.hbase.client.Durability-">Mutation</a></code></span></div>
 <div class="block">Set the durability for this mutation</div>
 <dl>
@@ -1022,7 +1022,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.490">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.483">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setFamilyCellMap-java.util.NavigableMap-">Mutation</a></code></span></div>
 <div class="block">Method for setting the put's familyMap</div>
 <dl>
@@ -1037,7 +1037,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.495">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.488">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setClusterIds-java.util.List-">Mutation</a></code></span></div>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
@@ -1054,7 +1054,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.500">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.493">setCellVisibility</a>(<a href="../../../../../org/apache/hadoop/hbase/security/visibility/CellVisibility.html" title="class in org.apache.hadoop.hbase.security.visibility">CellVisibility</a>&nbsp;expression)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setCellVisibility-org.apache.hadoop.hbase.security.visibility.CellVisibility-">Mutation</a></code></span></div>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
@@ -1070,7 +1070,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.505">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.498">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                   <a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -1087,7 +1087,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.510">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.503">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/security/access/Permission.html" title="class in org.apache.hadoop.hbase.security.access">Permission</a>&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setACL-java.util.Map-">setACL</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -1102,7 +1102,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.515">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.508">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setTTL-long-">Mutation</a></code></span></div>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 91dea2e..823db9c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -1820,82 +1820,86 @@
 <td class="colLast"><span class="typeNameLabel">TestDeadServer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestDeadServer.html#TEST_UTIL">TEST_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">TestCatalogJanitorInMemoryStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#TEST_UTIL">TEST_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">TestRegionPlacement2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement2.html#TEST_UTIL">TEST_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">TestAssignmentManagerMetrics.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestMasterMetricsWrapper.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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">TestTableStateManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestTableStateManager.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html#TEST_UTIL">TEST_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">TestMasterBalanceThrottling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestMasterMetrics.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetrics.html#TEST_UTIL">TEST_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">TestActiveMasterManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestActiveMasterManager.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestSplitLogManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestSplitLogManager.html#TEST_UTIL">TEST_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">TestAssignmentListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestAssignmentListener.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestRegionPlacement.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement.html#TEST_UTIL">TEST_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">TestHMasterCommandLine.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterCommandLine.html#TESTING_UTIL">TESTING_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <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">TestHMasterRPCException.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterRPCException.html#testUtil">testUtil</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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">TestGetInfoPort.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetInfoPort.html#testUtil">testUtil</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <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">TestGetLastFlushedSequenceId.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetLastFlushedSequenceId.html#testUtil">testUtil</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">TestMasterNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterNoCluster.html#TESTUTIL">TESTUTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestMasterFileSystemWithWALDir.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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">TestRestartCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestRestartCluster.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestMasterWalManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterWalManager.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">TestMasterFileSystem.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystem.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index b89116f..e6bc9ca 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitor.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitor.html
index 31423bc..42da772 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitor.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestCatalogJanitor.html" target="_top">Frames</a></li>
@@ -676,7 +676,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestCatalogJanitor.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
new file mode 100644
index 0000000..d5d3685
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
@@ -0,0 +1,483 @@
+<!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>TestCatalogJanitorInMemoryStates (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="TestCatalogJanitorInMemoryStates (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":10,"i2":9,"i3":10,"i4":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/TestCatalogJanitorInMemoryStates.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/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" target="_top">Frames</a></li>
+<li><a href="TestCatalogJanitorInMemoryStates.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</div>
+<h2 title="Class TestCatalogJanitorInMemoryStates" class="title">Class TestCatalogJanitorInMemoryStates</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="http://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.TestCatalogJanitorInMemoryStates</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/TestCatalogJanitorInMemoryStates.html#line.56">TestCatalogJanitorInMemoryStates</a>
+extends <a href="http://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>
+</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/TestCatalogJanitorInMemoryStates.html#FAMILY">FAMILY</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.commons.logging.Log</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>org.junit.rules.TestName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#name">name</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#QUALIFIER">QUALIFIER</a></span></code>&nbsp;</td>
+</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/TestCatalogJanitorInMemoryStates.html#ROW">ROW</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"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>org.junit.rules.TestRule</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#timeout">timeout</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#VALUE">VALUE</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/TestCatalogJanitorInMemoryStates.html#TestCatalogJanitorInMemoryStates--">TestCatalogJanitorInMemoryStates</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/TestCatalogJanitorInMemoryStates.html#setUpBeforeClass--">setUpBeforeClass</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>private <a href="http://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.HRegionLocation&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-">splitRegion</a></span>(org.apache.hadoop.hbase.HRegionInfo&nbsp;r)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#tearDownAfterClass--">tearDownAfterClass</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/master/TestCatalogJanitorInMemoryStates.html#testInMemoryParentCleanup--">testInMemoryParentCleanup</a></span>()</code>
+<div class="block">Test clearing a split parent from memory.</div>
+</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.util.PairOfSameType&lt;org.apache.hadoop.hbase.HRegionInfo&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#waitOnDaughters-org.apache.hadoop.hbase.HRegionInfo-">waitOnDaughters</a></span>(org.apache.hadoop.hbase.HRegionInfo&nbsp;r)</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="http://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="http://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="http://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="http://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="http://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="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang
 /Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="http://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="http://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="http://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="http://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="LOG">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>LOG</h4>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.57">LOG</a></pre>
+</li>
+</ul>
+<a name="timeout">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>timeout</h4>
+<pre>public final&nbsp;org.junit.rules.TestRule <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.58">timeout</a></pre>
+</li>
+</ul>
+<a name="name">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>name</h4>
+<pre>public final&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.60">name</a></pre>
+</li>
+</ul>
+<a name="TEST_UTIL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TEST_UTIL</h4>
+<pre>protected static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.61">TEST_UTIL</a></pre>
+</li>
+</ul>
+<a name="ROW">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>ROW</h4>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.62">ROW</a></pre>
+</li>
+</ul>
+<a name="FAMILY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY</h4>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.63">FAMILY</a></pre>
+</li>
+</ul>
+<a name="QUALIFIER">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>QUALIFIER</h4>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.64">QUALIFIER</a></pre>
+</li>
+</ul>
+<a name="VALUE">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>VALUE</h4>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.65">VALUE</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="TestCatalogJanitorInMemoryStates--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestCatalogJanitorInMemoryStates</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.56">TestCatalogJanitorInMemoryStates</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="setUpBeforeClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUpBeforeClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.71">setUpBeforeClass</a>()
+                             throws <a href="http://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="http://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="tearDownAfterClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDownAfterClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.80">tearDownAfterClass</a>()
+                               throws <a href="http://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="http://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="testInMemoryParentCleanup--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testInMemoryParentCleanup</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.88">testInMemoryParentCleanup</a>()
+                               throws <a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
+<div class="block">Test clearing a split parent from memory.</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="splitRegion-org.apache.hadoop.hbase.HRegionInfo-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>splitRegion</h4>
+<pre>private&nbsp;<a href="http://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.HRegionLocation&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.132">splitRegion</a>(org.apache.hadoop.hbase.HRegionInfo&nbsp;r)
+                                                           throws <a href="http://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="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="waitOnDaughters-org.apache.hadoop.hbase.HRegionInfo-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>waitOnDaughters</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.util.PairOfSameType&lt;org.apache.hadoop.hbase.HRegionInfo&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#line.157">waitOnDaughters</a>(org.apache.hadoop.hbase.HRegionInfo&nbsp;r)
+                                                                                                  throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</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/TestCatalogJanitorInMemoryStates.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/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" target="_top">Frames</a></li>
+<li><a href="TestCatalogJanitorInMemoryStates.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;2017 <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/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/TestClockSkewDetection.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestClockSkewDetection.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestClockSkewDetection.html
index fe3c563..3840989 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestClockSkewDetection.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestClockSkewDetection.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -267,7 +267,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
index cf8ac85..5923233 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.596">TestAssignmentManager.FaultyRsExecutor</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.595">TestAssignmentManager.FaultyRsExecutor</a>
 extends <a href="http://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/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a></pre>
 </li>
@@ -207,7 +207,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>exception</h4>
-<pre>private final&nbsp;<a href="http://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="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.597">exception</a></pre>
+<pre>private final&nbsp;<a href="http://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="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.596">exception</a></pre>
 </li>
 </ul>
 </li>
@@ -224,7 +224,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FaultyRsExecutor</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.599">FaultyRsExecutor</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;exception)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.598">FaultyRsExecutor</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;exception)</pre>
 </li>
 </ul>
 </li>
@@ -241,7 +241,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.603">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.FaultyRsExecutor.html#line.602">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;req)
                                                                                                     throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
index 9cd1b1c..f349501 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html
@@ -126,7 +126,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.560">TestAssignmentManager.GoodRsExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.559">TestAssignmentManager.GoodRsExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.NoopRsExecutor</a></pre>
 </li>
 </ul>
@@ -210,7 +210,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>GoodRsExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.560">GoodRsExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.559">GoodRsExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>execOpenRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.562">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.561">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                                              org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo&nbsp;openReq)
                                                                                                                       throws <a href="http://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>
@@ -244,7 +244,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execCloseRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.581">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html#line.580">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                             byte[]&nbsp;regionName)
                                                                                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
index a0b1ab9..b5f215d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
@@ -116,7 +116,7 @@
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.792">TestAssignmentManager.GoodSplitExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.791">TestAssignmentManager.GoodSplitExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.NoopRsExecutor</a></pre>
 </li>
 </ul>
@@ -183,7 +183,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>GoodSplitExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html#line.792">GoodSplitExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html#line.791">GoodSplitExecutor</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
index 3a828ad..47fac9a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.672">TestAssignmentManager.HangOnCloseThenRSCrashExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.671">TestAssignmentManager.HangOnCloseThenRSCrashExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.GoodRsExecutor</a></pre>
 </li>
 </ul>
@@ -236,7 +236,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>TYPES_OF_FAILURE</h4>
-<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.673">TYPES_OF_FAILURE</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.672">TYPES_OF_FAILURE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.assignment.TestAssignmentManager.HangOnCloseThenRSCrashExecutor.TYPES_OF_FAILURE">Constant Field Values</a></dd>
@@ -249,7 +249,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>invocations</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.674">invocations</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.673">invocations</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HangOnCloseThenRSCrashExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.672">HangOnCloseThenRSCrashExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.671">HangOnCloseThenRSCrashExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -283,7 +283,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execCloseRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.677">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangOnCloseThenRSCrashExecutor.html#line.676">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                             byte[]&nbsp;regionName)
                                                                                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
index a816228..60bc0e3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.648">TestAssignmentManager.HangThenRSCrashExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.647">TestAssignmentManager.HangThenRSCrashExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.GoodRsExecutor</a></pre>
 <div class="block">Takes open request and then returns nothing so acts like a RS that went zombie.
  No response (so proc is stuck/suspended on the Master and won't wake up.). We
@@ -236,7 +236,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>invocations</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.649">invocations</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.648">invocations</a></pre>
 </li>
 </ul>
 </li>
@@ -253,7 +253,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HangThenRSCrashExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.648">HangThenRSCrashExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.647">HangThenRSCrashExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -270,7 +270,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execOpenRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.652">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html#line.651">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                                              org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo&nbsp;openReq)
                                                                                                                       throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
index 188b3b8..c60b601 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.757">TestAssignmentManager.MockRSExecutor</a></pre>
+<pre>private static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.756">TestAssignmentManager.MockRSExecutor</a></pre>
 </li>
 </ul>
 </div>
@@ -154,7 +154,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html#line.758">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html#line.757">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                     org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;req)
                                                                                              throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
index bad88db..94fbd0b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.778">TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.777">TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall</a>
 extends <a href="http://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>
@@ -188,7 +188,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MockRemoteCall</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html#line.779">MockRemoteCall</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html#line.778">MockRemoteCall</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
                       <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure&gt;&nbsp;operations)</pre>
 </li>
 </ul>
@@ -206,7 +206,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html#line.785">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html#line.784">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
                                                                                                               org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;request)
                                                                                                        throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
index 396a2d3..fcd3aff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.762">TestAssignmentManager.MockRSProcedureDispatcher</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.761">TestAssignmentManager.MockRSProcedureDispatcher</a>
 extends org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher</pre>
 </li>
 </ul>
@@ -288,7 +288,7 @@ extends org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>mockRsExec</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.763">mockRsExec</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.762">mockRsExec</a></pre>
 </li>
 </ul>
 </li>
@@ -305,7 +305,7 @@ extends org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MockRSProcedureDispatcher</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.765">MockRSProcedureDispatcher</a>(org.apache.hadoop.hbase.master.MasterServices&nbsp;master)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.764">MockRSProcedureDispatcher</a>(org.apache.hadoop.hbase.master.MasterServices&nbsp;master)</pre>
 </li>
 </ul>
 </li>
@@ -322,7 +322,7 @@ extends org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setMockRsExecutor</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.769">setMockRsExecutor</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;mockRsExec)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.768">setMockRsExecutor</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;mockRsExec)</pre>
 </li>
 </ul>
 <a name="remoteDispatch-org.apache.hadoop.hbase.ServerName-java.util.Set-">
@@ -331,7 +331,7 @@ extends org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>remoteDispatch</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.774">remoteDispatch</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#line.773">remoteDispatch</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure&gt;&nbsp;operations)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
index a2b2fe8..9965b05 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.521">TestAssignmentManager.NoopRsExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.520">TestAssignmentManager.NoopRsExecutor</a>
 extends <a href="http://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/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a></pre>
 </li>
@@ -204,7 +204,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NoopRsExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.521">NoopRsExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.520">NoopRsExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -221,7 +221,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockList">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.522">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.521">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;request)
                                                                                                     throws <a href="http://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>
@@ -238,7 +238,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockList">
 <li class="blockList">
 <h4>execOpenRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.549">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.548">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                                              org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo&nbsp;regionInfo)
                                                                                                                       throws <a href="http://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>
@@ -253,7 +253,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execCloseRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.554">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html#line.553">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                             byte[]&nbsp;regionName)
                                                                                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
index 49a4af4..65b24c0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.700">TestAssignmentManager.RandRsExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.699">TestAssignmentManager.RandRsExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.NoopRsExecutor</a></pre>
 </li>
 </ul>
@@ -223,7 +223,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rand</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.701">rand</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.700">rand</a></pre>
 </li>
 </ul>
 </li>
@@ -240,7 +240,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandRsExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.700">RandRsExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.699">RandRsExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.703">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.702">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;req)
                                                                                                     throws <a href="http://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>
@@ -276,7 +276,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>execOpenRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.714">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.713">execOpenRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                                              org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo&nbsp;openReq)
                                                                                                                       throws <a href="http://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>
@@ -293,7 +293,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>execCloseRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.744">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html#line.743">execCloseRegion</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                             byte[]&nbsp;regionName)
                                                                                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
index be3607c..38365b3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.589">TestAssignmentManager.ServerNotYetRunningRsExecutor</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.588">TestAssignmentManager.ServerNotYetRunningRsExecutor</a>
 extends <a href="http://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/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a></pre>
 </li>
@@ -190,7 +190,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ServerNotYetRunningRsExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html#line.589">ServerNotYetRunningRsExecutor</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html#line.588">ServerNotYetRunningRsExecutor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -207,7 +207,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html#line.590">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.ServerNotYetRunningRsExecutor.html#line.589">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;req)
                                                                                                     throws <a href="http://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>


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

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


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

Branch: refs/heads/asf-site
Commit: c0fcd7f380b6594658f72fdfaa45915e31a1edd8
Parents: f322bf6
Author: jenkins <bu...@apache.org>
Authored: Sat Aug 12 15:06:27 2017 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sat Aug 12 15:06:27 2017 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     6 +-
 .../apache/hadoop/hbase/client/Increment.html   |    46 +-
 .../apache/hadoop/hbase/client/Mutation.html    |    46 +-
 apidocs/org/apache/hadoop/hbase/client/Put.html |    36 +-
 .../org/apache/hadoop/hbase/client/Append.html  |     8 +-
 .../org/apache/hadoop/hbase/client/Delete.html  |    42 +-
 .../org/apache/hadoop/hbase/client/Get.html     |    12 +-
 .../apache/hadoop/hbase/client/Increment.html   |   470 +-
 .../apache/hadoop/hbase/client/Mutation.html    |   915 +-
 .../org/apache/hadoop/hbase/client/Put.html     |   569 +-
 .../hadoop/hbase/client/Scan.ReadType.html      |    12 +-
 .../org/apache/hadoop/hbase/client/Scan.html    |    12 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 18038 ++++++++---------
 checkstyle.rss                                  |     6 +-
 coc.html                                        |     4 +-
 cygwin.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                       |     4 +
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hadoop/hbase/class-use/HRegionInfo.html     |   142 +-
 .../hbase/classification/package-tree.html      |     6 +-
 .../apache/hadoop/hbase/client/Increment.html   |    46 +-
 .../apache/hadoop/hbase/client/Mutation.html    |    70 +-
 .../org/apache/hadoop/hbase/client/Put.html     |    42 +-
 .../hadoop/hbase/client/package-tree.html       |    26 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 ...talogJanitor.SplitParentFirstComparator.html |     8 +-
 .../hadoop/hbase/master/CatalogJanitor.html     |    12 +-
 .../hadoop/hbase/master/ServerManager.html      |    57 +-
 .../RegionStates.RegionFailedOpen.html          |    22 +-
 .../hbase/master/assignment/RegionStates.html   |   149 +-
 .../hadoop/hbase/master/package-tree.html       |     2 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     8 +-
 .../hadoop/hbase/quotas/package-tree.html       |     4 +-
 .../hadoop/hbase/regionserver/package-tree.html |    18 +-
 .../regionserver/querymatcher/package-tree.html |     4 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     4 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../org/apache/hadoop/hbase/client/Append.html  |     8 +-
 .../org/apache/hadoop/hbase/client/Delete.html  |    42 +-
 .../org/apache/hadoop/hbase/client/Get.html     |    12 +-
 .../apache/hadoop/hbase/client/Increment.html   |   470 +-
 .../apache/hadoop/hbase/client/Mutation.html    |   915 +-
 .../org/apache/hadoop/hbase/client/Put.html     |   569 +-
 .../hadoop/hbase/client/Scan.ReadType.html      |    12 +-
 .../org/apache/hadoop/hbase/client/Scan.html    |    12 +-
 ...talogJanitor.SplitParentFirstComparator.html |   481 +-
 .../hadoop/hbase/master/CatalogJanitor.html     |   481 +-
 .../master/HMaster.InitializationMonitor.html   |   140 +-
 .../hbase/master/HMaster.RedirectServlet.html   |   140 +-
 .../org/apache/hadoop/hbase/master/HMaster.html |   140 +-
 .../hadoop/hbase/master/ServerManager.html      |    25 +-
 .../assignment/MergeTableRegionsProcedure.html  |     2 +-
 .../RegionStates.AssignmentProcedureEvent.html  |  1058 +-
 .../RegionStates.RegionFailedOpen.html          |  1058 +-
 .../RegionStates.RegionStateNode.html           |  1058 +-
 ...RegionStates.RegionStateStampComparator.html |  1058 +-
 .../RegionStates.ServerReportEvent.html         |  1058 +-
 .../assignment/RegionStates.ServerState.html    |  1058 +-
 .../RegionStates.ServerStateNode.html           |  1058 +-
 .../hbase/master/assignment/RegionStates.html   |  1058 +-
 export_control.html                             |     4 +-
 hbase-annotations/checkstyle.html               |     4 +-
 hbase-annotations/dependencies.html             |     4 +-
 hbase-annotations/dependency-convergence.html   |     4 +-
 hbase-annotations/dependency-info.html          |     4 +-
 hbase-annotations/dependency-management.html    |     4 +-
 hbase-annotations/index.html                    |     4 +-
 hbase-annotations/integration.html              |     4 +-
 hbase-annotations/issue-tracking.html           |     4 +-
 hbase-annotations/license.html                  |     4 +-
 hbase-annotations/mail-lists.html               |     4 +-
 hbase-annotations/plugin-management.html        |     4 +-
 hbase-annotations/plugins.html                  |     4 +-
 hbase-annotations/project-info.html             |     4 +-
 hbase-annotations/project-reports.html          |     4 +-
 hbase-annotations/project-summary.html          |     4 +-
 hbase-annotations/source-repository.html        |     4 +-
 hbase-annotations/team-list.html                |     4 +-
 hbase-archetypes/dependencies.html              |     4 +-
 hbase-archetypes/dependency-convergence.html    |     4 +-
 hbase-archetypes/dependency-info.html           |     4 +-
 hbase-archetypes/dependency-management.html     |     4 +-
 .../hbase-archetype-builder/dependencies.html   |     4 +-
 .../dependency-convergence.html                 |     4 +-
 .../dependency-info.html                        |     4 +-
 .../dependency-management.html                  |     4 +-
 .../hbase-archetype-builder/index.html          |     4 +-
 .../hbase-archetype-builder/integration.html    |     4 +-
 .../hbase-archetype-builder/issue-tracking.html |     4 +-
 .../hbase-archetype-builder/license.html        |     4 +-
 .../hbase-archetype-builder/mail-lists.html     |     4 +-
 .../plugin-management.html                      |     4 +-
 .../hbase-archetype-builder/plugins.html        |     4 +-
 .../hbase-archetype-builder/project-info.html   |     4 +-
 .../project-summary.html                        |     4 +-
 .../source-repository.html                      |     4 +-
 .../hbase-archetype-builder/team-list.html      |     4 +-
 .../hbase-client-project/checkstyle.html        |     4 +-
 .../hbase-client-project/dependencies.html      |     4 +-
 .../dependency-convergence.html                 |     4 +-
 .../hbase-client-project/dependency-info.html   |     4 +-
 .../dependency-management.html                  |     4 +-
 .../hbase-client-project/index.html             |     4 +-
 .../hbase-client-project/integration.html       |     4 +-
 .../hbase-client-project/issue-tracking.html    |     4 +-
 .../hbase-client-project/license.html           |     4 +-
 .../hbase-client-project/mail-lists.html        |     4 +-
 .../hbase-client-project/plugin-management.html |     4 +-
 .../hbase-client-project/plugins.html           |     4 +-
 .../hbase-client-project/project-info.html      |     4 +-
 .../hbase-client-project/project-reports.html   |     4 +-
 .../hbase-client-project/project-summary.html   |     4 +-
 .../hbase-client-project/source-repository.html |     4 +-
 .../hbase-client-project/team-list.html         |     4 +-
 .../hbase-shaded-client-project/checkstyle.html |     4 +-
 .../dependencies.html                           |     4 +-
 .../dependency-convergence.html                 |     4 +-
 .../dependency-info.html                        |     4 +-
 .../dependency-management.html                  |     4 +-
 .../hbase-shaded-client-project/index.html      |     4 +-
 .../integration.html                            |     4 +-
 .../issue-tracking.html                         |     4 +-
 .../hbase-shaded-client-project/license.html    |     4 +-
 .../hbase-shaded-client-project/mail-lists.html |     4 +-
 .../plugin-management.html                      |     4 +-
 .../hbase-shaded-client-project/plugins.html    |     4 +-
 .../project-info.html                           |     4 +-
 .../project-reports.html                        |     4 +-
 .../project-summary.html                        |     4 +-
 .../source-repository.html                      |     4 +-
 .../hbase-shaded-client-project/team-list.html  |     4 +-
 hbase-archetypes/index.html                     |     4 +-
 hbase-archetypes/integration.html               |     4 +-
 hbase-archetypes/issue-tracking.html            |     4 +-
 hbase-archetypes/license.html                   |     4 +-
 hbase-archetypes/mail-lists.html                |     4 +-
 hbase-archetypes/plugin-management.html         |     4 +-
 hbase-archetypes/plugins.html                   |     4 +-
 hbase-archetypes/project-info.html              |     4 +-
 hbase-archetypes/project-summary.html           |     4 +-
 hbase-archetypes/source-repository.html         |     4 +-
 hbase-archetypes/team-list.html                 |     4 +-
 hbase-spark/checkstyle.html                     |     4 +-
 hbase-spark/dependencies.html                   |     4 +-
 hbase-spark/dependency-convergence.html         |     4 +-
 hbase-spark/dependency-info.html                |     4 +-
 hbase-spark/dependency-management.html          |     4 +-
 hbase-spark/index.html                          |     4 +-
 hbase-spark/integration.html                    |     4 +-
 hbase-spark/issue-tracking.html                 |     4 +-
 hbase-spark/license.html                        |     4 +-
 hbase-spark/mail-lists.html                     |     4 +-
 hbase-spark/plugin-management.html              |     4 +-
 hbase-spark/plugins.html                        |     4 +-
 hbase-spark/project-info.html                   |     4 +-
 hbase-spark/project-reports.html                |     4 +-
 hbase-spark/project-summary.html                |     4 +-
 hbase-spark/source-repository.html              |     4 +-
 hbase-spark/team-list.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                   |    32 +
 .../hbase/class-use/HBaseTestingUtility.html    |    42 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../hadoop/hbase/master/TestCatalogJanitor.html |     4 +-
 .../TestCatalogJanitorInMemoryStates.html       |   483 +
 .../hbase/master/TestClockSkewDetection.html    |     4 +-
 .../TestAssignmentManager.FaultyRsExecutor.html |     8 +-
 .../TestAssignmentManager.GoodRsExecutor.html   |     8 +-
 ...TestAssignmentManager.GoodSplitExecutor.html |     4 +-
 ...tManager.HangOnCloseThenRSCrashExecutor.html |    10 +-
 ...signmentManager.HangThenRSCrashExecutor.html |     8 +-
 .../TestAssignmentManager.MockRSExecutor.html   |     4 +-
 ...ockRSProcedureDispatcher.MockRemoteCall.html |     6 +-
 ...gnmentManager.MockRSProcedureDispatcher.html |    10 +-
 .../TestAssignmentManager.NoopRsExecutor.html   |    10 +-
 .../TestAssignmentManager.RandRsExecutor.html   |    12 +-
 ...ntManager.ServerNotYetRunningRsExecutor.html |     6 +-
 ...signmentManager.SocketTimeoutRsExecutor.html |    16 +-
 .../assignment/TestAssignmentManager.html       |    36 +-
 .../TestCatalogJanitorInMemoryStates.html       |   125 +
 .../hadoop/hbase/master/package-frame.html      |     1 +
 .../hadoop/hbase/master/package-summary.html    |    82 +-
 .../hadoop/hbase/master/package-tree.html       |     1 +
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 testdevapidocs/overview-tree.html               |     1 +
 .../TestCatalogJanitorInMemoryStates.html       |   257 +
 .../TestAssignmentManager.FaultyRsExecutor.html |  1147 +-
 .../TestAssignmentManager.GoodRsExecutor.html   |  1147 +-
 ...TestAssignmentManager.GoodSplitExecutor.html |  1147 +-
 ...tManager.HangOnCloseThenRSCrashExecutor.html |  1147 +-
 ...signmentManager.HangThenRSCrashExecutor.html |  1147 +-
 .../TestAssignmentManager.MockRSExecutor.html   |  1147 +-
 ...ockRSProcedureDispatcher.MockRemoteCall.html |  1147 +-
 ...gnmentManager.MockRSProcedureDispatcher.html |  1147 +-
 .../TestAssignmentManager.NoopRsExecutor.html   |  1147 +-
 .../TestAssignmentManager.RandRsExecutor.html   |  1147 +-
 ...ntManager.ServerNotYetRunningRsExecutor.html |  1147 +-
 ...signmentManager.SocketTimeoutRsExecutor.html |  1147 +-
 .../assignment/TestAssignmentManager.html       |  1147 +-
 241 files changed, 25205 insertions(+), 24231 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 0e08e12..8936c0e 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -606,7 +606,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 69ef0ba..f7fc15f 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:20170811144515+00'00')
-/CreationDate (D:20170811144515+00'00')
+/ModDate (D:20170812144601+00'00')
+/CreationDate (D:20170812144601+00'00')
 >>
 endobj
 2 0 obj
@@ -27334,7 +27334,7 @@ endobj
 endobj
 136 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 25 0 R (__indexterm-6955580) 3262 0 R (__indexterm-6957830) 3264 0 R (__indexterm-6959892) 3265 0 R (__indexterm-6961766) 3266 0 R (acid) 891 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3361 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3362 0 R (add.metrics) 3359 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3597 0 R (adding.new.node) 2859 0 R]
+/Names [(__anchor-top) 25 0 R (__indexterm-6955582) 3262 0 R (__indexterm-6957832) 3264 0 R (__indexterm-6959894) 3265 0 R (__indexterm-6961768) 3266 0 R (acid) 891 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3361 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3362 0 R (add.metrics) 3359 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3597 0 R (adding.new.node) 2859 0 R]
 >>
 endobj
 137 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/org/apache/hadoop/hbase/client/Increment.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/Increment.html b/apidocs/org/apache/hadoop/hbase/client/Increment.html
index 8e915b9..aa1d416 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Increment.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Increment.html
@@ -472,7 +472,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.119">addColumn</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.118">addColumn</a>(byte[]&nbsp;family,
                            byte[]&nbsp;qualifier,
                            long&nbsp;amount)</pre>
 <div class="block">Increment the column from the specific family with the specified qualifier
@@ -495,7 +495,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.134">getTimeRange</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.132">getTimeRange</a>()</pre>
 <div class="block">Gets the TimeRange used for this increment.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -509,7 +509,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.152">setTimeRange</a>(long&nbsp;minStamp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.150">setTimeRange</a>(long&nbsp;minStamp,
                               long&nbsp;maxStamp)
                        throws <a href="http://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">Sets the TimeRange to be used on the Get for this increment.
@@ -537,7 +537,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setReturnResults</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.163">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.161">setReturnResults</a>(boolean&nbsp;returnResults)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>returnResults</code> - True (default) if the increment operation should return the results. A
@@ -552,7 +552,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>isReturnResults</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.172">isReturnResults</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.170">isReturnResults</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>current setting for returnResults</dd>
@@ -565,7 +565,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>numFamilies</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.181">numFamilies</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.179">numFamilies</a>()</pre>
 <div class="block">Method for retrieving the number of families to increment from</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -581,7 +581,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>hasFamilies</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.189">hasFamilies</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.187">hasFamilies</a>()</pre>
 <div class="block">Method for checking if any families have been inserted into this Increment</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -595,7 +595,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyMapOfLongs</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.201">getFamilyMapOfLongs</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.199">getFamilyMapOfLongs</a>()</pre>
 <div class="block">Before 0.95, when you called Increment#getFamilyMap(), you got back
  a map of families to a list of Longs.  Now, <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#getFamilyCellMap--"><code>Mutation.getFamilyCellMap()</code></a> returns
  families by list of Cells.  This method has been added so you can have the
@@ -614,7 +614,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.219">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.217">toString</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Operation.html#toString--">Operation</a></code></span></div>
 <div class="block">Produces a string representation of this Operation. It defaults to a JSON
  representation, but falls back to a string representation of the
@@ -633,7 +633,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.261">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;i)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.259">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;i)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://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="http://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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;</code></dd>
@@ -648,7 +648,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.267">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.265">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -661,7 +661,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.274">equals</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.272">equals</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -674,7 +674,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>extraHeapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.287">extraHeapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.285">extraHeapSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#extraHeapSize--">Mutation</a></code></span></div>
 <div class="block">Subclasses should override this method to add the heap size of their own fields.</div>
 <dl>
@@ -691,7 +691,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setAttribute</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.292">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.290">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                               byte[]&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Attributes.html#setAttribute-java.lang.String-byte:A-">Attributes</a></code></span></div>
 <div class="block">Sets an attribute.
@@ -714,7 +714,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.297">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.295">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setId-java.lang.String-">OperationWithAttributes</a></code></span></div>
 <div class="block">This method allows you to set an identifier on an operation. The original
  motivation for this was to allow the identifier to be used in slow query
@@ -735,7 +735,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.302">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.300">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setDurability-org.apache.hadoop.hbase.client.Durability-">Mutation</a></code></span></div>
 <div class="block">Set the durability for this mutation</div>
 <dl>
@@ -750,7 +750,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.307">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.305">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setFamilyCellMap-java.util.NavigableMap-">Mutation</a></code></span></div>
 <div class="block">Method for setting the put's familyMap</div>
 <dl>
@@ -765,7 +765,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.312">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.310">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setClusterIds-java.util.List-">Mutation</a></code></span></div>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
@@ -782,7 +782,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.317">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.315">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setCellVisibility-org.apache.hadoop.hbase.security.visibility.CellVisibility-">Mutation</a></code></span></div>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
@@ -798,7 +798,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.322">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.320">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                         org.apache.hadoop.hbase.security.access.Permission&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -815,7 +815,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.327">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.325">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setACL-java.util.Map-">setACL</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -830,7 +830,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.332">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.330">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setTTL-long-">Mutation</a></code></span></div>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>
@@ -849,7 +849,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparabl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setPriority</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.337">setPriority</a>(int&nbsp;priority)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Increment.html#line.335">setPriority</a>(int&nbsp;priority)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setPriority-int-">setPriority</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html" title="class in org.apache.hadoop.hbase.client">OperationWithAttributes</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/org/apache/hadoop/hbase/client/Mutation.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/Mutation.html b/apidocs/org/apache/hadoop/hbase/client/Mutation.html
index 8532d96..9a6c533 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Mutation.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Mutation.html
@@ -463,7 +463,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFingerprint</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.160">getFingerprint</a>()</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.161">getFingerprint</a>()</pre>
 <div class="block">Compile the column family (i.e. schema) information
  into a Map. Useful for parsing and aggregation by debugging,
  logging, and administration tools.</div>
@@ -481,7 +481,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toMap</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.180">toMap</a>(int&nbsp;maxCols)</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.181">toMap</a>(int&nbsp;maxCols)</pre>
 <div class="block">Compile the details beyond the scope of getFingerprint (row, columns,
  timestamps, etc.) into a Map along with the fingerprinted information.
  Useful for debugging, logging, and administration tools.</div>
@@ -501,7 +501,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.242">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.243">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block">Set the durability for this mutation</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -515,7 +515,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.248">getDurability</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.249">getDurability</a>()</pre>
 <div class="block">Get the current durability</div>
 </li>
 </ul>
@@ -525,7 +525,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyCellMap</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.256">getFamilyCellMap</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.257">getFamilyCellMap</a>()</pre>
 <div class="block">Method for retrieving the put's familyMap</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -539,7 +539,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.263">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.264">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block">Method for setting the put's familyMap</div>
 </li>
 </ul>
@@ -549,7 +549,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.274">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.275">isEmpty</a>()</pre>
 <div class="block">Method to check if the familyMap is empty</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -563,7 +563,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getRow</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.283">getRow</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.284">getRow</a>()</pre>
 <div class="block">Method for retrieving the delete's row</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -579,7 +579,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.288">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;d)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.289">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;d)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://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="http://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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;</code></dd>
@@ -592,7 +592,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeStamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.296">getTimeStamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.297">getTimeStamp</a>()</pre>
 <div class="block">Method for retrieving the timestamp</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -606,7 +606,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.304">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.305">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -620,7 +620,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterIds</h4>
-<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.318">getClusterIds</a>()</pre>
+<pre>public&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.319">getClusterIds</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the set of clusterIds that have consumed the mutation</dd>
@@ -633,7 +633,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.336">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.337">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
 <dl>
@@ -648,7 +648,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellVisibility</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.346">getCellVisibility</a>()
+<pre>public&nbsp;org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.347">getCellVisibility</a>()
                                                                              throws org.apache.hadoop.hbase.exceptions.DeserializationException</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -664,7 +664,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.399">size</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.400">size</a>()</pre>
 <div class="block">Number of KeyValues carried by this Mutation.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -678,7 +678,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>numFamilies</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.410">numFamilies</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.411">numFamilies</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of different families</dd>
@@ -691,7 +691,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.418">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.419">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>heapSize</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.io.HeapSize</code></dd>
@@ -706,7 +706,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getACL</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.451">getACL</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.452">getACL</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The serialized ACL for this operation, or null if none</dd>
@@ -719,7 +719,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.459">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.460">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                        org.apache.hadoop.hbase.security.access.Permission&nbsp;perms)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -734,7 +734,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.468">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.469">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>perms</code> - A map of permissions for a user or users</dd>
@@ -747,7 +747,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getTTL</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.483">getTTL</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.484">getTTL</a>()</pre>
 <div class="block">Return the TTL requested for the result of the mutation, in milliseconds.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -762,7 +762,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.496">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.497">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -778,7 +778,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" titl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>extraHeapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.522">extraHeapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Mutation.html#line.523">extraHeapSize</a>()</pre>
 <div class="block">Subclasses should override this method to add the heap size of their own fields.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/org/apache/hadoop/hbase/client/Put.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/Put.html b/apidocs/org/apache/hadoop/hbase/client/Put.html
index ad46529..41b5077 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Put.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Put.html
@@ -673,7 +673,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>addImmutable</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.228">addImmutable</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.227">addImmutable</a>(byte[]&nbsp;family,
                         byte[]&nbsp;qualifier,
                         long&nbsp;ts,
                         byte[]&nbsp;value)</pre>
@@ -688,7 +688,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.289">addColumn</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.285">addColumn</a>(byte[]&nbsp;family,
                      <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                      long&nbsp;ts,
                      <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value)</pre>
@@ -711,7 +711,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>addImmutable</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.305">addImmutable</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.300">addImmutable</a>(byte[]&nbsp;family,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;qualifier,
                         long&nbsp;ts,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;value)</pre>
@@ -726,7 +726,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.324">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.318">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
         throws <a href="http://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">Add the specified KeyValue to this Put operation.  Operation assumes that
  the passed KeyValue is immutable and its backing array will not be modified
@@ -747,7 +747,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.347">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.340">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
  a value assigned to the given family &amp; qualifier.
@@ -768,7 +768,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.362">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.355">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    long&nbsp;ts)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
@@ -791,7 +791,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.377">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.370">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    byte[]&nbsp;value)</pre>
 <div class="block">A convenience method to determine if this object's familyMap contains
@@ -814,7 +814,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>has</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.393">has</a>(byte[]&nbsp;family,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.386">has</a>(byte[]&nbsp;family,
                    byte[]&nbsp;qualifier,
                    long&nbsp;ts,
                    byte[]&nbsp;value)</pre>
@@ -839,7 +839,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.464">get</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.457">get</a>(byte[]&nbsp;family,
                       byte[]&nbsp;qualifier)</pre>
 <div class="block">Returns a list of all KeyValue objects with matching column family and qualifier.</div>
 <dl>
@@ -858,7 +858,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setAttribute</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.475">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.468">setAttribute</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                         byte[]&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Attributes.html#setAttribute-java.lang.String-byte:A-">Attributes</a></code></span></div>
 <div class="block">Sets an attribute.
@@ -881,7 +881,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.480">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.473">setId</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setId-java.lang.String-">OperationWithAttributes</a></code></span></div>
 <div class="block">This method allows you to set an identifier on an operation. The original
  motivation for this was to allow the identifier to be used in slow query
@@ -902,7 +902,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setDurability</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.485">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.478">setDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setDurability-org.apache.hadoop.hbase.client.Durability-">Mutation</a></code></span></div>
 <div class="block">Set the durability for this mutation</div>
 <dl>
@@ -917,7 +917,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyCellMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.490">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.483">setFamilyCellMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;map)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setFamilyCellMap-java.util.NavigableMap-">Mutation</a></code></span></div>
 <div class="block">Method for setting the put's familyMap</div>
 <dl>
@@ -932,7 +932,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterIds</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.495">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.488">setClusterIds</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;clusterIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setClusterIds-java.util.List-">Mutation</a></code></span></div>
 <div class="block">Marks that the clusters with the given clusterIds have consumed the mutation</div>
 <dl>
@@ -949,7 +949,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellVisibility</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.500">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.493">setCellVisibility</a>(org.apache.hadoop.hbase.security.visibility.CellVisibility&nbsp;expression)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setCellVisibility-org.apache.hadoop.hbase.security.visibility.CellVisibility-">Mutation</a></code></span></div>
 <div class="block">Sets the visibility expression associated with cells in this Mutation.
  It is illegal to set <code>CellVisibility</code> on <code>Delete</code> mutation.</div>
@@ -965,7 +965,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.505">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.498">setACL</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                   org.apache.hadoop.hbase.security.access.Permission&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -982,7 +982,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.510">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.503">setACL</a>(<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setACL-java.util.Map-">setACL</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></code></dd>
@@ -997,7 +997,7 @@ implements org.apache.hadoop.hbase.io.HeapSize, <a href="http://docs.oracle.com/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setTTL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.515">setTTL</a>(long&nbsp;ttl)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Put.html#line.508">setTTL</a>(long&nbsp;ttl)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html#setTTL-long-">Mutation</a></code></span></div>
 <div class="block">Set the TTL desired for the result of the mutation, in milliseconds.</div>
 <dl>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : nod

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 36bf254..9717f8d 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -538,25 +538,25 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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>
-<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/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/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/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/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.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/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/HBaseAdmin.ReplicationState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">HBaseAdmin.ReplicationState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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.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/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/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/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/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/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 38f5b82..98ee311 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -175,14 +175,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 bbaeb4f..77263cd 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 cdb6af5..08990df 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -341,8 +341,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/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>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 79b78b5..739fff4 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -284,10 +284,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
index 1e0e263..33f155f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.305">CatalogJanitor.SplitParentFirstComparator</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.311">CatalogJanitor.SplitParentFirstComparator</a>
 extends <a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;</pre>
 <div class="block">Compare HRegionInfos in a way that has split parents sort BEFORE their
@@ -216,7 +216,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rowEndKeyComparator</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;byte[]&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.306">rowEndKeyComparator</a></pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;byte[]&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.312">rowEndKeyComparator</a></pre>
 </li>
 </ul>
 </li>
@@ -233,7 +233,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SplitParentFirstComparator</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.305">SplitParentFirstComparator</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.311">SplitParentFirstComparator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -250,7 +250,7 @@ implements <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compare</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.308">compare</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;left,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.314">compare</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;left,
                    <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;right)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
index 6bbbba3..9b2f1f9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
@@ -519,7 +519,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>scan</h4>
-<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.235">scan</a>()
+<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.240">scan</a>()
   throws <a href="http://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">Run janitorial scan of catalog <code>hbase:meta</code> table looking for
  garbage to collect.</div>
@@ -537,7 +537,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanParent</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.335">cleanParent</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.341">cleanParent</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
                     <a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowContent)
              throws <a href="http://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">If daughters no longer hold reference to the parents, delete the parent.</div>
@@ -560,7 +560,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>hasNoReferences</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.369">hasNoReferences</a>(<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;p)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.378">hasNoReferences</a>(<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;p)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>p</code> - A pair where the first boolean says whether or not the daughter
@@ -577,7 +577,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>checkDaughterInFs</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.383">checkDaughterInFs</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.392">checkDaughterInFs</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
                                         <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughter)
                                  throws <a href="http://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">Checks if a daughter region -- either splitA or splitB -- still holds
@@ -601,7 +601,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.426">getTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.435">getTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>,
                                             <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -617,7 +617,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanMergeQualifier</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.438">cleanMergeQualifier</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.447">cleanMergeQualifier</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)
                             throws <a href="http://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">Checks if the specified region has merge qualifiers, if so, try to clean
  them</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
index eae3b2d..e8dc4d0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ServerManager.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -423,116 +423,120 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </tr>
 <tr id="i26" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#isRegionInServerManagerStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInServerManagerStates</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
+</tr>
+<tr id="i27" class="rowColor">
+<td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#isServerDead-org.apache.hadoop.hbase.ServerName-">isServerDead</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Check if a server is known to be dead.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#isServerOnline-org.apache.hadoop.hbase.ServerName-">isServerOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#letRegionServersShutdown--">letRegionServersShutdown</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#moveFromOnlineToDeadServers-org.apache.hadoop.hbase.ServerName-">moveFromOnlineToDeadServers</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#newRpcController--">newRpcController</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#processDeadServer-org.apache.hadoop.hbase.ServerName-boolean-">processDeadServer</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                  boolean&nbsp;shouldSplitWal)</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#processQueuedDeadServers--">processQueuedDeadServers</a></span>()</code>
 <div class="block">Process the servers which died during master's initialization.</div>
 </td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#recordNewServerWithLock-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerLoad-">recordNewServerWithLock</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                        <a href="../../../../../org/apache/hadoop/hbase/ServerLoad.html" title="class in org.apache.hadoop.hbase">ServerLoad</a>&nbsp;sl)</code>
 <div class="block">Adds the onlineServers list.</div>
 </td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#regionServerReport-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerLoad-">regionServerReport</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
                   <a href="../../../../../org/apache/hadoop/hbase/ServerLoad.html" title="class in org.apache.hadoop.hbase">ServerLoad</a>&nbsp;sl)</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#regionServerStartup-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupRequest-java.net.InetAddress-">regionServerStartup</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupRequest&nbsp;request,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;ia)</code>
 <div class="block">Let the server manager know a new regionserver has come online</div>
 </td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#registerListener-org.apache.hadoop.hbase.master.ServerListener-">registerListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/ServerListener.html" title="interface in org.apache.hadoop.hbase.master">ServerListener</a>&nbsp;listener)</code>
 <div class="block">Add the listener to the notification list.</div>
 </td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeDeadNotExpiredServers-java.util.List-">removeDeadNotExpiredServers</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Loop through the deadNotExpired server list and remove them from the
  servers.</div>
 </td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeRegion-org.apache.hadoop.hbase.HRegionInfo-">removeRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeRegions-java.util.List-">removeRegions</a></span>(<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeServerFromDrainList-org.apache.hadoop.hbase.ServerName-">removeServerFromDrainList</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#sendRegionWarmup-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.HRegionInfo-">sendRegionWarmup</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                 <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</code>
 <div class="block">Sends a WARMUP RPC to the specified server to warmup the specified region.</div>
 </td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#shutdownCluster--">shutdownCluster</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#stop--">stop</a></span>()</code>
 <div class="block">Stop the ServerManager.</div>
 </td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#unregisterListener-org.apache.hadoop.hbase.master.ServerListener-">unregisterListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/ServerListener.html" title="interface in org.apache.hadoop.hbase.master">ServerListener</a>&nbsp;listener)</code>
 <div class="block">Remove the listener from the notification list.</div>
 </td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#updateLastFlushedSequenceIds-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerLoad-">updateLastFlushedSequenceIds</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
                             <a href="../../../../../org/apache/hadoop/hbase/ServerLoad.html" title="class in org.apache.hadoop.hbase">ServerLoad</a>&nbsp;hsl)</code>
 <div class="block">Updates last flushed sequence Ids for the regions on server sn</div>
 </td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#waitForRegionServers-org.apache.hadoop.hbase.monitoring.MonitoredTask-">waitForRegionServers</a></span>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)</code>
 <div class="block">Wait for the region servers to report in.</div>
@@ -1448,13 +1452,22 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </li>
 </ul>
+<a name="isRegionInServerManagerStates-org.apache.hadoop.hbase.HRegionInfo-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isRegionInServerManagerStates</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1032">isRegionInServerManagerStates</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
+</li>
+</ul>
 <a name="removeRegions-java.util.List-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>removeRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1034">removeRegions</a>(<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/ServerManager.html#line.1041">removeRegions</a>(<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
index ed18902..5b80f1b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.845">RegionStates.RegionFailedOpen</a>
+<pre>public static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.851">RegionStates.RegionFailedOpen</a>
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -229,7 +229,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>regionNode</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.846">regionNode</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.852">regionNode</a></pre>
 </li>
 </ul>
 <a name="exception">
@@ -238,7 +238,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>exception</h4>
-<pre>private volatile&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.848">exception</a></pre>
+<pre>private volatile&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.854">exception</a></pre>
 </li>
 </ul>
 <a name="retries">
@@ -247,7 +247,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>retries</h4>
-<pre>private volatile&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.849">retries</a></pre>
+<pre>private volatile&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.855">retries</a></pre>
 </li>
 </ul>
 </li>
@@ -264,7 +264,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionFailedOpen</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.851">RegionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.857">RegionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNode</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.855">getRegionNode</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.861">getRegionNode</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo--">
@@ -290,7 +290,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.859">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.865">getRegionInfo</a>()</pre>
 </li>
 </ul>
 <a name="incrementAndGetRetries--">
@@ -299,7 +299,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementAndGetRetries</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.863">incrementAndGetRetries</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.869">incrementAndGetRetries</a>()</pre>
 </li>
 </ul>
 <a name="getRetries--">
@@ -308,7 +308,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRetries</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.867">getRetries</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.873">getRetries</a>()</pre>
 </li>
 </ul>
 <a name="setException-java.lang.Exception-">
@@ -317,7 +317,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.871">setException</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.877">setException</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</pre>
 </li>
 </ul>
 <a name="getException--">
@@ -326,7 +326,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getException</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.875">getException</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.881">getException</a>()</pre>
 </li>
 </ul>
 </li>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span cl

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
index b779721..ec2417b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.609">TestAssignmentManager.SocketTimeoutRsExecutor</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.608">TestAssignmentManager.SocketTimeoutRsExecutor</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.GoodRsExecutor</a></pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>maxSocketTimeoutRetries</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.610">maxSocketTimeoutRetries</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.609">maxSocketTimeoutRetries</a></pre>
 </li>
 </ul>
 <a name="maxServerRetries">
@@ -249,7 +249,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>maxServerRetries</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.611">maxServerRetries</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.610">maxServerRetries</a></pre>
 </li>
 </ul>
 <a name="lastServer">
@@ -258,7 +258,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>lastServer</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.613">lastServer</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.612">lastServer</a></pre>
 </li>
 </ul>
 <a name="sockTimeoutRetries">
@@ -267,7 +267,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockList">
 <li class="blockList">
 <h4>sockTimeoutRetries</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.614">sockTimeoutRetries</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.613">sockTimeoutRetries</a></pre>
 </li>
 </ul>
 <a name="serverRetries">
@@ -276,7 +276,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>serverRetries</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.615">serverRetries</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.614">serverRetries</a></pre>
 </li>
 </ul>
 </li>
@@ -293,7 +293,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SocketTimeoutRsExecutor</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.617">SocketTimeoutRsExecutor</a>(int&nbsp;maxSocketTimeoutRetries,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.616">SocketTimeoutRsExecutor</a>(int&nbsp;maxSocketTimeoutRetries,
                                int&nbsp;maxServerRetries)</pre>
 </li>
 </ul>
@@ -311,7 +311,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/Tes
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sendRequest</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.622">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.SocketTimeoutRsExecutor.html#line.621">sendRequest</a>(org.apache.hadoop.hbase.ServerName&nbsp;server,
                                                                                                            org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest&nbsp;req)
                                                                                                     throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
index 5789f3a..34ccff2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html
@@ -808,7 +808,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testServerNotYetRunning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.269">testServerNotYetRunning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.268">testServerNotYetRunning</a>()
                              throws <a href="http://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>
@@ -822,7 +822,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testRetriesExhaustedFailure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.274">testRetriesExhaustedFailure</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.273">testRetriesExhaustedFailure</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                          <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor)
                                   throws <a href="http://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>
@@ -837,7 +837,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testIOExceptionOnAssignment</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.314">testIOExceptionOnAssignment</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.313">testIOExceptionOnAssignment</a>()
                                  throws <a href="http://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>
@@ -851,7 +851,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDoNotRetryExceptionOnAssignment</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.326">testDoNotRetryExceptionOnAssignment</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.325">testDoNotRetryExceptionOnAssignment</a>()
                                          throws <a href="http://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>
@@ -865,7 +865,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testFailedOpen</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.337">testFailedOpen</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.336">testFailedOpen</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                             <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor)
                      throws <a href="http://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>
@@ -880,7 +880,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testAssign</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.354">testAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.353">testAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor)
                  throws <a href="http://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>
@@ -894,7 +894,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testAssign</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.358">testAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.357">testAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSExecutor.html" title="interface in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSExecutor</a>&nbsp;executor,
                         int&nbsp;nregions)
                  throws <a href="http://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>
@@ -909,7 +909,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testAssignAnAssignedRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.378">testAssignAnAssignedRegion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.377">testAssignAnAssignedRegion</a>()
                                 throws <a href="http://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>
@@ -923,7 +923,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testUnassignAnUnassignedRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.408">testUnassignAnUnassignedRegion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.407">testUnassignAnUnassignedRegion</a>()
                                     throws <a href="http://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>
@@ -937,7 +937,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>submitProcedure</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.443">submitProcedure</a>(org.apache.hadoop.hbase.procedure2.Procedure&nbsp;proc)</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.442">submitProcedure</a>(org.apache.hadoop.hbase.procedure2.Procedure&nbsp;proc)</pre>
 </li>
 </ul>
 <a name="waitOnFuture-java.util.concurrent.Future-">
@@ -946,7 +946,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>waitOnFuture</h4>
-<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.447">waitOnFuture</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;future)
+<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.446">waitOnFuture</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;&nbsp;future)
                      throws <a href="http://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>
@@ -960,7 +960,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkSubmit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.459">bulkSubmit</a>(org.apache.hadoop.hbase.master.assignment.AssignProcedure[]&nbsp;procs)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.458">bulkSubmit</a>(org.apache.hadoop.hbase.master.assignment.AssignProcedure[]&nbsp;procs)
                  throws <a href="http://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>
@@ -974,7 +974,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createAndSubmitAssign</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.master.assignment.AssignProcedure&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.485">createAndSubmitAssign</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;org.apache.hadoop.hbase.master.assignment.AssignProcedure&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.484">createAndSubmitAssign</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                                         int&nbsp;regionId)</pre>
 </li>
 </ul>
@@ -984,7 +984,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createAndSubmitUnassign</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.master.assignment.UnassignProcedure&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.492">createAndSubmitUnassign</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;org.apache.hadoop.hbase.master.assignment.UnassignProcedure&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.491">createAndSubmitUnassign</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                                             int&nbsp;regionId)</pre>
 </li>
 </ul>
@@ -994,7 +994,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionInfo</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.HRegionInfo&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.499">createRegionInfo</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;org.apache.hadoop.hbase.HRegionInfo&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.498">createRegionInfo</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                              long&nbsp;regionId)</pre>
 </li>
 </ul>
@@ -1004,7 +1004,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>sendTransitionReport</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.504">sendTransitionReport</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.503">sendTransitionReport</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName,
                                   org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionInfo&nbsp;regionInfo,
                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state)
                            throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1020,7 +1020,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doCrash</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.517">doCrash</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.516">doCrash</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="collectAssignmentManagerMetrics--">
@@ -1029,7 +1029,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>collectAssignmentManagerMetrics</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.824">collectAssignmentManagerMetrics</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#line.823">collectAssignmentManagerMetrics</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestCatalogJanitorInMemoryStates.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestCatalogJanitorInMemoryStates.html b/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestCatalogJanitorInMemoryStates.html
new file mode 100644
index 0000000..83066be
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/class-use/TestCatalogJanitorInMemoryStates.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.TestCatalogJanitorInMemoryStates (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.TestCatalogJanitorInMemoryStates (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/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">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/class-use/TestCatalogJanitorInMemoryStates.html" target="_top">Frames</a></li>
+<li><a href="TestCatalogJanitorInMemoryStates.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.TestCatalogJanitorInMemoryStates" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.TestCatalogJanitorInMemoryStates</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.TestCatalogJanitorInMemoryStates</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/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">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/class-use/TestCatalogJanitorInMemoryStates.html" target="_top">Frames</a></li>
+<li><a href="TestCatalogJanitorInMemoryStates.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;2017 <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/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
index d491b37..655935e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-frame.html
@@ -29,6 +29,7 @@
 <li><a href="TestAssignmentListener.DummyServerListener.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestAssignmentListener.DummyServerListener</a></li>
 <li><a href="TestAssignmentManagerMetrics.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestAssignmentManagerMetrics</a></li>
 <li><a href="TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestCatalogJanitor</a></li>
+<li><a href="TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestCatalogJanitorInMemoryStates</a></li>
 <li><a href="TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestClockSkewDetection</a></li>
 <li><a href="TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestClusterStatusPublisher</a></li>
 <li><a href="TestDeadServer.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestDeadServer</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
index 9b2d79b..063ee42 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-summary.html
@@ -152,190 +152,194 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master">TestClockSkewDetection</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">TestClusterStatusPublisher</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master">TestClockSkewDetection</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master">TestDeadServer</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">TestClusterStatusPublisher</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master">TestDeadServer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDistributedLogSplitting.NonceGeneratorWithDups.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting.NonceGeneratorWithDups</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestDistributedLogSplitting.NonceGeneratorWithDups.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting.NonceGeneratorWithDups</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetInfoPort.html" title="class in org.apache.hadoop.hbase.master">TestGetInfoPort</a></td>
 <td class="colLast">
 <div class="block">Trivial test to confirm that we do not get 0 infoPort.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestGetLastFlushedSequenceId.html" title="class in org.apache.hadoop.hbase.master">TestGetLastFlushedSequenceId</a></td>
 <td class="colLast">
 <div class="block">Trivial test to confirm that we can get last flushed sequence id by encodedRegionName.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterCommandLine.html" title="class in org.apache.hadoop.hbase.master">TestHMasterCommandLine</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestHMasterRPCException.html" title="class in org.apache.hadoop.hbase.master">TestHMasterRPCException</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMaster.html" title="class in org.apache.hadoop.hbase.master">TestMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.html" title="class in org.apache.hadoop.hbase.master">TestMasterBalanceThrottling</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFailover.html" title="class in org.apache.hadoop.hbase.master">TestMasterFailover</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFailoverBalancerPersistence.html" title="class in org.apache.hadoop.hbase.master">TestMasterFailoverBalancerPersistence</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">TestMasterFileSystem</a></td>
 <td class="colLast">
 <div class="block">Test the master filesystem in a local cluster</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.html" title="class in org.apache.hadoop.hbase.master">TestMasterFileSystemWithWALDir</a></td>
 <td class="colLast">
 <div class="block">Test the master filesystem in a local cluster</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetrics.html" title="class in org.apache.hadoop.hbase.master">TestMasterMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetrics.MyMaster.html" title="class in org.apache.hadoop.hbase.master">TestMasterMetrics.MyMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.html" title="class in org.apache.hadoop.hbase.master">TestMasterMetricsWrapper</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master">TestMasterNoCluster</a></td>
 <td class="colLast">
 <div class="block">Standup the master and fake it to test various aspects of master function.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.html" title="class in org.apache.hadoop.hbase.master">TestMasterOperationsForRegionReplicas</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterQosFunction.html" title="class in org.apache.hadoop.hbase.master">TestMasterQosFunction</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterShutdown.html" title="class in org.apache.hadoop.hbase.master">TestMasterShutdown</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterStatusServlet.html" title="class in org.apache.hadoop.hbase.master">TestMasterStatusServlet</a></td>
 <td class="colLast">
 <div class="block">Tests for the master status page and its template.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterTransitions.html" title="class in org.apache.hadoop.hbase.master">TestMasterTransitions</a></td>
 <td class="colLast">
 <div class="block">Test transitions of state across the master.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMasterWalManager.html" title="class in org.apache.hadoop.hbase.master">TestMasterWalManager</a></td>
 <td class="colLast">
 <div class="block">Test the master wal manager in a local cluster</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaShutdownHandler.html" title="class in org.apache.hadoop.hbase.master">TestMetaShutdownHandler</a></td>
 <td class="colLast">
 <div class="block">Tests handling of meta-carrying region server failover.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetaShutdownHandler.MyRegionServer.html" title="class in org.apache.hadoop.hbase.master">TestMetaShutdownHandler.MyRegionServer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterProcSourceImpl</a></td>
 <td class="colLast">
 <div class="block">Test for MetricsMasterProcSourceImpl</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterSourceFactory.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterSourceFactory</a></td>
 <td class="colLast">
 <div class="block">Test for the CompatibilitySingletonFactory and building MetricsMasterSource</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestMetricsMasterSourceImpl.html" title="class in org.apache.hadoop.hbase.master">TestMetricsMasterSourceImpl</a></td>
 <td class="colLast">
 <div class="block">Test for MetricsMasterSourceImpl</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlacement</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlacement2.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlacement2</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionPlan.html" title="class in org.apache.hadoop.hbase.master">TestRegionPlan</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRegionState.html" title="class in org.apache.hadoop.hbase.master">TestRegionState</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRestartCluster.html" title="class in org.apache.hadoop.hbase.master">TestRestartCluster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestRollingRestart.html" title="class in org.apache.hadoop.hbase.master">TestRollingRestart</a></td>
 <td class="colLast">
 <div class="block">Tests the restarting of everything as done during rolling restarts.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestSplitLogManager.html" title="class in org.apache.hadoop.hbase.master">TestSplitLogManager</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestTableStateManager.html" title="class in org.apache.hadoop.hbase.master">TestTableStateManager</a></td>
 <td class="colLast">
 <div class="block">Tests the default table lock manager</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master">TestWarmupRegion</a></td>
 <td class="colLast">
 <div class="block">Run tests that use the HBase clients; <code>HTable</code>.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
index d990780..39e3ac3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -122,6 +122,7 @@
 </li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestAssignmentManagerMetrics</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestCatalogJanitor</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestCatalogJanitorInMemoryStates</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestClockSkewDetection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestClusterStatusPublisher</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestDeadServer</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 d6e5510..98a1127 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -542,15 +542,15 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.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/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/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/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/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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 072d030..6ec41a1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -624,10 +624,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 0178c73..48d8abf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -248,10 +248,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 2573409..8e1c1ad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -140,9 +140,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index bb95615..9251153 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -2256,6 +2256,7 @@
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestCallRunner.html" title="class in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">TestCallRunner</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/TestCanaryTool.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">TestCanaryTool</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestCatalogJanitor</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestCatalogJanitorInMemoryStates</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.html" title="class in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">TestCellBlockBuilder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.codec.<a href="org/apache/hadoop/hbase/codec/TestCellCodec.html" title="class in org.apache.hadoop.hbase.codec"><span class="typeNameLink">TestCellCodec</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.codec.<a href="org/apache/hadoop/hbase/codec/TestCellCodecWithTags.html" title="class in org.apache.hadoop.hbase.codec"><span class="typeNameLink">TestCellCodecWithTags</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
new file mode 100644
index 0000000..eabdf93
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html
@@ -0,0 +1,257 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.master;<a name="line.19"></a>
+<span class="sourceLineNo">020</span><a name="line.20"></a>
+<span class="sourceLineNo">021</span>import org.apache.commons.logging.Log;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.commons.logging.LogFactory;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.conf.Configuration;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.*;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.client.*;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.PairOfSameType;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import static org.junit.Assert.assertArrayEquals;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import static org.junit.Assert.assertEquals;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import static org.junit.Assert.assertFalse;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import static org.junit.Assert.assertTrue;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.junit.AfterClass;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.junit.BeforeClass;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.junit.Rule;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.junit.Test;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.junit.experimental.categories.Category;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.rules.TestName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.rules.TestRule;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>import java.io.IOException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import java.util.ArrayList;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import java.util.List;<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>import static org.junit.Assert.assertFalse;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import static org.junit.Assert.assertTrue;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import static org.junit.Assert.assertNotNull;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category({MasterTests.class, MediumTests.class})<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestCatalogJanitorInMemoryStates {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final Log LOG = LogFactory.getLog(TestCatalogJanitorInMemoryStates.class);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @Rule public final TestRule timeout = CategoryBasedTimeout.builder().<a name="line.58"></a>
+<span class="sourceLineNo">059</span>     withTimeout(this.getClass()).withLookingForStuckThread(true).build();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  @Rule public final TestName name = new TestName();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static byte [] ROW = Bytes.toBytes("testRow");<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static byte [] FAMILY = Bytes.toBytes("testFamily");<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  private static byte [] QUALIFIER = Bytes.toBytes("testQualifier");<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static byte [] VALUE = Bytes.toBytes("testValue");<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>   * @throws java.lang.Exception<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  @BeforeClass<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  public static void setUpBeforeClass() throws Exception {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    TEST_UTIL.startMiniCluster(1);<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @throws java.lang.Exception<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  @AfterClass<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  public static void tearDownAfterClass() throws Exception {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    TEST_UTIL.shutdownMiniCluster();<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>   * Test clearing a split parent from memory.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Test(timeout = 180000)<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public void testInMemoryParentCleanup() throws IOException, InterruptedException {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    final AssignmentManager am = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    final ServerManager sm = TEST_UTIL.getHBaseCluster().getMaster().getServerManager();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    final CatalogJanitor janitor = TEST_UTIL.getHBaseCluster().getMaster().getCatalogJanitor();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    admin.enableCatalogJanitor(false);<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    Table t = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    int rowCount = TEST_UTIL.loadTable(t, FAMILY, false);<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>    RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    List&lt;HRegionLocation&gt; allRegionLocations = locator.getAllRegionLocations();<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // We need to create a valid split with daughter regions<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    HRegionLocation parent = allRegionLocations.get(0);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    List&lt;HRegionLocation&gt; daughters = splitRegion(parent.getRegionInfo());<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    LOG.info("Parent region: " + parent);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    LOG.info("Daughter regions: " + daughters);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    assertNotNull("Should have found daughter regions for " + parent, daughters);<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>    assertTrue("Parent region should exist in RegionStates",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        am.getRegionStates().isRegionInRegionStates(parent.getRegionInfo()));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    assertTrue("Parent region should exist in ServerManager",<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        sm.isRegionInServerManagerStates(parent.getRegionInfo()));<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // clean the parent<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Result r = MetaMockingUtil.getMetaTableRowResult(parent.getRegionInfo(), null,<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        daughters.get(0).getRegionInfo(), daughters.get(1).getRegionInfo());<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    janitor.cleanParent(parent.getRegionInfo(), r);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertFalse("Parent region should have been removed from RegionStates",<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        am.getRegionStates().isRegionInRegionStates(parent.getRegionInfo()));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    assertFalse("Parent region should have been removed from ServerManager",<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        sm.isRegionInServerManagerStates(parent.getRegionInfo()));<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  /*<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * Splits a region<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * @param t Region to split.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * @return List of region locations<a name="line.129"></a>
+<span class="sourceLineNo">130</span> * @throws IOException, InterruptedException<a name="line.130"></a>
+<span class="sourceLineNo">131</span> */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private List&lt;HRegionLocation&gt; splitRegion(final HRegionInfo r)<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      throws IOException, InterruptedException {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    List&lt;HRegionLocation&gt; locations = new ArrayList&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    // Split this table in two.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    Connection connection = TEST_UTIL.getConnection();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    admin.splitRegion(r.getEncodedNameAsBytes());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    admin.close();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    PairOfSameType&lt;HRegionInfo&gt; regions = waitOnDaughters(r);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (regions != null) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      try (RegionLocator rl = connection.getRegionLocator(r.getTable())) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        locations.add(rl.getRegionLocation(regions.getFirst().getEncodedNameAsBytes()));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        locations.add(rl.getRegionLocation(regions.getSecond().getEncodedNameAsBytes()));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      return locations;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    return locations;<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>   * Wait on region split. May return because we waited long enough on the split<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * and it didn't happen.  Caller should check.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @param r<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @return Daughter regions; caller needs to check table actually split.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private PairOfSameType&lt;HRegionInfo&gt; waitOnDaughters(final HRegionInfo r)<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      throws IOException {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    long start = System.currentTimeMillis();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    PairOfSameType&lt;HRegionInfo&gt; pair = null;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    try (Connection conn = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>         Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Result result = null;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      HRegionInfo region = null;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      while ((System.currentTimeMillis() - start) &lt; 60000) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        result = metaTable.get(new Get(r.getRegionName()));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        if (result == null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          break;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        region = MetaTableAccessor.getHRegionInfo(result);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        if (region.isSplitParent()) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          LOG.debug(region.toString() + " IS a parent!");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          break;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        Threads.sleep(100);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>      if (pair.getFirst() == null || pair.getSecond() == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throw new IOException("Failed to get daughters, for parent region: " + r);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      return pair;<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.GoodSplitExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span c

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Put.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Put.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Put.html
index e79672a..c441fe6 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Put.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Put.html
@@ -224,306 +224,299 @@
 <span class="sourceLineNo">216</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.216"></a>
 <span class="sourceLineNo">217</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value);<a name="line.217"></a>
 <span class="sourceLineNo">218</span>    list.add(kv);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    return this;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * See {@link #addColumn(byte[], byte[], long, byte[])}. This version expects<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * that the underlying arrays won't change. It's intended<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * for usage internal HBase to and for advanced client applications.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   */<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    // Family can not be null, otherwise NullPointerException is thrown when putting the cell into familyMap<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (family == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw new IllegalArgumentException("Family cannot be null");<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>    // Check timestamp<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (ts &lt; 0) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    list.add(new IndividualBytesFieldCell(this.row, family, qualifier, ts, KeyValue.Type.Put, value));<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    familyMap.put(family, list);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return this;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * for usage internal HBase to and for advanced client applications.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * that should not be exposed publicly.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  @InterfaceAudience.Private<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    list.add(kv);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    familyMap.put(family, list);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return this;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * for usage internal HBase to and for advanced client applications.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   * that should not be exposed publicly.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  @InterfaceAudience.Private<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.267"></a>
-<span class="sourceLineNo">268</span>                          Tag[] tag) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (ts &lt; 0) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    list.add(kv);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    familyMap.put(family, list);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return this;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Add the specified column and value, with the specified timestamp as<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * its version to this Put operation.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param family family name<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param qualifier column qualifier<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param ts version timestamp<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param value column value<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @return this<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public Put addColumn(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (ts &lt; 0) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    list.add(kv);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    return this;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * See {@link #addColumn(byte[], ByteBuffer, long, ByteBuffer)}. This version expects<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * that the underlying arrays won't change. It's intended<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * for usage internal HBase to and for advanced client applications.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    if (ts &lt; 0) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    list.add(kv);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    familyMap.put(family, list);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    return this;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * Add the specified KeyValue to this Put operation.  Operation assumes that<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * the passed KeyValue is immutable and its backing array will not be modified<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * for the duration of this Put.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @param kv individual KeyValue<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return this<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws java.io.IOException e<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public Put add(Cell kv) throws IOException{<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    byte [] family = CellUtil.cloneFamily(kv);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    //Checking that the row of the kv is the same as the put<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    if (!CellUtil.matchingRow(kv, this.row)) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      throw new WrongRowIOException("The row in " + kv.toString() +<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    list.add(kv);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    familyMap.put(family, list);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return this;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  /**<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * A convenience method to determine if this object's familyMap contains<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * a value assigned to the given family &amp;amp; qualifier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   * Both given arguments must match the KeyValue object to return true.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>   *<a name="line.341"></a>
-<span class="sourceLineNo">342</span>   * @param family column family<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @param qualifier column qualifier<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * @return returns true if the given family and qualifier already has an<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   * existing KeyValue object in the family map.<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public boolean has(byte [] family, byte [] qualifier) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  return has(family, qualifier, this.ts, HConstants.EMPTY_BYTE_ARRAY, true, true);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  /**<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * A convenience method to determine if this object's familyMap contains<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   *<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param family column family<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @param qualifier column qualifier<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * @param ts timestamp<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * @return returns true if the given family, qualifier and timestamp already has an<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * existing KeyValue object in the family map.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  public boolean has(byte [] family, byte [] qualifier, long ts) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  return has(family, qualifier, ts, HConstants.EMPTY_BYTE_ARRAY, false, true);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * A convenience method to determine if this object's familyMap contains<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   *<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * @param family column family<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param qualifier column qualifier<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @param value value to check<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return returns true if the given family, qualifier and value already has an<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * existing KeyValue object in the family map.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public boolean has(byte [] family, byte [] qualifier, byte [] value) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    return has(family, qualifier, this.ts, value, true, false);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /**<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * A convenience method to determine if this object's familyMap contains<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * the given value assigned to the given family, qualifier and timestamp.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * All 4 given arguments must match the KeyValue object to return true.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   *<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * @param family column family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @param qualifier column qualifier<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param ts timestamp<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @param value value to check<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * already has an existing KeyValue object in the family map.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  public boolean has(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      return has(family, qualifier, ts, value, false, false);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>  /*<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * Private method to determine if this object's familyMap contains<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * the given value assigned to the given family, qualifier and timestamp<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * respecting the 2 boolean arguments<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   *<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @param family<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @param qualifier<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param ts<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param value<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @param ignoreTS<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   * @param ignoreValue<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * already has an existing KeyValue object in the family map.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>                      boolean ignoreTS, boolean ignoreValue) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    if (list.isEmpty()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      return false;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Boolean analysis of ignoreTS/ignoreValue.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // T T =&gt; 2<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // T F =&gt; 3 (first is always true)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // F T =&gt; 2<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // F F =&gt; 1<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    if (!ignoreTS &amp;&amp; !ignoreValue) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      for (Cell cell : list) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>            CellUtil.matchingQualifier(cell, qualifier)  &amp;&amp;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>            CellUtil.matchingValue(cell, value) &amp;&amp;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            cell.getTimestamp() == ts) {<a name="line.427"></a>
+<span class="sourceLineNo">219</span>    return this;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  /**<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * See {@link #addColumn(byte[], byte[], long, byte[])}. This version expects<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * that the underlying arrays won't change. It's intended<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * for usage internal HBase to and for advanced client applications.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // Family can not be null, otherwise NullPointerException is thrown when putting the cell into familyMap<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (family == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      throw new IllegalArgumentException("Family cannot be null");<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>    // Check timestamp<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    if (ts &lt; 0) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    list.add(new IndividualBytesFieldCell(this.row, family, qualifier, ts, KeyValue.Type.Put, value));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    return this;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * for usage internal HBase to and for advanced client applications.<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * that should not be exposed publicly.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @InterfaceAudience.Private<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    list.add(kv);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return this;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * for usage internal HBase to and for advanced client applications.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * that should not be exposed publicly.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  @InterfaceAudience.Private<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                          Tag[] tag) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (ts &lt; 0) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    list.add(kv);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    return this;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * Add the specified column and value, with the specified timestamp as<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * its version to this Put operation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param family family name<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param qualifier column qualifier<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param ts version timestamp<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @param value column value<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @return this<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  public Put addColumn(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (ts &lt; 0) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    list.add(kv);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    return this;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * See {@link #addColumn(byte[], ByteBuffer, long, ByteBuffer)}. This version expects<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * that the underlying arrays won't change. It's intended<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * for usage internal HBase to and for advanced client applications.<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    if (ts &lt; 0) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    list.add(kv);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return this;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * Add the specified KeyValue to this Put operation.  Operation assumes that<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * the passed KeyValue is immutable and its backing array will not be modified<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * for the duration of this Put.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   * @param kv individual KeyValue<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return this<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * @throws java.io.IOException e<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public Put add(Cell kv) throws IOException{<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    byte [] family = CellUtil.cloneFamily(kv);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    //Checking that the row of the kv is the same as the put<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if (!CellUtil.matchingRow(kv, this.row)) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      throw new WrongRowIOException("The row in " + kv.toString() +<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    list.add(kv);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    return this;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>  /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * A convenience method to determine if this object's familyMap contains<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * a value assigned to the given family &amp;amp; qualifier.<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * Both given arguments must match the KeyValue object to return true.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   *<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param family column family<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * @param qualifier column qualifier<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * @return returns true if the given family and qualifier already has an<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * existing KeyValue object in the family map.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   */<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  public boolean has(byte [] family, byte [] qualifier) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  return has(family, qualifier, this.ts, HConstants.EMPTY_BYTE_ARRAY, true, true);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  /**<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * A convenience method to determine if this object's familyMap contains<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   *<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * @param family column family<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * @param qualifier column qualifier<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param ts timestamp<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @return returns true if the given family, qualifier and timestamp already has an<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * existing KeyValue object in the family map.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  public boolean has(byte [] family, byte [] qualifier, long ts) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  return has(family, qualifier, ts, HConstants.EMPTY_BYTE_ARRAY, false, true);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  }<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * A convenience method to determine if this object's familyMap contains<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   *<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param family column family<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param qualifier column qualifier<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @param value value to check<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * @return returns true if the given family, qualifier and value already has an<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * existing KeyValue object in the family map.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public boolean has(byte [] family, byte [] qualifier, byte [] value) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return has(family, qualifier, this.ts, value, true, false);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  /**<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * A convenience method to determine if this object's familyMap contains<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * the given value assigned to the given family, qualifier and timestamp.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * All 4 given arguments must match the KeyValue object to return true.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param family column family<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param qualifier column qualifier<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @param ts timestamp<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @param value value to check<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * already has an existing KeyValue object in the family map.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public boolean has(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return has(family, qualifier, ts, value, false, false);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  /*<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   * Private method to determine if this object's familyMap contains<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   * the given value assigned to the given family, qualifier and timestamp<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * respecting the 2 boolean arguments<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param family<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param qualifier<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @param ts<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param value<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @param ignoreTS<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * @param ignoreValue<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * already has an existing KeyValue object in the family map.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,<a name="line.404"></a>
+<span class="sourceLineNo">405</span>                      boolean ignoreTS, boolean ignoreValue) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    if (list.isEmpty()) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      return false;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    // Boolean analysis of ignoreTS/ignoreValue.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // T T =&gt; 2<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // T F =&gt; 3 (first is always true)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // F T =&gt; 2<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    // F F =&gt; 1<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    if (!ignoreTS &amp;&amp; !ignoreValue) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      for (Cell cell : list) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            CellUtil.matchingQualifier(cell, qualifier)  &amp;&amp;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>            CellUtil.matchingValue(cell, value) &amp;&amp;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            cell.getTimestamp() == ts) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          return true;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    } else if (ignoreValue &amp;&amp; !ignoreTS) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      for (Cell cell : list) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>            &amp;&amp; cell.getTimestamp() == ts) {<a name="line.427"></a>
 <span class="sourceLineNo">428</span>          return true;<a name="line.428"></a>
 <span class="sourceLineNo">429</span>        }<a name="line.429"></a>
 <span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    } else if (ignoreValue &amp;&amp; !ignoreTS) {<a name="line.431"></a>
+<span class="sourceLineNo">431</span>    } else if (!ignoreValue &amp;&amp; ignoreTS) {<a name="line.431"></a>
 <span class="sourceLineNo">432</span>      for (Cell cell : list) {<a name="line.432"></a>
 <span class="sourceLineNo">433</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            &amp;&amp; cell.getTimestamp() == ts) {<a name="line.434"></a>
+<span class="sourceLineNo">434</span>            &amp;&amp; CellUtil.matchingValue(cell, value)) {<a name="line.434"></a>
 <span class="sourceLineNo">435</span>          return true;<a name="line.435"></a>
 <span class="sourceLineNo">436</span>        }<a name="line.436"></a>
 <span class="sourceLineNo">437</span>      }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } else if (!ignoreValue &amp;&amp; ignoreTS) {<a name="line.438"></a>
+<span class="sourceLineNo">438</span>    } else {<a name="line.438"></a>
 <span class="sourceLineNo">439</span>      for (Cell cell : list) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            &amp;&amp; CellUtil.matchingValue(cell, value)) {<a name="line.441"></a>
+<span class="sourceLineNo">440</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>            CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.441"></a>
 <span class="sourceLineNo">442</span>          return true;<a name="line.442"></a>
 <span class="sourceLineNo">443</span>        }<a name="line.443"></a>
 <span class="sourceLineNo">444</span>      }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    } else {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (Cell cell : list) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          return true;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        }<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    return false;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  /**<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * Returns a list of all KeyValue objects with matching column family and qualifier.<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   *<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * @param family column family<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * @param qualifier column qualifier<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @return a list of KeyValue objects with the matching family and qualifier,<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * returns an empty list if one doesn't exist for the given family.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  public List&lt;Cell&gt; get(byte[] family, byte[] qualifier) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    List&lt;Cell&gt; filteredList = new ArrayList&lt;&gt;();<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    for (Cell cell: getCellList(family)) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      if (CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        filteredList.add(cell);<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>    return filteredList;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public Put setAttribute(String name, byte[] value) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    return (Put) super.setAttribute(name, value);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>  @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  public Put setId(String id) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return (Put) super.setId(id);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public Put setDurability(Durability d) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return (Put) super.setDurability(d);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  public Put setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return (Put) super.setFamilyCellMap(map);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  @Override<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  public Put setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return (Put) super.setClusterIds(clusterIds);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  @Override<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  public Put setCellVisibility(CellVisibility expression) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    return (Put) super.setCellVisibility(expression);<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>  @Override<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public Put setACL(String user, Permission perms) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    return (Put) super.setACL(user, perms);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>  @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  public Put setACL(Map&lt;String, Permission&gt; perms) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return (Put) super.setACL(perms);<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>  @Override<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  public Put setTTL(long ttl) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    return (Put) super.setTTL(ttl);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>}<a name="line.518"></a>
+<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return false;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * Returns a list of all KeyValue objects with matching column family and qualifier.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   *<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * @param family column family<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @param qualifier column qualifier<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * @return a list of KeyValue objects with the matching family and qualifier,<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * returns an empty list if one doesn't exist for the given family.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public List&lt;Cell&gt; get(byte[] family, byte[] qualifier) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    List&lt;Cell&gt; filteredList = new ArrayList&lt;&gt;();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    for (Cell cell: getCellList(family)) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      if (CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        filteredList.add(cell);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return filteredList;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  public Put setAttribute(String name, byte[] value) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    return (Put) super.setAttribute(name, value);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Put setId(String id) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return (Put) super.setId(id);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public Put setDurability(Durability d) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    return (Put) super.setDurability(d);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  public Put setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    return (Put) super.setFamilyCellMap(map);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  @Override<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public Put setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    return (Put) super.setClusterIds(clusterIds);<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>  public Put setCellVisibility(CellVisibility expression) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return (Put) super.setCellVisibility(expression);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  public Put setACL(String user, Permission perms) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return (Put) super.setACL(user, perms);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  @Override<a name="line.502"></a>
+<span class="sourceLineNo">503</span>  public Put setACL(Map&lt;String, Permission&gt; perms) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    return (Put) super.setACL(perms);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>  @Override<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  public Put setTTL(long ttl) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    return (Put) super.setTTL(ttl);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>}<a name="line.511"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
index 63ba3f6..dffd28e 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
@@ -348,12 +348,12 @@
 <span class="sourceLineNo">340</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.340"></a>
 <span class="sourceLineNo">341</span>    if(set == null) {<a name="line.341"></a>
 <span class="sourceLineNo">342</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (qualifier == null) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    set.add(qualifier);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    familyMap.put(family, set);<a name="line.348"></a>
+<span class="sourceLineNo">343</span>      familyMap.put(family, set);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (qualifier == null) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    set.add(qualifier);<a name="line.348"></a>
 <span class="sourceLineNo">349</span>    return this;<a name="line.349"></a>
 <span class="sourceLineNo">350</span>  }<a name="line.350"></a>
 <span class="sourceLineNo">351</span><a name="line.351"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
index 63ba3f6..dffd28e 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
@@ -348,12 +348,12 @@
 <span class="sourceLineNo">340</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.340"></a>
 <span class="sourceLineNo">341</span>    if(set == null) {<a name="line.341"></a>
 <span class="sourceLineNo">342</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (qualifier == null) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    set.add(qualifier);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    familyMap.put(family, set);<a name="line.348"></a>
+<span class="sourceLineNo">343</span>      familyMap.put(family, set);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (qualifier == null) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    set.add(qualifier);<a name="line.348"></a>
 <span class="sourceLineNo">349</span>    return this;<a name="line.349"></a>
 <span class="sourceLineNo">350</span>  }<a name="line.350"></a>
 <span class="sourceLineNo">351</span><a name="line.351"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index da2d408..44e3437 100644
--- a/book.html
+++ b/book.html
@@ -34988,7 +34988,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2017-07-18 21:29:11 UTC
+Last updated 2017-08-12 14:29:42 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index fa322d5..f60d1d3 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -311,7 +311,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Append.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Append.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Append.html
index ed040f4..b68c723 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Append.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Append.html
@@ -145,10 +145,10 @@
 <span class="sourceLineNo">137</span>    List&lt;Cell&gt; list = this.familyMap.get(family);<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    if (list == null) {<a name="line.138"></a>
 <span class="sourceLineNo">139</span>      list  = new ArrayList&lt;&gt;(1);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // find where the new entry should be placed in the List<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    list.add(cell);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    this.familyMap.put(family, list);<a name="line.143"></a>
+<span class="sourceLineNo">140</span>      this.familyMap.put(family, list);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    // find where the new entry should be placed in the List<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    list.add(cell);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>    return this;<a name="line.144"></a>
 <span class="sourceLineNo">145</span>  }<a name="line.145"></a>
 <span class="sourceLineNo">146</span><a name="line.146"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Delete.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
index d18ceec..8004358 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
@@ -191,9 +191,9 @@
 <span class="sourceLineNo">183</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.183"></a>
 <span class="sourceLineNo">184</span>    if (list == null) {<a name="line.184"></a>
 <span class="sourceLineNo">185</span>      list = new ArrayList&lt;&gt;(1);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    list.add(kv);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    familyMap.put(family, list);<a name="line.188"></a>
+<span class="sourceLineNo">186</span>      familyMap.put(family, list);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    list.add(kv);<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    return this;<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>
@@ -227,12 +227,12 @@
 <span class="sourceLineNo">219</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.219"></a>
 <span class="sourceLineNo">220</span>    if(list == null) {<a name="line.220"></a>
 <span class="sourceLineNo">221</span>      list = new ArrayList&lt;&gt;(1);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    } else if(!list.isEmpty()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      list.clear();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    KeyValue kv = new KeyValue(row, family, null, timestamp, KeyValue.Type.DeleteFamily);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    list.add(kv);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    familyMap.put(family, list);<a name="line.227"></a>
+<span class="sourceLineNo">222</span>      familyMap.put(family, list);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } else if(!list.isEmpty()) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      list.clear();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    KeyValue kv = new KeyValue(row, family, null, timestamp, KeyValue.Type.DeleteFamily);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    list.add(kv);<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    return this;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
@@ -247,10 +247,10 @@
 <span class="sourceLineNo">239</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    if(list == null) {<a name="line.240"></a>
 <span class="sourceLineNo">241</span>      list = new ArrayList&lt;&gt;(1);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    list.add(new KeyValue(row, family, null, timestamp,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          KeyValue.Type.DeleteFamilyVersion));<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    familyMap.put(family, list);<a name="line.245"></a>
+<span class="sourceLineNo">242</span>      familyMap.put(family, list);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    list.add(new KeyValue(row, family, null, timestamp,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          KeyValue.Type.DeleteFamilyVersion));<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    return this;<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  }<a name="line.247"></a>
 <span class="sourceLineNo">248</span><a name="line.248"></a>
@@ -280,10 +280,10 @@
 <span class="sourceLineNo">272</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.272"></a>
 <span class="sourceLineNo">273</span>    if (list == null) {<a name="line.273"></a>
 <span class="sourceLineNo">274</span>      list = new ArrayList&lt;&gt;(1);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    list.add(new KeyValue(this.row, family, qualifier, timestamp,<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        KeyValue.Type.DeleteColumn));<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    familyMap.put(family, list);<a name="line.278"></a>
+<span class="sourceLineNo">275</span>      familyMap.put(family, list);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    list.add(new KeyValue(this.row, family, qualifier, timestamp,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        KeyValue.Type.DeleteColumn));<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>
@@ -315,10 +315,10 @@
 <span class="sourceLineNo">307</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.307"></a>
 <span class="sourceLineNo">308</span>    if(list == null) {<a name="line.308"></a>
 <span class="sourceLineNo">309</span>      list = new ArrayList&lt;&gt;(1);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    KeyValue kv = new KeyValue(this.row, family, qualifier, timestamp, KeyValue.Type.Delete);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    list.add(kv);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    familyMap.put(family, list);<a name="line.313"></a>
+<span class="sourceLineNo">310</span>      familyMap.put(family, list);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    KeyValue kv = new KeyValue(this.row, family, qualifier, timestamp, KeyValue.Type.Delete);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    list.add(kv);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span><a name="line.316"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Get.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Get.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Get.html
index 48420d2..5f2f9af 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Get.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Get.html
@@ -213,12 +213,12 @@
 <span class="sourceLineNo">205</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    if(set == null) {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (qualifier == null) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    set.add(qualifier);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    familyMap.put(family, set);<a name="line.213"></a>
+<span class="sourceLineNo">208</span>      familyMap.put(family, set);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    if (qualifier == null) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    set.add(qualifier);<a name="line.213"></a>
 <span class="sourceLineNo">214</span>    return this;<a name="line.214"></a>
 <span class="sourceLineNo">215</span>  }<a name="line.215"></a>
 <span class="sourceLineNo">216</span><a name="line.216"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/apidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Increment.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
index a49bc05..0dbe2fb 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
@@ -110,242 +110,240 @@
 <span class="sourceLineNo">102</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.102"></a>
 <span class="sourceLineNo">103</span>    }<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    list.add(cell);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    familyMap.put(family, list);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    return this;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /**<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * Increment the column from the specific family with the specified qualifier<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * by the specified amount.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * &lt;p&gt;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * Overrides previous calls to addColumn for this family and qualifier.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @param family family name<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param qualifier column qualifier<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * @param amount amount to increment by<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @return the Increment object<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public Increment addColumn(byte [] family, byte [] qualifier, long amount) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (family == null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      throw new IllegalArgumentException("family cannot be null");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    list.add(kv);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return this;<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>   * Gets the TimeRange used for this increment.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @return TimeRange<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  public TimeRange getTimeRange() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    return this.tr;<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>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * Sets the TimeRange to be used on the Get for this increment.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * &lt;p&gt;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * This is useful for when you have counters that only last for specific<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * periods of time (ie. counters that are partitioned by time).  By setting<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * the range of valid times for this increment, you can potentially gain<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * some performance with a more optimal Get operation.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * &lt;p&gt;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * This range is used as [minStamp, maxStamp).<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @throws IOException if invalid time range<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @return this<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   */<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public Increment setTimeRange(long minStamp, long maxStamp)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  throws IOException {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  <a name="line.157"></a>
-<span class="sourceLineNo">158</span>  /**<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param returnResults True (default) if the increment operation should return the results. A<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   *          client that is not interested in the result can save network bandwidth setting this<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   *          to false.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public Increment setReturnResults(boolean returnResults) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    super.setReturnResults(returnResults);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    return this;<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>   * @return current setting for returnResults<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  // This method makes public the superclasses's protected method.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public boolean isReturnResults() {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    return super.isReturnResults();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * Method for retrieving the number of families to increment from<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @return number of families<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public int numFamilies() {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    return this.familyMap.size();<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>   * Method for checking if any families have been inserted into this Increment<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return true if familyMap is non empty false otherwise<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public boolean hasFamilies() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return !this.familyMap.isEmpty();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  /**<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * Before 0.95, when you called Increment#getFamilyMap(), you got back<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * a map of families to a list of Longs.  Now, {@link #getFamilyCellMap()} returns<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * families by list of Cells.  This method has been added so you can have the<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * old behavior.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @return Map of families to a Map of qualifiers and their Long increments.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @since 0.95.0<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public Map&lt;byte[], NavigableMap&lt;byte [], Long&gt;&gt; getFamilyMapOfLongs() {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map = super.getFamilyCellMap();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    Map&lt;byte [], NavigableMap&lt;byte[], Long&gt;&gt; results = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: map.entrySet()) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      NavigableMap&lt;byte [], Long&gt; longs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      for (Cell cell: entry.getValue()) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        longs.put(CellUtil.cloneQualifier(cell),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      results.put(entry.getKey(), longs);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return results;<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>   * @return String<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  @Override<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public String toString() {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    StringBuilder sb = new StringBuilder();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    sb.append("row=");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    sb.append(Bytes.toStringBinary(this.row));<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    if(this.familyMap.isEmpty()) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      sb.append(", no columns set to be incremented");<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      return sb.toString();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    sb.append(", families=");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    boolean moreThanOne = false;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: this.familyMap.entrySet()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      if(moreThanOne) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        sb.append("), ");<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        moreThanOne = true;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        sb.append("{");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      sb.append("(family=");<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      sb.append(Bytes.toString(entry.getKey()));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      sb.append(", columns=");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      if(entry.getValue() == null) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        sb.append("NONE");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      } else {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        sb.append("{");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        boolean moreThanOneB = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        for(Cell cell : entry.getValue()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          if(moreThanOneB) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>            sb.append(", ");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          } else {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            moreThanOneB = true;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          sb.append(CellUtil.getCellKeyAsString(cell) + "+=" +<a name="line.250"></a>
-<span class="sourceLineNo">251</span>              Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        sb.append("}");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    sb.append("}");<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return sb.toString();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public int compareTo(Row i) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return Bytes.compareTo(this.getRow(), i.getRow());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  @Override<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public int hashCode() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // TODO: This is wrong.  Can't have two gets the same just because on same row.  But it<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // matches how equals works currently and gets rid of the findbugs warning.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return Bytes.hashCode(this.getRow());<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>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public boolean equals(Object obj) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (this == obj) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      return true;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      return false;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    Row other = (Row) obj;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return compareTo(other) == 0;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  protected long extraHeapSize(){<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    return HEAP_OVERHEAD;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public Increment setAttribute(String name, byte[] value) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    return (Increment) super.setAttribute(name, value);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Override<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public Increment setId(String id) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    return (Increment) super.setId(id);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  @Override<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public Increment setDurability(Durability d) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return (Increment) super.setDurability(d);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  @Override<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public Increment setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return (Increment) super.setFamilyCellMap(map);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public Increment setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    return (Increment) super.setClusterIds(clusterIds);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public Increment setCellVisibility(CellVisibility expression) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    return (Increment) super.setCellVisibility(expression);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public Increment setACL(String user, Permission perms) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    return (Increment) super.setACL(user, perms);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  public Increment setACL(Map&lt;String, Permission&gt; perms) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    return (Increment) super.setACL(perms);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  @Override<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public Increment setTTL(long ttl) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    return (Increment) super.setTTL(ttl);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  @Override<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public Increment setPriority(int priority) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    return (Increment) super.setPriority(priority);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>}<a name="line.340"></a>
+<span class="sourceLineNo">105</span>    return this;<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>  /**<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * Increment the column from the specific family with the specified qualifier<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * by the specified amount.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * &lt;p&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Overrides previous calls to addColumn for this family and qualifier.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param family family name<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @param qualifier column qualifier<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @param amount amount to increment by<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return the Increment object<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public Increment addColumn(byte [] family, byte [] qualifier, long amount) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (family == null) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      throw new IllegalArgumentException("family cannot be null");<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    list.add(kv);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return this;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * Gets the TimeRange used for this increment.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @return TimeRange<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public TimeRange getTimeRange() {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return this.tr;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Sets the TimeRange to be used on the Get for this increment.<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * &lt;p&gt;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * This is useful for when you have counters that only last for specific<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * periods of time (ie. counters that are partitioned by time).  By setting<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * the range of valid times for this increment, you can potentially gain<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * some performance with a more optimal Get operation.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * &lt;p&gt;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * This range is used as [minStamp, maxStamp).<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @throws IOException if invalid time range<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * @return this<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public Increment setTimeRange(long minStamp, long maxStamp)<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  throws IOException {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    return this;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  <a name="line.155"></a>
+<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param returnResults True (default) if the increment operation should return the results. A<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   *          client that is not interested in the result can save network bandwidth setting this<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   *          to false.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public Increment setReturnResults(boolean returnResults) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    super.setReturnResults(returnResults);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return this;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @return current setting for returnResults<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  // This method makes public the superclasses's protected method.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public boolean isReturnResults() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return super.isReturnResults();<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>  /**<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * Method for retrieving the number of families to increment from<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @return number of families<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public int numFamilies() {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return this.familyMap.size();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * Method for checking if any families have been inserted into this Increment<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @return true if familyMap is non empty false otherwise<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public boolean hasFamilies() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    return !this.familyMap.isEmpty();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  /**<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * Before 0.95, when you called Increment#getFamilyMap(), you got back<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * a map of families to a list of Longs.  Now, {@link #getFamilyCellMap()} returns<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * families by list of Cells.  This method has been added so you can have the<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * old behavior.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @return Map of families to a Map of qualifiers and their Long increments.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @since 0.95.0<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  public Map&lt;byte[], NavigableMap&lt;byte [], Long&gt;&gt; getFamilyMapOfLongs() {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map = super.getFamilyCellMap();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Map&lt;byte [], NavigableMap&lt;byte[], Long&gt;&gt; results = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: map.entrySet()) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      NavigableMap&lt;byte [], Long&gt; longs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      for (Cell cell: entry.getValue()) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        longs.put(CellUtil.cloneQualifier(cell),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>            Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      results.put(entry.getKey(), longs);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return results;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @return String<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public String toString() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    StringBuilder sb = new StringBuilder();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    sb.append("row=");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    sb.append(Bytes.toStringBinary(this.row));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if(this.familyMap.isEmpty()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      sb.append(", no columns set to be incremented");<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return sb.toString();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    sb.append(", families=");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    boolean moreThanOne = false;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: this.familyMap.entrySet()) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if(moreThanOne) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        sb.append("), ");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        moreThanOne = true;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        sb.append("{");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      sb.append("(family=");<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      sb.append(Bytes.toString(entry.getKey()));<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      sb.append(", columns=");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      if(entry.getValue() == null) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        sb.append("NONE");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } else {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        sb.append("{");<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        boolean moreThanOneB = false;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        for(Cell cell : entry.getValue()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          if(moreThanOneB) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            sb.append(", ");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          } else {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            moreThanOneB = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          sb.append(CellUtil.getCellKeyAsString(cell) + "+=" +<a name="line.248"></a>
+<span class="sourceLineNo">249</span>              Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        sb.append("}");<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>    sb.append("}");<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return sb.toString();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  public int compareTo(Row i) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    return Bytes.compareTo(this.getRow(), i.getRow());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public int hashCode() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // TODO: This is wrong.  Can't have two gets the same just because on same row.  But it<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // matches how equals works currently and gets rid of the findbugs warning.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return Bytes.hashCode(this.getRow());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public boolean equals(Object obj) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (this == obj) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return true;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      return false;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Row other = (Row) obj;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    return compareTo(other) == 0;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  protected long extraHeapSize(){<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    return HEAP_OVERHEAD;<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>  @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public Increment setAttribute(String name, byte[] value) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return (Increment) super.setAttribute(name, value);<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>  public Increment setId(String id) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return (Increment) super.setId(id);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Increment setDurability(Durability d) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return (Increment) super.setDurability(d);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Increment setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return (Increment) super.setFamilyCellMap(map);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public Increment setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return (Increment) super.setClusterIds(clusterIds);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  @Override<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  public Increment setCellVisibility(CellVisibility expression) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return (Increment) super.setCellVisibility(expression);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>  @Override<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  public Increment setACL(String user, Permission perms) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return (Increment) super.setACL(user, perms);<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public Increment setACL(Map&lt;String, Permission&gt; perms) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    return (Increment) super.setACL(perms);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public Increment setTTL(long ttl) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return (Increment) super.setTTL(ttl);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public Increment setPriority(int priority) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return (Increment) super.setPriority(priority);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>}<a name="line.338"></a>
 
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? old

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 02b9356..7ef078b 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -289,7 +289,7 @@
 <td>2024</td>
 <td>0</td>
 <td>0</td>
-<td>12799</td></tr></table></div>
+<td>12796</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -2992,7 +2992,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.CatalogJanitor.java">org/apache/hadoop/hbase/master/CatalogJanitor.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>29</td></tr>
+<td>28</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterSchemaServiceImpl.java">org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java</a></td>
 <td>0</td>
@@ -3012,7 +3012,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.HMaster.java">org/apache/hadoop/hbase/master/HMaster.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>254</td></tr>
+<td>252</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</a></td>
 <td>0</td>
@@ -6986,7 +6986,7 @@
 <li>ordered: <tt>&quot;true&quot;</tt></li>
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>1000</td>
+<td>998</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -7009,19 +7009,19 @@
 <li>caseIndent: <tt>&quot;2&quot;</tt></li>
 <li>basicOffset: <tt>&quot;2&quot;</tt></li>
 <li>lineWrappingIndentation: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>3855</td>
+<td>3854</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>javadoc</td>
 <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>760</td>
+<td>765</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>3232</td>
+<td>3227</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -12913,7 +12913,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 43 has parse error. Missed HTML close tag 'TableName'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>181</td></tr>
 <tr class="a">
@@ -16765,7 +16765,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 64 has parse error. Missed HTML close tag 'code'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>2112</td></tr>
 <tr class="b">
@@ -17832,121 +17832,121 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
+<td>130</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>130</td></tr>
+<td>131</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>131</td></tr>
+<td>132</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>132</td></tr>
+<td>133</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>240</td></tr>
+<td>241</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>334</td></tr>
+<td>335</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>344</td></tr>
+<td>345</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>348</td></tr>
+<td>349</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>355</td></tr>
+<td>356</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>367</td></tr>
+<td>368</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>371</td></tr>
+<td>372</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>378</td></tr>
+<td>379</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>380</td></tr>
+<td>381</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>382</td></tr>
+<td>383</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>383</td></tr>
+<td>384</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>481</td></tr>
+<td>482</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>530</td></tr>
+<td>531</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>539</td></tr>
+<td>540</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>540</td></tr>
+<td>541</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>542</td></tr></table></div>
+<td>543</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Operation.java">org/apache/hadoop/hbase/client/Operation.java</h3>
 <table border="0" class="table table-striped">
@@ -18126,61 +18126,61 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
-<td>229</td></tr>
+<td>228</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 102).</td>
-<td>240</td></tr>
+<td>239</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>345</td></tr>
+<td>338</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 2, expected level should be 4.</td>
-<td>348</td></tr>
+<td>341</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>360</td></tr>
+<td>353</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 2, expected level should be 4.</td>
-<td>363</td></tr>
+<td>356</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>375</td></tr>
+<td>368</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>391</td></tr>
+<td>384</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 6, expected level should be 4.</td>
-<td>394</td></tr>
+<td>387</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>462</td></tr></table></div>
+<td>455</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Query.java">org/apache/hadoop/hbase/client/Query.java</h3>
 <table border="0" class="table table-striped">
@@ -22354,7 +22354,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 37 has parse error. Details: no viable alternative at input '&lt;ColumnFamily,' while parsing HTML_ELEMENT</td>
 <td>29</td></tr></table></div>
 <div class="section">
@@ -39819,125 +39819,119 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>233</td></tr>
+<td>238</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child have incorrect indentation level 12, expected level should be 10.</td>
-<td>285</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>317</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>311</td></tr>
+<td>318</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>312</td></tr>
+<td>321</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>315</td></tr>
+<td>324</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>318</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>332</td></tr>
-<tr class="b">
+<td>338</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>333</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>365</td></tr>
+<td>339</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>366</td></tr>
+<td>374</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>379</td></tr>
+<td>375</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>380</td></tr>
+<td>388</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>389</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>381</td></tr>
-<tr class="b">
+<td>390</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>414</td></tr>
-<tr class="a">
+<td>423</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>434</td></tr>
-<tr class="b">
+<td>443</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>436</td></tr></table></div>
+<td>445</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ClusterSchemaServiceImpl.java">org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -39946,79 +39940,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ClusterStatusPublisher.java">org/apache/hadoop/hbase/master/ClusterStatusPublisher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 6, expected level should be 8.</td>
 <td>287</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 10, expected level should be 8.</td>
 <td>304</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 10, expected level should be 8.</td>
 <td>305</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' have incorrect indentation level 10, expected level should be 8.</td>
 <td>310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child have incorrect indentation level 12, expected level should be 10.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' have incorrect indentation level 10, expected level should be 8.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child have incorrect indentation level 14, expected level should be 10.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' have incorrect indentation level 10, expected level should be 8.</td>
 <td>316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 10, expected level should be 8.</td>
 <td>321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'class def rcurly' have incorrect indentation level 2, expected level should be 4.</td>
 <td>323</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -40027,43 +40021,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.DeadServer.java">org/apache/hadoop/hbase/master/DeadServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.ServerName' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 58 should have line break after.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -40072,1531 +40066,1519 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HMaster.java">org/apache/hadoop/hbase/master/HMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.ClusterStatus' import.</td>
-<td>57</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting' import.</td>
-<td>203</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
 <td>Wrong order for 'com.google.protobuf.Descriptors' import.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>419</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 7, expected level should be 6.</td>
 <td>422</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 7, expected level should be 6.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>435</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>436</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>438</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>439</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>440</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>441</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>445</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>569</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>697</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 204 lines (max allowed is 150).</td>
 <td>728</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>816</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>828</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1007</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1076</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1078</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1080</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1082</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1084</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1092</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1093</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1096</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td>1097</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1332</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1545</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1561</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1568</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1571</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1572</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1574</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1576</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1577</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1578</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1588</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1590</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1591</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1594</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1595</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1597</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1599</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1600</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1601</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1620</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1622</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1716</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1718</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1720</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1724</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1725</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1727</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1729</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1730</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1732</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1734</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1735</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1736</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1766</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2032</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2040</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2047</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2055</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2078</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2080</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2082</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2085</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2086</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2088</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2090</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2091</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2093</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2095</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2096</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2097</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2218</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2220</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>2224</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2226</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2233</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
 <td>2260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
 <td>2261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 16, expected level should be one of the following: 18, 20.</td>
 <td>2262</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
 <td>2264</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2268</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2271</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2278</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2279</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2286</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2288</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2289</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2290</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2302</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2304</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2314</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2319</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2323</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2370</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2377</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2380</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2382</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2383</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2388</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2389</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2409</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2411</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2412</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2577</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2657</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2658</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2782</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2856</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2858</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2859</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2860</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2861</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2864</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2865</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2866</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2868</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2870</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2871</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2872</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2892</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2893</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2894</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2895</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2898</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2899</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2900</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2902</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2904</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2905</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2906</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2922</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2924</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2925</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2926</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2927</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2930</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2931</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2932</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2934</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2936</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2937</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2938</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2948</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2950</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2967</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>3027</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3074</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>3077</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3084</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -41605,31 +41587,31 @@
 <div class="section">
 <h3 id="org.apache.hadoo

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
index 733db97..5c098b2 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":9,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":9,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":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";
@@ -436,56 +436,60 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </tr>
 <tr id="i43" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInRegionStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInRegionStates</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
+</tr>
+<tr id="i44" class="altColor">
+<td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">isRegionInState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInTransition-org.apache.hadoop.hbase.HRegionInfo-">isRegionInTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOffline-org.apache.hadoop.hbase.HRegionInfo-">isRegionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOnline-org.apache.hadoop.hbase.HRegionInfo-">isRegionOnline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#logSplit-org.apache.hadoop.hbase.HRegionInfo-">logSplit</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#logSplit-org.apache.hadoop.hbase.ServerName-">logSplit</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#regionNamesToString-java.util.Collection-">regionNamesToString</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromFailedOpen-org.apache.hadoop.hbase.HRegionInfo-">removeFromFailedOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromOfflineRegions-org.apache.hadoop.hbase.HRegionInfo-">removeFromOfflineRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeRegionFromServer-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">removeRegionFromServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" 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/RegionStates.html#removeRegionInTransition-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure-">removeRegionInTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeServer-org.apache.hadoop.hbase.ServerName-">removeServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#updateRegionState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-">updateRegionState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                  <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state)</code>&nbsp;</td>
@@ -630,13 +634,22 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.428">clear</a>()</pre>
 </li>
 </ul>
+<a name="isRegionInRegionStates-org.apache.hadoop.hbase.HRegionInfo-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isRegionInRegionStates</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.436">isRegionInRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
+</li>
+</ul>
 <a name="createRegionNode-org.apache.hadoop.hbase.HRegionInfo-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionNode</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.438">createRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.444">createRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getOrCreateRegionNode-org.apache.hadoop.hbase.HRegionInfo-">
@@ -645,7 +658,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrCreateRegionNode</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.444">getOrCreateRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.450">getOrCreateRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionNodeFromName-byte:A-">
@@ -654,7 +667,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNodeFromName</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.449">getRegionNodeFromName</a>(byte[]&nbsp;regionName)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.455">getRegionNodeFromName</a>(byte[]&nbsp;regionName)</pre>
 </li>
 </ul>
 <a name="getRegionNode-org.apache.hadoop.hbase.HRegionInfo-">
@@ -663,7 +676,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNode</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.453">getRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.459">getRegionNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionNodeFromEncodedName-java.lang.String-">
@@ -672,7 +685,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNodeFromEncodedName</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.457">getRegionNodeFromEncodedName</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.463">getRegionNodeFromEncodedName</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
 </li>
 </ul>
 <a name="deleteRegion-org.apache.hadoop.hbase.HRegionInfo-">
@@ -681,7 +694,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.467">deleteRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.473">deleteRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getTableRegionStateNodes-org.apache.hadoop.hbase.TableName-">
@@ -690,7 +703,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionStateNodes</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.476">getTableRegionStateNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.482">getTableRegionStateNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getTableRegionStates-org.apache.hadoop.hbase.TableName-">
@@ -699,7 +712,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionStates</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.485">getTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.491">getTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getTableRegionsInfo-org.apache.hadoop.hbase.TableName-">
@@ -708,7 +721,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionsInfo</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.494">getTableRegionsInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.500">getTableRegionsInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionNodes--">
@@ -717,7 +730,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNodes</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.503">getRegionNodes</a>()</pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.509">getRegionNodes</a>()</pre>
 </li>
 </ul>
 <a name="getRegionStates--">
@@ -726,7 +739,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStates</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.507">getRegionStates</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.513">getRegionStates</a>()</pre>
 </li>
 </ul>
 <a name="getRegionState-org.apache.hadoop.hbase.HRegionInfo-">
@@ -735,7 +748,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.518">getRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.524">getRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionState-java.lang.String-">
@@ -744,7 +757,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.522">getRegionState</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.528">getRegionState</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
 </li>
 </ul>
 <a name="createRegionState-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">
@@ -753,7 +766,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionState</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.526">createRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.532">createRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node)</pre>
 </li>
 </ul>
 <a name="hasTableRegionStates-org.apache.hadoop.hbase.TableName-">
@@ -762,7 +775,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hasTableRegionStates</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.535">hasTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.541">hasTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionsOfTable-org.apache.hadoop.hbase.TableName-">
@@ -771,7 +784,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTable</h4>
-<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.540">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
+<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.546">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 </li>
 </ul>
 <a name="getRegionsOfTable-org.apache.hadoop.hbase.TableName-boolean-">
@@ -780,7 +793,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTable</h4>
-<pre><a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.544">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
+<pre><a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.550">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                                     boolean&nbsp;offline)</pre>
 </li>
 </ul>
@@ -790,7 +803,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>include</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.559">include</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node,
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.565">include</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node,
                 boolean&nbsp;offline)</pre>
 <div class="block">Utility. Whether to include region in list of regions. Default is to
  weed out split and offline regions.</div>
@@ -807,7 +820,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerRegionInfoSet</h4>
-<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.575">getServerRegionInfoSet</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.581">getServerRegionInfoSet</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Returns the set of regions hosted by the specified server</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -823,7 +836,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>logSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.587">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.593">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="logSplit-org.apache.hadoop.hbase.HRegionInfo-">
@@ -832,7 +845,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>logSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.601">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.607">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="updateRegionState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-">
@@ -841,7 +854,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionState</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.609">updateRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.615">updateRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                               <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state)</pre>
 </li>
 </ul>
@@ -851,7 +864,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignedRegions</h4>
-<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.619">getAssignedRegions</a>()</pre>
+<pre>public&nbsp;<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.625">getAssignedRegions</a>()</pre>
 </li>
 </ul>
 <a name="isRegionInState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">
@@ -860,7 +873,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionInState</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.629">isRegionInState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.635">isRegionInState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;state)</pre>
 </li>
 </ul>
@@ -870,7 +883,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.639">isRegionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.645">isRegionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="isRegionOffline-org.apache.hadoop.hbase.HRegionInfo-">
@@ -879,7 +892,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOffline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.646">isRegionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.652">isRegionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if region is offline (In OFFLINE or CLOSED state).</dd>
@@ -892,7 +905,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapShotOfAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.650">getSnapShotOfAssignment</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.656">getSnapShotOfAssignment</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="getRegionAssignments--">
@@ -901,7 +914,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionAssignments</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.672">getRegionAssignments</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.678">getRegionAssignments</a>()</pre>
 </li>
 </ul>
 <a name="getRegionByStateOfTable-org.apache.hadoop.hbase.TableName-">
@@ -910,7 +923,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionByStateOfTable</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.680">getRegionByStateOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.686">getRegionByStateOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionServerOfRegion-org.apache.hadoop.hbase.HRegionInfo-">
@@ -919,7 +932,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerOfRegion</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.696">getRegionServerOfRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.702">getRegionServerOfRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getAssignmentsByTable-boolean-">
@@ -928,7 +941,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentsByTable</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.715">getAssignmentsByTable</a>(boolean&nbsp;forceByCluster)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.721">getAssignmentsByTable</a>(boolean&nbsp;forceByCluster)</pre>
 <div class="block">This is an EXPENSIVE clone.  Cloning though is the safest thing to do.
  Can't let out original since it can change and at least the load balancer
  wants to iterate this exported list.  We need to synchronize on regions
@@ -947,7 +960,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentsByTable</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.732">getAssignmentsByTable</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.738">getAssignmentsByTable</a>()</pre>
 </li>
 </ul>
 <a name="addRegionInTransition-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure-">
@@ -956,7 +969,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionInTransition</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.760">addRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.766">addRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</pre>
 </li>
 </ul>
@@ -966,7 +979,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRegionInTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.768">removeRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.774">removeRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</pre>
 </li>
 </ul>
@@ -976,7 +989,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.774">hasRegionsInTransition</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.780">hasRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="isRegionInTransition-org.apache.hadoop.hbase.HRegionInfo-">
@@ -985,7 +998,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.778">isRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.784">isRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionTransitionProcedure-org.apache.hadoop.hbase.HRegionInfo-">
@@ -994,7 +1007,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionTransitionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.786">getRegionTransitionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.792">getRegionTransitionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>If a procedure-in-transition for <code>hri</code>, return it else null.</dd>
@@ -1007,7 +1020,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionTransitionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.792">getRegionTransitionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.798">getRegionTransitionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
 </li>
 </ul>
 <a name="getRegionsInTransition--">
@@ -1016,7 +1029,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInTransition</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.801">getRegionsInTransition</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.807">getRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsInTransitionCount--">
@@ -1025,7 +1038,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInTransitionCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.808">getRegionsInTransitionCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.814">getRegionsInTransitionCount</a>()</pre>
 <div class="block">Get the number of regions in transition.</div>
 </li>
 </ul>
@@ -1035,7 +1048,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsStateInTransition</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.812">getRegionsStateInTransition</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.818">getRegionsStateInTransition</a>()</pre>
 </li>
 </ul>
 <a name="getRegionsInTransitionOrderedByTimestamp--">
@@ -1044,7 +1057,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInTransitionOrderedByTimestamp</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.820">getRegionsInTransitionOrderedByTimestamp</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.826">getRegionsInTransitionOrderedByTimestamp</a>()</pre>
 </li>
 </ul>
 <a name="addToOfflineRegions-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">
@@ -1053,7 +1066,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>addToOfflineRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.832">addToOfflineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.838">addToOfflineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
 <a name="removeFromOfflineRegions-org.apache.hadoop.hbase.HRegionInfo-">
@@ -1062,7 +1075,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removeFromOfflineRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.838">removeFromOfflineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.844">removeFromOfflineRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="addToFailedOpen-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">
@@ -1071,7 +1084,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>addToFailedOpen</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionFailedOpen</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.880">addToFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionFailedOpen</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.886">addToFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
 <a name="getFailedOpen-org.apache.hadoop.hbase.HRegionInfo-">
@@ -1080,7 +1093,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getFailedOpen</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionFailedOpen</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.891">getFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionFailedOpen</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.897">getFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="removeFromFailedOpen-org.apache.hadoop.hbase.HRegionInfo-">
@@ -1089,7 +1102,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removeFromFailedOpen</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.895">removeFromFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.901">removeFromFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionFailedOpen--">
@@ -1098,7 +1111,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionFailedOpen</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.899">getRegionFailedOpen</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.905">getRegionFailedOpen</a>()</pre>
 </li>
 </ul>
 <a name="getOrCreateServer-org.apache.hadoop.hbase.ServerName-">
@@ -1107,7 +1120,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrCreateServer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.912">getOrCreateServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.918">getOrCreateServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="removeServer-org.apache.hadoop.hbase.ServerName-">
@@ -1116,7 +1129,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removeServer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.922">removeServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.928">removeServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="getServerNode-org.apache.hadoop.hbase.ServerName-">
@@ -1125,7 +1138,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerNode</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.926">getServerNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.932">getServerNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="getAverageLoad--">
@@ -1134,7 +1147,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAverageLoad</h4>
-<pre>public&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.930">getAverageLoad</a>()</pre>
+<pre>public&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.936">getAverageLoad</a>()</pre>
 </li>
 </ul>
 <a name="addRegionToServer-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">
@@ -1143,7 +1156,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToServer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.940">addRegionToServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.946">addRegionToServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
@@ -1153,7 +1166,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRegionFromServer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.947">removeRegionFromServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.953">removeRegionFromServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                                            <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
@@ -1163,7 +1176,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionNamesToString</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.957">regionNamesToString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;regions)</pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.963">regionNamesToString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 86c040e..97f2062 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -312,9 +312,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/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/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 9f03eb0..5f842b2 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -211,9 +211,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/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/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">DisableTableProcedure.MarkRegionOfflineOpResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 3c8dbc3..ecd804d 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -422,16 +422,16 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ProcedureState.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.Modify</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.Modify</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
 </ul>
 </li>
 </ul>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span class="sourceLineNo">918</span> 

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index ce30421..691d6ad 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2017 The Apache Software Foundation</copyright>
     <item>
       <title>File: 2024,
-             Errors: 12799,
+             Errors: 12796,
              Warnings: 0,
              Infos: 0
       </title>
@@ -17359,7 +17359,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  254
+                  252
                 </td>
               </tr>
                           <tr>
@@ -24149,7 +24149,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  29
+                  28
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 56c6c24..f5a2ad2 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -380,7 +380,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index e2d08c0..1010ac9 100644
--- a/cygwin.html
+++ b/cygwin.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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -679,7 +679,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 6e6752f..ba197a7 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -527,7 +527,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 8bb1fbb..513cf44 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -722,7 +722,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 8b55be2..751bce4 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -318,7 +318,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index e4a62ec..551d0ad 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -912,7 +912,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index ff334a9..bb57548 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3836,21 +3836,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri Aug 11 14:40:23 UTC 2017"</code></td>
+<td class="colLast"><code>"Sat Aug 12 14:41:08 UTC 2017"</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="http://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>"043ec9b37e43328e8784f88e3d6867b007a31d1d"</code></td>
+<td class="colLast"><code>"173dce73471da005fb6780a7e7b65b43bad481e2"</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="http://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>"ea21724ef60501efdfac991680f85c00"</code></td>
+<td class="colLast"><code>"0b5fe4e50617b899e986f38527f3404c"</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/c0fcd7f3/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 8e77a9e..54d424b 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -59867,6 +59867,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CompactionTool.html#isRegionDir-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">isRegionDir(FileSystem, Path)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CompactionTool.html" title="class in org.apache.hadoop.hbase.regionserver">CompactionTool</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInRegionStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInRegionStates(HRegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/ServerManager.html#isRegionInServerManagerStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInServerManagerStates(HRegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">isRegionInState(HRegionInfo, RegionState.State...)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInTransition-org.apache.hadoop.hbase.HRegionInfo-">isRegionInTransition(HRegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 f631cbd..2ad1f75 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -166,10 +166,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html b/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
index f99d8d9..ab0d7e3 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
@@ -2521,13 +2521,17 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                   byte[]&nbsp;familyName)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">ServerManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#isRegionInServerManagerStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInServerManagerStates</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><span class="typeNameLabel">HMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#mergeRegions-org.apache.hadoop.hbase.HRegionInfo:A-boolean-long-long-">mergeRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
             boolean&nbsp;forcible,
             long&nbsp;nonceGroup,
             long&nbsp;nonce)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterServices.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#mergeRegions-org.apache.hadoop.hbase.HRegionInfo:A-boolean-long-long-">mergeRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
             boolean&nbsp;forcible,
@@ -2536,17 +2540,17 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Merge regions in a table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postAssign-org.apache.hadoop.hbase.HRegionInfo-">postAssign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postCompletedCreateTableAction-org.apache.hadoop.hbase.HTableDescriptor-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.security.User-">postCompletedCreateTableAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                               <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regions,
                               <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postCompletedMergeRegionsAction-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.security.User-">postCompletedMergeRegionsAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                                <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
@@ -2554,7 +2558,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked after completing merge regions operation</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postCompletedMergeRegionsAction-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.security.User-">postCompletedMergeRegionsAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                                <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
@@ -2562,7 +2566,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked after completing merge regions operation</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postCompletedSplitRegionAction-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.security.User-">postCompletedSplitRegionAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfoA,
                               <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfoB,
@@ -2570,16 +2574,16 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked just after a split</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postCreateTable-org.apache.hadoop.hbase.HTableDescriptor-org.apache.hadoop.hbase.HRegionInfo:A-">postCreateTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postMergeRegions-org.apache.hadoop.hbase.HRegionInfo:A-">postMergeRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postMergeRegionsCommit-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.security.User-">postMergeRegionsCommit</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
@@ -2587,7 +2591,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked after merge regions operation writes the new region to hbase:meta</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postMergeRegionsCommit-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.security.User-">postMergeRegionsCommit</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
@@ -2595,17 +2599,17 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked after merge regions operation writes the new region to hbase:meta</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postMove-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-">postMove</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
         <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;srcServer,
         <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;destServer)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postRegionOffline-org.apache.hadoop.hbase.HRegionInfo-">postRegionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postRequestLock-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.master.locking.LockProcedure.LockType-java.lang.String-">postRequestLock</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;namespace,
                <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -2613,45 +2617,45 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                <a href="../../../../../org/apache/hadoop/hbase/master/locking/LockProcedure.LockType.html" title="enum in org.apache.hadoop.hbase.master.locking">LockProcedure.LockType</a>&nbsp;type,
                <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;description)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postRollBackMergeRegionsAction-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.security.User-">postRollBackMergeRegionsAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                               <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>
 <div class="block">Invoked after rollback merge regions operation</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#postUnassign-org.apache.hadoop.hbase.HRegionInfo-boolean-">postUnassign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
             boolean&nbsp;force)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preAssign-org.apache.hadoop.hbase.HRegionInfo-">preAssign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preCreateTable-org.apache.hadoop.hbase.HTableDescriptor-org.apache.hadoop.hbase.HRegionInfo:A-">preCreateTable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
               <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preCreateTableAction-org.apache.hadoop.hbase.HTableDescriptor-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.security.User-">preCreateTableAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                     <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regions,
                     <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMergeRegions-org.apache.hadoop.hbase.HRegionInfo:A-">preMergeRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMergeRegionsAction-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.security.User-">preMergeRegionsAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                      <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>
 <div class="block">Invoked just before a merge</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMergeRegionsCommit-org.apache.hadoop.hbase.HRegionInfo:A-java.util.List-org.apache.hadoop.hbase.security.User-">preMergeRegionsCommit</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>[]&nbsp;regionsToMerge,
                      <a href="http://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/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;metaEntries,
@@ -2659,17 +2663,17 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Invoked before merge regions operation writes the new region to hbase:meta</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMove-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-">preMove</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
        <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;srcServer,
        <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;destServer)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preRegionOffline-org.apache.hadoop.hbase.HRegionInfo-">preRegionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preRequestLock-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.HRegionInfo:A-org.apache.hadoop.hbase.master.locking.LockProcedure.LockType-java.lang.String-">preRequestLock</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;namespace,
               <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -2677,65 +2681,65 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
               <a href="../../../../../org/apache/hadoop/hbase/master/locking/LockProcedure.LockType.html" title="enum in org.apache.hadoop.hbase.master.locking">LockProcedure.LockType</a>&nbsp;type,
               <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;description)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preUnassign-org.apache.hadoop.hbase.HRegionInfo-boolean-">preUnassign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
            boolean&nbsp;force)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">LoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.HRegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                 <a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentListener.html#regionClosed-org.apache.hadoop.hbase.HRegionInfo-">regionClosed</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">The region was closed on the region server.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">LoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.HRegionInfo-">regionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">LoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentListener.html#regionOpened-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">regionOpened</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">The region was opened on the specified server.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">ServerManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeRegion-org.apache.hadoop.hbase.HRegionInfo-">removeRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Called by delete table and similar to notify the ServerManager that a region was removed.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">ServerManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#sendRegionWarmup-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.HRegionInfo-">sendRegionWarmup</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                 <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</code>
 <div class="block">Sends a WARMUP RPC to the specified server to warmup the specified region.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><span class="typeNameLabel">HMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-byte:A-long-long-">splitRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
            byte[]&nbsp;splitRow,
            long&nbsp;nonceGroup,
            long&nbsp;nonce)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterServices.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-byte:A-long-long-">splitRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
            byte[]&nbsp;splitRow,
@@ -3234,34 +3238,38 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInRegionStates-org.apache.hadoop.hbase.HRegionInfo-">isRegionInRegionStates</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">isRegionInState</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInTransition-org.apache.hadoop.hbase.HRegionInfo-">isRegionInTransition</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOffline-org.apache.hadoop.hbase.HRegionInfo-">isRegionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOnline-org.apache.hadoop.hbase.HRegionInfo-">isRegionOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.RegionInTransitionStat.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#isRegionOverThreshold-org.apache.hadoop.hbase.HRegionInfo-">isRegionOverThreshold</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.RegionInTransitionStat.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#isRegionTwiceOverThreshold-org.apache.hadoop.hbase.HRegionInfo-">isRegionTwiceOverThreshold</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#logSplit-org.apache.hadoop.hbase.HRegionInfo-">logSplit</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#markRegionAsMerged-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-">markRegionAsMerged</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;child,
                   <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
@@ -3270,87 +3278,87 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">When called here, the merge has happened.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#markRegionAsSplit-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-">markRegionAsSplit</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
                  <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                  <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughterA,
                  <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughterB)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#mergeRegions-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">mergeRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
             <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriA,
             <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriB,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#offlineRegion-org.apache.hadoop.hbase.HRegionInfo-">offlineRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#onlineRegion-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">onlineRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromFailedOpen-org.apache.hadoop.hbase.HRegionInfo-">removeFromFailedOpen</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromOfflineRegions-org.apache.hadoop.hbase.HRegionInfo-">removeFromOfflineRegions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#sendRegionClosedNotification-org.apache.hadoop.hbase.HRegionInfo-">sendRegionClosedNotification</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#sendRegionOpenedNotification-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">sendRegionOpenedNotification</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#setMetaInitialized-org.apache.hadoop.hbase.HRegionInfo-boolean-">setMetaInitialized</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;metaRegionInfo,
                   boolean&nbsp;isInitialized)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionTransitionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html#setRegionInfo-org.apache.hadoop.hbase.HRegionInfo-">setRegionInfo</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#shouldAssignFavoredNodes-org.apache.hadoop.hbase.HRegionInfo-">shouldAssignFavoredNodes</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">splitRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriA,
            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriB,
            <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#unassign-org.apache.hadoop.hbase.HRegionInfo-">unassign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#unassign-org.apache.hadoop.hbase.HRegionInfo-boolean-">unassign</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
         boolean&nbsp;forceNewPlan)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#updateMetaLocation-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.ServerName-">updateMetaLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                   <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#updateRegionLocation-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.client.Put...-">updateRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                     <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state,
                     <a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>...&nbsp;put)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#updateRegionLocation-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-long-long-">updateRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                     <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state,
@@ -3359,7 +3367,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                     long&nbsp;openSeqNum,
                     long&nbsp;pid)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionMergeTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-">updateRegionMergeTransition</a></span>(<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;state,
@@ -3367,7 +3375,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionSplitTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.HRegionInfo-">updateRegionSplitTransition</a></span>(<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;state,
@@ -3375,19 +3383,19 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#updateRegionState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-">updateRegionState</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                  <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.HRegionInfo-long-">updateRegionTransition</a></span>(<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;state,
                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                       long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#updateUserRegionLocation-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-long-long-">updateUserRegionLocation</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                         <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state,
@@ -3396,7 +3404,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                         long&nbsp;openSeqNum,
                         long&nbsp;pid)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.RegionStateVisitor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.RegionStateVisitor.html#visitRegionState-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-long-">visitRegionState</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                 <a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state,
@@ -3404,16 +3412,16 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                 <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;lastHost,
                 long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitForAssignment-org.apache.hadoop.hbase.HRegionInfo-">waitForAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitForAssignment-org.apache.hadoop.hbase.HRegionInfo-long-">waitForAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                  long&nbsp;timeout)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitMetaInitialized-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.HRegionInfo-">waitMetaInitialized</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
                    <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
index ed999a2..36229f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
@@ -88,12 +88,12 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceAudience.Public</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceStability.Evolving</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceAudience.LimitedPrivate</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="typeNameLink">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 </div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.MockRemoteCall.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseReg

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Put.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Put.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Put.html
index e79672a..c441fe6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Put.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Put.html
@@ -224,306 +224,299 @@
 <span class="sourceLineNo">216</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.216"></a>
 <span class="sourceLineNo">217</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value);<a name="line.217"></a>
 <span class="sourceLineNo">218</span>    list.add(kv);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    return this;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * See {@link #addColumn(byte[], byte[], long, byte[])}. This version expects<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * that the underlying arrays won't change. It's intended<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * for usage internal HBase to and for advanced client applications.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   */<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    // Family can not be null, otherwise NullPointerException is thrown when putting the cell into familyMap<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (family == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw new IllegalArgumentException("Family cannot be null");<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>    // Check timestamp<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (ts &lt; 0) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    list.add(new IndividualBytesFieldCell(this.row, family, qualifier, ts, KeyValue.Type.Put, value));<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    familyMap.put(family, list);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return this;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * for usage internal HBase to and for advanced client applications.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * that should not be exposed publicly.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  @InterfaceAudience.Private<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    list.add(kv);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    familyMap.put(family, list);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return this;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * for usage internal HBase to and for advanced client applications.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   * that should not be exposed publicly.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  @InterfaceAudience.Private<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.267"></a>
-<span class="sourceLineNo">268</span>                          Tag[] tag) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (ts &lt; 0) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    list.add(kv);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    familyMap.put(family, list);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return this;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Add the specified column and value, with the specified timestamp as<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * its version to this Put operation.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param family family name<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param qualifier column qualifier<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param ts version timestamp<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param value column value<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @return this<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public Put addColumn(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (ts &lt; 0) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    list.add(kv);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    return this;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * See {@link #addColumn(byte[], ByteBuffer, long, ByteBuffer)}. This version expects<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * that the underlying arrays won't change. It's intended<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * for usage internal HBase to and for advanced client applications.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    if (ts &lt; 0) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    list.add(kv);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    familyMap.put(family, list);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    return this;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * Add the specified KeyValue to this Put operation.  Operation assumes that<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * the passed KeyValue is immutable and its backing array will not be modified<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * for the duration of this Put.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @param kv individual KeyValue<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return this<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws java.io.IOException e<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public Put add(Cell kv) throws IOException{<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    byte [] family = CellUtil.cloneFamily(kv);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    //Checking that the row of the kv is the same as the put<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    if (!CellUtil.matchingRow(kv, this.row)) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      throw new WrongRowIOException("The row in " + kv.toString() +<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    list.add(kv);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    familyMap.put(family, list);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return this;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  /**<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * A convenience method to determine if this object's familyMap contains<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * a value assigned to the given family &amp;amp; qualifier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   * Both given arguments must match the KeyValue object to return true.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>   *<a name="line.341"></a>
-<span class="sourceLineNo">342</span>   * @param family column family<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @param qualifier column qualifier<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * @return returns true if the given family and qualifier already has an<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   * existing KeyValue object in the family map.<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public boolean has(byte [] family, byte [] qualifier) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  return has(family, qualifier, this.ts, HConstants.EMPTY_BYTE_ARRAY, true, true);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  /**<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * A convenience method to determine if this object's familyMap contains<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   *<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param family column family<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @param qualifier column qualifier<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * @param ts timestamp<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * @return returns true if the given family, qualifier and timestamp already has an<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * existing KeyValue object in the family map.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  public boolean has(byte [] family, byte [] qualifier, long ts) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  return has(family, qualifier, ts, HConstants.EMPTY_BYTE_ARRAY, false, true);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * A convenience method to determine if this object's familyMap contains<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   *<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * @param family column family<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param qualifier column qualifier<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @param value value to check<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return returns true if the given family, qualifier and value already has an<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * existing KeyValue object in the family map.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public boolean has(byte [] family, byte [] qualifier, byte [] value) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    return has(family, qualifier, this.ts, value, true, false);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /**<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * A convenience method to determine if this object's familyMap contains<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * the given value assigned to the given family, qualifier and timestamp.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * All 4 given arguments must match the KeyValue object to return true.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   *<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * @param family column family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @param qualifier column qualifier<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param ts timestamp<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @param value value to check<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * already has an existing KeyValue object in the family map.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  public boolean has(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      return has(family, qualifier, ts, value, false, false);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>  /*<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * Private method to determine if this object's familyMap contains<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * the given value assigned to the given family, qualifier and timestamp<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * respecting the 2 boolean arguments<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   *<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @param family<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @param qualifier<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param ts<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param value<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @param ignoreTS<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   * @param ignoreValue<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * already has an existing KeyValue object in the family map.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>                      boolean ignoreTS, boolean ignoreValue) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    if (list.isEmpty()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      return false;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Boolean analysis of ignoreTS/ignoreValue.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // T T =&gt; 2<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // T F =&gt; 3 (first is always true)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // F T =&gt; 2<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // F F =&gt; 1<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    if (!ignoreTS &amp;&amp; !ignoreValue) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      for (Cell cell : list) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>            CellUtil.matchingQualifier(cell, qualifier)  &amp;&amp;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>            CellUtil.matchingValue(cell, value) &amp;&amp;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            cell.getTimestamp() == ts) {<a name="line.427"></a>
+<span class="sourceLineNo">219</span>    return this;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  /**<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * See {@link #addColumn(byte[], byte[], long, byte[])}. This version expects<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * that the underlying arrays won't change. It's intended<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * for usage internal HBase to and for advanced client applications.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // Family can not be null, otherwise NullPointerException is thrown when putting the cell into familyMap<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (family == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      throw new IllegalArgumentException("Family cannot be null");<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>    // Check timestamp<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    if (ts &lt; 0) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    list.add(new IndividualBytesFieldCell(this.row, family, qualifier, ts, KeyValue.Type.Put, value));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    return this;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * for usage internal HBase to and for advanced client applications.<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * that should not be exposed publicly.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @InterfaceAudience.Private<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    list.add(kv);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return this;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * This expects that the underlying arrays won't change. It's intended<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * for usage internal HBase to and for advanced client applications.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * &lt;p&gt;Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * that should not be exposed publicly.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  @InterfaceAudience.Private<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                          Tag[] tag) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (ts &lt; 0) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    list.add(kv);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    return this;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * Add the specified column and value, with the specified timestamp as<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * its version to this Put operation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param family family name<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param qualifier column qualifier<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param ts version timestamp<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @param value column value<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @return this<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  public Put addColumn(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (ts &lt; 0) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    list.add(kv);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    return this;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * See {@link #addColumn(byte[], ByteBuffer, long, ByteBuffer)}. This version expects<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * that the underlying arrays won't change. It's intended<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * for usage internal HBase to and for advanced client applications.<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    if (ts &lt; 0) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    list.add(kv);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return this;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * Add the specified KeyValue to this Put operation.  Operation assumes that<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * the passed KeyValue is immutable and its backing array will not be modified<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * for the duration of this Put.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   * @param kv individual KeyValue<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return this<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * @throws java.io.IOException e<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public Put add(Cell kv) throws IOException{<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    byte [] family = CellUtil.cloneFamily(kv);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    //Checking that the row of the kv is the same as the put<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if (!CellUtil.matchingRow(kv, this.row)) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      throw new WrongRowIOException("The row in " + kv.toString() +<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    list.add(kv);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    return this;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>  /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * A convenience method to determine if this object's familyMap contains<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * a value assigned to the given family &amp;amp; qualifier.<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * Both given arguments must match the KeyValue object to return true.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   *<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param family column family<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * @param qualifier column qualifier<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * @return returns true if the given family and qualifier already has an<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * existing KeyValue object in the family map.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   */<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  public boolean has(byte [] family, byte [] qualifier) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  return has(family, qualifier, this.ts, HConstants.EMPTY_BYTE_ARRAY, true, true);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  /**<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * A convenience method to determine if this object's familyMap contains<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   *<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * @param family column family<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * @param qualifier column qualifier<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param ts timestamp<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @return returns true if the given family, qualifier and timestamp already has an<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * existing KeyValue object in the family map.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  public boolean has(byte [] family, byte [] qualifier, long ts) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  return has(family, qualifier, ts, HConstants.EMPTY_BYTE_ARRAY, false, true);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  }<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * A convenience method to determine if this object's familyMap contains<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   * a value assigned to the given family, qualifier and timestamp.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   * All 3 given arguments must match the KeyValue object to return true.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   *<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param family column family<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param qualifier column qualifier<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @param value value to check<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * @return returns true if the given family, qualifier and value already has an<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * existing KeyValue object in the family map.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public boolean has(byte [] family, byte [] qualifier, byte [] value) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return has(family, qualifier, this.ts, value, true, false);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  /**<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * A convenience method to determine if this object's familyMap contains<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * the given value assigned to the given family, qualifier and timestamp.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * All 4 given arguments must match the KeyValue object to return true.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param family column family<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param qualifier column qualifier<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @param ts timestamp<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @param value value to check<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * already has an existing KeyValue object in the family map.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public boolean has(byte [] family, byte [] qualifier, long ts, byte [] value) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return has(family, qualifier, ts, value, false, false);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  /*<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   * Private method to determine if this object's familyMap contains<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   * the given value assigned to the given family, qualifier and timestamp<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * respecting the 2 boolean arguments<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param family<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param qualifier<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @param ts<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param value<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @param ignoreTS<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * @param ignoreValue<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * @return returns true if the given family, qualifier timestamp and value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * already has an existing KeyValue object in the family map.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,<a name="line.404"></a>
+<span class="sourceLineNo">405</span>                      boolean ignoreTS, boolean ignoreValue) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    if (list.isEmpty()) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      return false;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    // Boolean analysis of ignoreTS/ignoreValue.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // T T =&gt; 2<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // T F =&gt; 3 (first is always true)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // F T =&gt; 2<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    // F F =&gt; 1<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    if (!ignoreTS &amp;&amp; !ignoreValue) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      for (Cell cell : list) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            CellUtil.matchingQualifier(cell, qualifier)  &amp;&amp;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>            CellUtil.matchingValue(cell, value) &amp;&amp;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            cell.getTimestamp() == ts) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          return true;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    } else if (ignoreValue &amp;&amp; !ignoreTS) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      for (Cell cell : list) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>            &amp;&amp; cell.getTimestamp() == ts) {<a name="line.427"></a>
 <span class="sourceLineNo">428</span>          return true;<a name="line.428"></a>
 <span class="sourceLineNo">429</span>        }<a name="line.429"></a>
 <span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    } else if (ignoreValue &amp;&amp; !ignoreTS) {<a name="line.431"></a>
+<span class="sourceLineNo">431</span>    } else if (!ignoreValue &amp;&amp; ignoreTS) {<a name="line.431"></a>
 <span class="sourceLineNo">432</span>      for (Cell cell : list) {<a name="line.432"></a>
 <span class="sourceLineNo">433</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            &amp;&amp; cell.getTimestamp() == ts) {<a name="line.434"></a>
+<span class="sourceLineNo">434</span>            &amp;&amp; CellUtil.matchingValue(cell, value)) {<a name="line.434"></a>
 <span class="sourceLineNo">435</span>          return true;<a name="line.435"></a>
 <span class="sourceLineNo">436</span>        }<a name="line.436"></a>
 <span class="sourceLineNo">437</span>      }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } else if (!ignoreValue &amp;&amp; ignoreTS) {<a name="line.438"></a>
+<span class="sourceLineNo">438</span>    } else {<a name="line.438"></a>
 <span class="sourceLineNo">439</span>      for (Cell cell : list) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp; CellUtil.matchingQualifier(cell, qualifier)<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            &amp;&amp; CellUtil.matchingValue(cell, value)) {<a name="line.441"></a>
+<span class="sourceLineNo">440</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>            CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.441"></a>
 <span class="sourceLineNo">442</span>          return true;<a name="line.442"></a>
 <span class="sourceLineNo">443</span>        }<a name="line.443"></a>
 <span class="sourceLineNo">444</span>      }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    } else {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (Cell cell : list) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (CellUtil.matchingFamily(cell, family) &amp;&amp;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          return true;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        }<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    return false;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  /**<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * Returns a list of all KeyValue objects with matching column family and qualifier.<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   *<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * @param family column family<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * @param qualifier column qualifier<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @return a list of KeyValue objects with the matching family and qualifier,<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * returns an empty list if one doesn't exist for the given family.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  public List&lt;Cell&gt; get(byte[] family, byte[] qualifier) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    List&lt;Cell&gt; filteredList = new ArrayList&lt;&gt;();<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    for (Cell cell: getCellList(family)) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      if (CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        filteredList.add(cell);<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>    return filteredList;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public Put setAttribute(String name, byte[] value) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    return (Put) super.setAttribute(name, value);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>  @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  public Put setId(String id) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return (Put) super.setId(id);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public Put setDurability(Durability d) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return (Put) super.setDurability(d);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  public Put setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return (Put) super.setFamilyCellMap(map);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  @Override<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  public Put setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return (Put) super.setClusterIds(clusterIds);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  @Override<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  public Put setCellVisibility(CellVisibility expression) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    return (Put) super.setCellVisibility(expression);<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>  @Override<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public Put setACL(String user, Permission perms) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    return (Put) super.setACL(user, perms);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>  @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  public Put setACL(Map&lt;String, Permission&gt; perms) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return (Put) super.setACL(perms);<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>  @Override<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  public Put setTTL(long ttl) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    return (Put) super.setTTL(ttl);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>}<a name="line.518"></a>
+<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return false;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * Returns a list of all KeyValue objects with matching column family and qualifier.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   *<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * @param family column family<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @param qualifier column qualifier<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * @return a list of KeyValue objects with the matching family and qualifier,<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * returns an empty list if one doesn't exist for the given family.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public List&lt;Cell&gt; get(byte[] family, byte[] qualifier) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    List&lt;Cell&gt; filteredList = new ArrayList&lt;&gt;();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    for (Cell cell: getCellList(family)) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      if (CellUtil.matchingQualifier(cell, qualifier)) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        filteredList.add(cell);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return filteredList;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  public Put setAttribute(String name, byte[] value) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    return (Put) super.setAttribute(name, value);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Put setId(String id) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return (Put) super.setId(id);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public Put setDurability(Durability d) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    return (Put) super.setDurability(d);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  public Put setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    return (Put) super.setFamilyCellMap(map);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  @Override<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public Put setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    return (Put) super.setClusterIds(clusterIds);<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>  public Put setCellVisibility(CellVisibility expression) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return (Put) super.setCellVisibility(expression);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  public Put setACL(String user, Permission perms) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return (Put) super.setACL(user, perms);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  @Override<a name="line.502"></a>
+<span class="sourceLineNo">503</span>  public Put setACL(Map&lt;String, Permission&gt; perms) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    return (Put) super.setACL(perms);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>  @Override<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  public Put setTTL(long ttl) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    return (Put) super.setTTL(ttl);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>}<a name="line.511"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
index 63ba3f6..dffd28e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
@@ -348,12 +348,12 @@
 <span class="sourceLineNo">340</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.340"></a>
 <span class="sourceLineNo">341</span>    if(set == null) {<a name="line.341"></a>
 <span class="sourceLineNo">342</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (qualifier == null) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    set.add(qualifier);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    familyMap.put(family, set);<a name="line.348"></a>
+<span class="sourceLineNo">343</span>      familyMap.put(family, set);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (qualifier == null) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    set.add(qualifier);<a name="line.348"></a>
 <span class="sourceLineNo">349</span>    return this;<a name="line.349"></a>
 <span class="sourceLineNo">350</span>  }<a name="line.350"></a>
 <span class="sourceLineNo">351</span><a name="line.351"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
index 63ba3f6..dffd28e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
@@ -348,12 +348,12 @@
 <span class="sourceLineNo">340</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.340"></a>
 <span class="sourceLineNo">341</span>    if(set == null) {<a name="line.341"></a>
 <span class="sourceLineNo">342</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (qualifier == null) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    set.add(qualifier);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    familyMap.put(family, set);<a name="line.348"></a>
+<span class="sourceLineNo">343</span>      familyMap.put(family, set);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (qualifier == null) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    set.add(qualifier);<a name="line.348"></a>
 <span class="sourceLineNo">349</span>    return this;<a name="line.349"></a>
 <span class="sourceLineNo">350</span>  }<a name="line.350"></a>
 <span class="sourceLineNo">351</span><a name="line.351"></a>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
index a4ec9de..dd72bc5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
@@ -229,242 +229,251 @@
 <span class="sourceLineNo">221</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.221"></a>
 <span class="sourceLineNo">222</span>      pe.submitProcedure(new GCMergedRegionsProcedure(pe.getEnvironment(),<a name="line.222"></a>
 <span class="sourceLineNo">223</span>          mergedRegion, regionA, regionB));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      return true;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return false;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * garbage to collect.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return number of archiving jobs started.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @throws IOException<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  int scan() throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    int result = 0;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("CatalogJanitor already running");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return result;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        getMergedRegionsAndSplitParents();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      /**<a name="line.244"></a>
-<span class="sourceLineNo">245</span>       * clean merge regions first<a name="line.245"></a>
-<span class="sourceLineNo">246</span>       */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        if (this.services.isInMaintenanceMode()) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          // Stop cleaning if the master is in maintenance mode<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          break;<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>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        HRegionInfo regionA = p.getFirst();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        HRegionInfo regionB = p.getSecond();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        if (regionA == null || regionB == null) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          LOG.warn("Unexpected references regionA="<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              + (regionA == null ? "null" : regionA.getShortNameToLog())<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              + ",regionB="<a name="line.260"></a>
-<span class="sourceLineNo">261</span>              + (regionB == null ? "null" : regionB.getShortNameToLog())<a name="line.261"></a>
-<span class="sourceLineNo">262</span>              + " in merged region " + e.getKey().getShortNameToLog());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } else {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            result++;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>       * clean split parents<a name="line.270"></a>
-<span class="sourceLineNo">271</span>       */<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      // regions whose parents are still around<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;&gt;();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        if (this.services.isInMaintenanceMode()) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          // Stop cleaning if the master is in maintenance mode<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          break;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>              cleanParent(e.getKey(), e.getValue())) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            result++;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        } else {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          // We could not clean the parent, so it's daughters should not be<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // cleaned either (HBASE-6160)<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      return result;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      alreadyRunning.set(false);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * daughters.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // parent before daughters.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if (left == null) return -1;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      if (right == null) return 1;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // Same table name.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      if (result != 0) return result;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Compare start keys.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      if (result != 0) return result;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return result;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * @param parent HRegionInfo of split offlined parent<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * the filesystem.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * @throws IOException<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    // Check whether it is a merged region and not clean reference<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // be inserted/deleted together<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      // wait cleaning merge region first<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return false;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Run checks on each daughter split.<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      String daughterA = daughters.getFirst() != null?<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          daughters.getFirst().getShortNameToLog(): "null";<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      String daughterB = daughters.getSecond() != null?<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          daughters.getSecond().getShortNameToLog(): "null";<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      LOG.debug("Deleting region " + parent.getShortNameToLog() +<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        " because daughters -- " + daughterA + ", " + daughterB +<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        " -- no longer hold references");<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      pe.submitProcedure(new GCRegionProcedure(pe.getEnvironment(), parent));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      return true;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    return false;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  /**<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * whether the daughter has references to the parent.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return !p.getFirst() || !p.getSecond();<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>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * references to parent.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @param parent Parent region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param daughter Daughter region<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * whether the daughter has references to the parent.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @throws IOException<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  throws IOException {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (daughter == null)  {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<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>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HRegionFileSystem regionFs = null;<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    try {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (IOException ioe) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      LOG.error("Error trying to determine if daughter region exists, " +<a name="line.402"></a>
-<span class="sourceLineNo">403</span>               "assuming exists and has references", ioe);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>    boolean references = false;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>      for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          break;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException e) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      LOG.error("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return new Pair&lt;&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws FileNotFoundException, IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  /**<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * them<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * @param region<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * @throws IOException<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      throws IOException {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    // Get merge regions if it is a merged region and already has merge<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // qualifier<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          region.getRegionName());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    if (mergeRegions == null<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // It doesn't have merge qualifier, no need to clean<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      return true;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          + " has only one merge qualifier in META.");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      return false;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        mergeRegions.getSecond());<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">224</span>      // Remove from in-memory states<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(regionA);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(regionB);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      this.services.getServerManager().removeRegion(regionA);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      this.services.getServerManager().removeRegion(regionB);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return true;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * garbage to collect.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @return number of archiving jobs started.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @throws IOException<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  int scan() throws IOException {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int result = 0;<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        LOG.debug("CatalogJanitor already running");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        return result;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        getMergedRegionsAndSplitParents();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>       * clean merge regions first<a name="line.251"></a>
+<span class="sourceLineNo">252</span>       */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        if (this.services.isInMaintenanceMode()) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          // Stop cleaning if the master is in maintenance mode<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          break;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        HRegionInfo regionA = p.getFirst();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        HRegionInfo regionB = p.getSecond();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (regionA == null || regionB == null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.warn("Unexpected references regionA="<a name="line.264"></a>
+<span class="sourceLineNo">265</span>              + (regionA == null ? "null" : regionA.getShortNameToLog())<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              + ",regionB="<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              + (regionB == null ? "null" : regionB.getShortNameToLog())<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              + " in merged region " + e.getKey().getShortNameToLog());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            result++;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      /**<a name="line.275"></a>
+<span class="sourceLineNo">276</span>       * clean split parents<a name="line.276"></a>
+<span class="sourceLineNo">277</span>       */<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // regions whose parents are still around<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;&gt;();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        if (this.services.isInMaintenanceMode()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          // Stop cleaning if the master is in maintenance mode<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          break;<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>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          result++;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // We could not clean the parent, so it's daughters should not be<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          // cleaned either (HBASE-6160)<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      return result;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    } finally {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      alreadyRunning.set(false);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>  /**<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * daughters.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    @Override<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // parent before daughters.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      if (left == null) return -1;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      if (right == null) return 1;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // Same table name.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (result != 0) return result;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // Compare start keys.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      if (result != 0) return result;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return result;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * @param parent HRegionInfo of split offlined parent<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * the filesystem.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * @throws IOException<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  throws IOException {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    // Check whether it is a merged region and not clean reference<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // be inserted/deleted together<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      // wait cleaning merge region first<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      return false;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // Run checks on each daughter split.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      String daughterA = daughters.getFirst() != null?<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          daughters.getFirst().getShortNameToLog(): "null";<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      String daughterB = daughters.getSecond() != null?<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          daughters.getSecond().getShortNameToLog(): "null";<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      LOG.debug("Deleting region " + parent.getShortNameToLog() +<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        " because daughters -- " + daughterA + ", " + daughterB +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        " -- no longer hold references");<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      pe.submitProcedure(new GCRegionProcedure(pe.getEnvironment(), parent));<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      // Remove from in-memory states<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(parent);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      this.services.getServerManager().removeRegion(parent);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      return true;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return false;<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>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * whether the daughter has references to the parent.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    return !p.getFirst() || !p.getSecond();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>  /**<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * references to parent.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * @param parent Parent region<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @param daughter Daughter region<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * whether the daughter has references to the parent.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @throws IOException<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    if (daughter == null)  {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>    HRegionFileSystem regionFs = null;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>    try {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    } catch (IOException ioe) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.error("Error trying to determine if daughter region exists, " +<a name="line.411"></a>
+<span class="sourceLineNo">412</span>               "assuming exists and has references", ioe);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    boolean references = false;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    try {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.420"></a>
+<span class="sourceLineNo">421</span><a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          break;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (IOException e) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      LOG.error("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return new Pair&lt;&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      throws FileNotFoundException, IOException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * them<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param region<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * @throws IOException<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      throws IOException {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    // Get merge regions if it is a merged region and already has merge<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    // qualifier<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          region.getRegionName());<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (mergeRegions == null<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      // It doesn't have merge qualifier, no need to clean<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      return true;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    }<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.461"></a>
+<span class="sourceLineNo">462</span>          + " has only one merge qualifier in META.");<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      return false;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        mergeRegions.getSecond());<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>}<a name="line.468"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
index af42219..a9770f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
@@ -61,32 +61,32 @@
 <span class="sourceLineNo">053</span>import org.apache.hadoop.conf.Configuration;<a name="line.53"></a>
 <span class="sourceLineNo">054</span>import org.apache.hadoop.fs.FileSystem;<a name="line.54"></a>
 <span class="sourceLineNo">055</span>import org.apache.hadoop.fs.Path;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HConstants;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.ServerName;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableName;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.Result;<a name="line.81"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HConstants;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerName;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableName;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.Result;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.82"></a>
 <span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.coprocessor.BypassCoprocessorException;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.84"></a>
@@ -172,45 +172,45 @@
 <span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.replication.regionserver.Replication;<a name="line.164"></a>
 <span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.165"></a>
 <span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.zookeeper.KeeperException;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.eclipse.jetty.server.Server;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.205"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>import org.apache.zookeeper.KeeperException;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>import org.eclipse.jetty.server.Server;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
 <span class="sourceLineNo">206</span>import com.google.protobuf.Descriptors;<a name="line.206"></a>
 <span class="sourceLineNo">207</span>import com.google.protobuf.Service;<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
@@ -1945,14 +1945,14 @@
 <span class="sourceLineNo">1937</span>      }<a name="line.1937"></a>
 <span class="sourceLineNo">1938</span><a name="line.1938"></a>
 <span class="sourceLineNo">1939</span>      // 3. blocking file count<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>      String sbfc = htd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>      if (sbfc != null) {<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sbfc);<a name="line.1942"></a>
+<span class="sourceLineNo">1940</span>      sv = hcd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (sv != null) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sv);<a name="line.1942"></a>
 <span class="sourceLineNo">1943</span>      }<a name="line.1943"></a>
 <span class="sourceLineNo">1944</span>      if (blockingFileCount &lt; 1000) {<a name="line.1944"></a>
 <span class="sourceLineNo">1945</span>        message =<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>            "blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000";<a name="line.1947"></a>
+<span class="sourceLineNo">1946</span>            "Blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000 for column family "+ hcd.getNameAsString();<a name="line.1947"></a>
 <span class="sourceLineNo">1948</span>        throw new IOException(message);<a name="line.1948"></a>
 <span class="sourceLineNo">1949</span>      }<a name="line.1949"></a>
 <span class="sourceLineNo">1950</span>    }<a name="line.1950"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index af42219..a9770f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -61,32 +61,32 @@
 <span class="sourceLineNo">053</span>import org.apache.hadoop.conf.Configuration;<a name="line.53"></a>
 <span class="sourceLineNo">054</span>import org.apache.hadoop.fs.FileSystem;<a name="line.54"></a>
 <span class="sourceLineNo">055</span>import org.apache.hadoop.fs.Path;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HConstants;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.ServerName;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableName;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.Result;<a name="line.81"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ClusterStatus;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HConstants;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.ProcedureInfo;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerName;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.TableName;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.TableNotDisabledException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.client.MasterSwitchType;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.client.Result;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.82"></a>
 <span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.coprocessor.BypassCoprocessorException;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.84"></a>
@@ -172,45 +172,45 @@
 <span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.replication.regionserver.Replication;<a name="line.164"></a>
 <span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.165"></a>
 <span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.zookeeper.KeeperException;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.eclipse.jetty.server.Server;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.205"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.util.ZKDataMigrator;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.zookeeper.DrainingServerTracker;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.zookeeper.SplitOrMergeTracker;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>import org.apache.zookeeper.KeeperException;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>import org.eclipse.jetty.server.Server;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
 <span class="sourceLineNo">206</span>import com.google.protobuf.Descriptors;<a name="line.206"></a>
 <span class="sourceLineNo">207</span>import com.google.protobuf.Service;<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
@@ -1945,14 +1945,14 @@
 <span class="sourceLineNo">1937</span>      }<a name="line.1937"></a>
 <span class="sourceLineNo">1938</span><a name="line.1938"></a>
 <span class="sourceLineNo">1939</span>      // 3. blocking file count<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>      String sbfc = htd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>      if (sbfc != null) {<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sbfc);<a name="line.1942"></a>
+<span class="sourceLineNo">1940</span>      sv = hcd.getConfigurationValue(HStore.BLOCKING_STOREFILES_KEY);<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (sv != null) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        blockingFileCount = Integer.parseInt(sv);<a name="line.1942"></a>
 <span class="sourceLineNo">1943</span>      }<a name="line.1943"></a>
 <span class="sourceLineNo">1944</span>      if (blockingFileCount &lt; 1000) {<a name="line.1944"></a>
 <span class="sourceLineNo">1945</span>        message =<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>            "blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000";<a name="line.1947"></a>
+<span class="sourceLineNo">1946</span>            "Blocking file count '" + HStore.BLOCKING_STOREFILES_KEY + "' " + blockingFileCount<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>                + " is below recommended minimum of 1000 for column family "+ hcd.getNameAsString();<a name="line.1947"></a>
 <span class="sourceLineNo">1948</span>        throw new IOException(message);<a name="line.1948"></a>
 <span class="sourceLineNo">1949</span>      }<a name="line.1949"></a>
 <span class="sourceLineNo">1950</span>    }<a name="line.1950"></a>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-info.html b/hbase-archetypes/hbase-shaded-client-project/project-info.html
index a417f03..9111e72 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-info.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-reports.html b/hbase-archetypes/hbase-shaded-client-project/project-reports.html
index 6de0cec..9d534e9 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-reports.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-summary.html b/hbase-archetypes/hbase-shaded-client-project/project-summary.html
index 8a4def0..dccd28a 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-summary.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/source-repository.html b/hbase-archetypes/hbase-shaded-client-project/source-repository.html
index 1b1b49c..a53644f 100644
--- a/hbase-archetypes/hbase-shaded-client-project/source-repository.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/hbase-shaded-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/team-list.html b/hbase-archetypes/hbase-shaded-client-project/team-list.html
index efcdb6a..a6c126f 100644
--- a/hbase-archetypes/hbase-shaded-client-project/team-list.html
+++ b/hbase-archetypes/hbase-shaded-client-project/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/index.html b/hbase-archetypes/index.html
index a5078bb..73f5bf3 100644
--- a/hbase-archetypes/index.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -135,7 +135,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/integration.html b/hbase-archetypes/integration.html
index e575af1..76a8c55 100644
--- a/hbase-archetypes/integration.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/issue-tracking.html b/hbase-archetypes/issue-tracking.html
index 2055bd8..5002baf 100644
--- a/hbase-archetypes/issue-tracking.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/license.html b/hbase-archetypes/license.html
index cec3505..c76d4b4 100644
--- a/hbase-archetypes/license.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/mail-lists.html b/hbase-archetypes/mail-lists.html
index 80c6c35..64b9acf 100644
--- a/hbase-archetypes/mail-lists.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/plugin-management.html b/hbase-archetypes/plugin-management.html
index c430cfb..ef6815a 100644
--- a/hbase-archetypes/plugin-management.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/plugins.html b/hbase-archetypes/plugins.html
index 777b410..db0c47e 100644
--- a/hbase-archetypes/plugins.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -210,7 +210,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/project-info.html b/hbase-archetypes/project-info.html
index 2e59358..d2a0637 100644
--- a/hbase-archetypes/project-info.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/project-summary.html b/hbase-archetypes/project-summary.html
index cec0559..ec6c6ea 100644
--- a/hbase-archetypes/project-summary.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -163,7 +163,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/source-repository.html b/hbase-archetypes/source-repository.html
index f6973b3..dd60049 100644
--- a/hbase-archetypes/source-repository.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-archetypes/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/team-list.html b/hbase-archetypes/team-list.html
index 2e23659..f382c3d 100644
--- a/hbase-archetypes/team-list.html
+++ b/hbase-archetypes/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-spark/checkstyle.html b/hbase-spark/checkstyle.html
index 6e3d882..93a0317 100644
--- a/hbase-spark/checkstyle.html
+++ b/hbase-spark/checkstyle.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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -412,7 +412,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependencies.html b/hbase-spark/dependencies.html
index f7507bf..9e93695 100644
--- a/hbase-spark/dependencies.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -5740,7 +5740,7 @@ The following provides more details on the included cryptographic software:
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-convergence.html b/hbase-spark/dependency-convergence.html
index c7c2c23..20a0884 100644
--- a/hbase-spark/dependency-convergence.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -552,7 +552,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-info.html b/hbase-spark/dependency-info.html
index 4e477d8..43e4136 100644
--- a/hbase-spark/dependency-info.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-management.html b/hbase-spark/dependency-management.html
index 5caea0c..35d7222 100644
--- a/hbase-spark/dependency-management.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/index.html
----------------------------------------------------------------------
diff --git a/hbase-spark/index.html b/hbase-spark/index.html
index 8bfb035..06f2c63 100644
--- a/hbase-spark/index.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -122,7 +122,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/integration.html
----------------------------------------------------------------------
diff --git a/hbase-spark/integration.html b/hbase-spark/integration.html
index e083700..da2d616 100644
--- a/hbase-spark/integration.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-spark/issue-tracking.html b/hbase-spark/issue-tracking.html
index a4ee0f8..6b74f43 100644
--- a/hbase-spark/issue-tracking.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/license.html
----------------------------------------------------------------------
diff --git a/hbase-spark/license.html b/hbase-spark/license.html
index 1389744..96962bc 100644
--- a/hbase-spark/license.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-spark/mail-lists.html b/hbase-spark/mail-lists.html
index 301b5bb..fe4e186 100644
--- a/hbase-spark/mail-lists.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugin-management.html b/hbase-spark/plugin-management.html
index 9aa28e8..7280c17 100644
--- a/hbase-spark/plugin-management.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugins.html b/hbase-spark/plugins.html
index 587c137..cb1ac5a 100644
--- a/hbase-spark/plugins.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -234,7 +234,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-info.html b/hbase-spark/project-info.html
index af6019d..202de84 100644
--- a/hbase-spark/project-info.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -170,7 +170,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-reports.html b/hbase-spark/project-reports.html
index 707a378..723defa 100644
--- a/hbase-spark/project-reports.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -131,7 +131,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-summary.html b/hbase-spark/project-summary.html
index 4026243..4d433ef 100644
--- a/hbase-spark/project-summary.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -169,7 +169,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-spark/source-repository.html b/hbase-spark/source-repository.html
index 81d0ecb..977cb82 100644
--- a/hbase-spark/source-repository.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/hbase-spark/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-spark/team-list.html b/hbase-spark/team-list.html
index 0c5d8a5..0a3b134 100644
--- a/hbase-spark/team-list.html
+++ b/hbase-spark/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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -523,7 +523,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 753ad02..144ff62 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -438,7 +438,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index b4240ee..b036df9 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -296,7 +296,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 9e0f1f9..96cf549 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -293,7 +293,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 3b27d30..f47e385 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -496,7 +496,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index e6f7bc6..593e5e4 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -346,7 +346,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 174ec1e..6cbb32e 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -464,7 +464,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index cacad65..7bbbbbe 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -419,7 +419,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index f6d8b8c..26286b4 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -441,7 +441,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 6f74158..52e20c2 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -380,7 +380,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 5e01b6a..e1f5a15 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -774,7 +774,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index a306a79..cb74fb8 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 4017d24..7a94552 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -310,7 +310,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 396152c..2c50ed2 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -336,7 +336,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 9621950..003ec4b 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -313,7 +313,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index ab88934..64069aa 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 9e2924f..24ab94b 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -336,7 +336,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 6198569..2a7885c 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -304,7 +304,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index ce9e086..c8cc2bc 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -338,7 +338,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 87c7bd3..19eb752 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -525,7 +525,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: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index d8b5b72..72b1ef6 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="20170811" />
+    <meta name="Date-Revision-yyyymmdd" content="20170812" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -693,7 +693,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-08-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-08-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 2410551..1950431 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -700,6 +700,7 @@
 <li><a href="org/apache/hadoop/hbase/ipc/TestCallRunner.html" title="class in org.apache.hadoop.hbase.ipc" target="classFrame">TestCallRunner</a></li>
 <li><a href="org/apache/hadoop/hbase/tool/TestCanaryTool.html" title="class in org.apache.hadoop.hbase.tool" target="classFrame">TestCanaryTool</a></li>
 <li><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestCatalogJanitor</a></li>
+<li><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">TestCatalogJanitorInMemoryStates</a></li>
 <li><a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access" target="classFrame">TestCellACLs</a></li>
 <li><a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access" target="classFrame">TestCellACLWithMultipleVersions</a></li>
 <li><a href="org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.html" title="class in org.apache.hadoop.hbase.ipc" target="classFrame">TestCellBlockBuilder</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 38d8b5f..a93304d 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -700,6 +700,7 @@
 <li><a href="org/apache/hadoop/hbase/ipc/TestCallRunner.html" title="class in org.apache.hadoop.hbase.ipc">TestCallRunner</a></li>
 <li><a href="org/apache/hadoop/hbase/tool/TestCanaryTool.html" title="class in org.apache.hadoop.hbase.tool">TestCanaryTool</a></li>
 <li><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></li>
+<li><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></li>
 <li><a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLs</a></li>
 <li><a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></li>
 <li><a href="org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.html" title="class in org.apache.hadoop.hbase.ipc">TestCellBlockBuilder</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index f8cb328..ce1670e 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -10677,6 +10677,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/TestRegionLocationFinder.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/TestRegionLocationFinder.html" title="class in org.apache.hadoop.hbase.master.balancer">TestRegionLocationFinder</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestGetLastFlushedSequenceId.html#family">family</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestGetLastFlushedSequenceId.html" title="class in org.apache.hadoop.hbase.master">TestGetLastFlushedSequenceId</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestRestartCluster.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestRestartCluster.html" title="class in org.apache.hadoop.hbase.master">TestRestartCluster</a></dt>
@@ -19570,6 +19572,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestClockSkewDetection.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestClockSkewDetection.html" title="class in org.apache.hadoop.hbase.master">TestClockSkewDetection</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting</a></dt>
@@ -22302,6 +22306,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMaster.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMaster.html" title="class in org.apache.hadoop.hbase.master">TestMaster</a></dt>
@@ -27081,6 +27087,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.html#QUALIFIER">QUALIFIER</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.html" title="class in org.apache.hadoop.hbase.mapreduce">TestLoadIncrementalHFiles</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#QUALIFIER">QUALIFIER</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html#QUALIFIER">QUALIFIER</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master">TestWarmupRegion</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#qualifier">qualifier</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></dt>
@@ -29109,6 +29117,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TestTagCompressionContext.html#ROW">ROW</a></span> - Static variable in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TestTagCompressionContext.html" title="class in org.apache.hadoop.hbase.io">TestTagCompressionContext</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#ROW">ROW</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html#ROW">ROW</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master">TestWarmupRegion</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/TestMobFileCache.html#ROW">ROW</a></span> - Static variable in class org.apache.hadoop.hbase.mob.<a href="org/apache/hadoop/hbase/mob/TestMobFileCache.html" title="class in org.apache.hadoop.hbase.mob">TestMobFileCache</a></dt>
@@ -32558,6 +32568,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">TestActiveMasterManager</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDeadServer.html#setupBeforeClass--">setupBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master">TestDeadServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master">TestMasterNoCluster</a></dt>
@@ -34136,6 +34148,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MockNoopMasterServices.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-byte:A-long-long-">splitRegion(HRegionInfo, byte[], long, long)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MockNoopMasterServices.html" title="class in org.apache.hadoop.hbase.master">MockNoopMasterServices</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#splitRegion-org.apache.hadoop.hbase.HRegionInfo-">splitRegion(HRegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html#splits">splits</a></span> - Variable in class org.apache.hadoop.hbase.chaos.actions.<a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">SplitAllRegionOfTableAction</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/BaseTestHBaseFsck.html#SPLITS">SPLITS</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/BaseTestHBaseFsck.html" title="class in org.apache.hadoop.hbase.util">BaseTestHBaseFsck</a></dt>
@@ -37018,6 +37032,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">TestActiveMasterManager</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDeadServer.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master">TestDeadServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master">TestMasterNoCluster</a></dt>
@@ -37994,6 +38010,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html" title="class in org.apache.hadoop.hbase.master">TestAssignmentManagerMetrics</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDeadServer.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDeadServer.html" title="class in org.apache.hadoop.hbase.master">TestDeadServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestDistributedLogSplitting.html" title="class in org.apache.hadoop.hbase.master">TestDistributedLogSplitting</a></dt>
@@ -40210,6 +40228,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html#TestCatalogJanitor--">TestCatalogJanitor()</a></span> - Constructor for class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestCatalogJanitorInMemoryStates</span></a> - Class in <a href="org/apache/hadoop/hbase/master/package-summary.html">org.apache.hadoop.hbase.master</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#TestCatalogJanitorInMemoryStates--">TestCatalogJanitorInMemoryStates()</a></span> - Constructor for class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/types/TestCopyOnWriteMaps.html#testCeilingKey--">testCeilingKey()</a></span> - Method in class org.apache.hadoop.hbase.types.<a href="org/apache/hadoop/hbase/types/TestCopyOnWriteMaps.html" title="class in org.apache.hadoop.hbase.types">TestCopyOnWriteMaps</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestCellUtil.TestCell.html#TestCell-int-">TestCell(int)</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestCellUtil.TestCell.html" title="class in org.apache.hadoop.hbase">TestCellUtil.TestCell</a></dt>
@@ -46122,6 +46144,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.html#testInitTableSnapshotMapperJobConfig--">testInitTableSnapshotMapperJobConfig()</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/master/TestCatalogJanitorInMemoryStates.html#testInMemoryParentCleanup--">testInMemoryParentCleanup()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>
+<div class="block">Test clearing a split parent from memory.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.html#testInProcess--">testInProcess()</a></span> - Method in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapred/TestTableInputFormat.html#testInputFormat-java.lang.Class-">testInputFormat(Class&lt;? extends InputFormat&gt;)</a></span> - Method in class org.apache.hadoop.hbase.mapred.<a href="org/apache/hadoop/hbase/mapred/TestTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapred">TestTableInputFormat</a></dt>
@@ -57926,6 +57952,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html#timeout">timeout</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#timeout">timeout</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html#timeout">timeout</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterNoCluster.html" title="class in org.apache.hadoop.hbase.master">TestMasterNoCluster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#timeout">timeout</a></span> - Variable in class org.apache.hadoop.hbase.namespace.<a href="org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html" title="class in org.apache.hadoop.hbase.namespace">TestNamespaceAuditor</a></dt>
@@ -59564,6 +59592,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.html#value">value</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.html" title="class in org.apache.hadoop.hbase.mapreduce">TestWALRecordReader</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master">TestWarmupRegion</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/metrics/impl/TestGauge.SimpleGauge.html#value">value</a></span> - Variable in class org.apache.hadoop.hbase.metrics.impl.<a href="org/apache/hadoop/hbase/metrics/impl/TestGauge.SimpleGauge.html" title="class in org.apache.hadoop.hbase.metrics.impl">TestGauge.SimpleGauge</a></dt>
@@ -60988,6 +61018,8 @@ the order they are declared.</div>
 <dd>
 <div class="block">Wait on crash processing.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html#waitOnDaughters-org.apache.hadoop.hbase.HRegionInfo-">waitOnDaughters(HRegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitorInMemoryStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html#waitOnFuture-java.util.concurrent.Future-">waitOnFuture(Future&lt;byte[]&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureNonce.TestProcEnv.html#waitOnLatch--">waitOnLatch()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureNonce.TestProcEnv.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureNonce.TestProcEnv</a></dt>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.RandRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
index c687435..f6f823c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
@@ -440,543 +440,549 @@
 <span class="sourceLineNo">432</span>    serverMap.clear();<a name="line.432"></a>
 <span class="sourceLineNo">433</span>  }<a name="line.433"></a>
 <span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // ==========================================================================<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  //  RegionStateNode helpers<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // ==========================================================================<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return regionsMap.get(regionName);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        return node;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return null;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Remove from the offline regions map too if there.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      this.regionOffline.remove(regionInfo);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (!node.getTable().equals(tableName)) break;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      regions.add(node);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return regions;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      if (!node.getTable().equals(tableName)) break;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      regions.add(createRegionState(node));<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return regions;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      if (!node.getTable().equals(tableName)) break;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regions.add(node.getRegionInfo());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return regions;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return regionsMap.values();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      regions.add(createRegionState(node));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    return regions;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  // ==========================================================================<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  //  RegionState helpers<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  // ==========================================================================<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return node == null ? null :<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.529"></a>
+<span class="sourceLineNo">435</span>  @VisibleForTesting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public boolean isRegionInRegionStates(final HRegionInfo hri) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (regionsMap.containsKey(hri.getRegionName()) || regionInTransition.containsKey(hri)<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        || regionOffline.containsKey(hri));<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  // ==========================================================================<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  //  RegionStateNode helpers<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ==========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  protected RegionStateNode createRegionNode(final HRegionInfo regionInfo) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    RegionStateNode newNode = new RegionStateNode(regionInfo);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    RegionStateNode oldNode = regionsMap.putIfAbsent(regionInfo.getRegionName(), newNode);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return oldNode != null ? oldNode : newNode;<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>  protected RegionStateNode getOrCreateRegionNode(final HRegionInfo regionInfo) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    RegionStateNode node = regionsMap.get(regionInfo.getRegionName());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return node != null ? node : createRegionNode(regionInfo);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  RegionStateNode getRegionNodeFromName(final byte[] regionName) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return regionsMap.get(regionName);<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>  protected RegionStateNode getRegionNode(final HRegionInfo regionInfo) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getRegionNodeFromName(regionInfo.getRegionName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  RegionStateNode getRegionNodeFromEncodedName(final String encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        return node;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public void deleteRegion(final HRegionInfo regionInfo) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    regionsMap.remove(regionInfo.getRegionName());<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    // Remove from the offline regions map too if there.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    if (this.regionOffline.containsKey(regionInfo)) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      if (LOG.isTraceEnabled()) LOG.trace("Removing from regionOffline Map: " + regionInfo);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this.regionOffline.remove(regionInfo);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!node.getTable().equals(tableName)) break;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      regions.add(node);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return regions;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (!node.getTable().equals(tableName)) break;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      regions.add(createRegionState(node));<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    return regions;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>  ArrayList&lt;HRegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    final ArrayList&lt;HRegionInfo&gt; regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      if (!node.getTable().equals(tableName)) break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      regions.add(node.getRegionInfo());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return regions;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  Collection&lt;RegionStateNode&gt; getRegionNodes() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return regionsMap.values();<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      regions.add(createRegionState(node));<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    return regions;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  // ==========================================================================<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  //  RegionState helpers<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  // ==========================================================================<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public RegionState getRegionState(final HRegionInfo regionInfo) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return createRegionState(getRegionNode(regionInfo));<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return createRegionState(getRegionNodeFromEncodedName(encodedRegionName));<a name="line.529"></a>
 <span class="sourceLineNo">530</span>  }<a name="line.530"></a>
 <span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  // ============================================================================================<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  //  TODO: helpers<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  // ============================================================================================<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // TODO<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return !getTableRegionStates(tableName).isEmpty();<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>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return getRegionsOfTable(table, false);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (RegionStateNode node: nodes) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return hris;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * weed out split and offline regions.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (LOG.isTraceEnabled()) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  /**<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * Returns the set of regions hosted by the specified server<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param serverName the server we are interested in<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>    synchronized (serverInfo) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      return serverInfo.getRegionInfoList();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  // ============================================================================================<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  //  TODO: split helpers<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  // ============================================================================================<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void logSplit(final ServerName serverName) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    synchronized (serverNode) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        synchronized (regionNode) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          // TODO: Abort procedure if present<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          regionNode.setState(State.SPLITTING);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }*/<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    synchronized (regionNode) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      regionNode.setState(State.SPLIT);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>  @VisibleForTesting<a name="line.608"></a>
-<span class="sourceLineNo">609</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    synchronized (regionNode) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      regionNode.setState(state);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  // ============================================================================================<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  //  TODO:<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  // ============================================================================================<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      if (!node.isInTransition()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        result.add(node.getRegionInfo());<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    return result;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    if (region != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      synchronized (region) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        return region.isInState(state);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    return false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  }<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HRegionInfo hri: regions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (node == null) continue;<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // TODO: State.OPEN<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      final ServerName serverName = node.getRegionLocation();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      if (serverName == null) continue;<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (serverRegions == null) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        result.put(serverName, serverRegions);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
+<span class="sourceLineNo">532</span>  private RegionState createRegionState(final RegionStateNode node) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    return node == null ? null :<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      new RegionState(node.getRegionInfo(), node.getState(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        node.getLastUpdate(), node.getRegionLocation());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  }<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>  //  TODO: helpers<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  // ============================================================================================<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    // TODO<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  public List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return getRegionsOfTable(table, false);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  List&lt;HRegionInfo&gt; getRegionsOfTable(final TableName table, final boolean offline) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionStateNode&gt; nodes = getTableRegionStateNodes(table);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    final ArrayList&lt;HRegionInfo&gt; hris = new ArrayList&lt;HRegionInfo&gt;(nodes.size());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    for (RegionStateNode node: nodes) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      if (include(node, offline)) hris.add(node.getRegionInfo());<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    return hris;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  /**<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * weed out split and offline regions.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    if (LOG.isTraceEnabled()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final HRegionInfo hri = node.getRegionInfo();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * Returns the set of regions hosted by the specified server<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param serverName the server we are interested in<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @return set of HRegionInfo hosted by the specified server<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public List&lt;HRegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    synchronized (serverInfo) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      return serverInfo.getRegionInfoList();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>  // ============================================================================================<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  //  TODO: split helpers<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  // ============================================================================================<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void logSplit(final ServerName serverName) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    final ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    synchronized (serverNode) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      serverNode.setState(ServerState.SPLITTING);<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      /* THIS HAS TO BE WRONG. THIS IS SPLITTING OF REGION, NOT SPLITTING WALs.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      for (RegionStateNode regionNode: serverNode.getRegions()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        synchronized (regionNode) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          // TODO: Abort procedure if present<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          regionNode.setState(State.SPLITTING);<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      }*/<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  public void logSplit(final HRegionInfo regionInfo) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    final RegionStateNode regionNode = getRegionNode(regionInfo);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    synchronized (regionNode) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      regionNode.setState(State.SPLIT);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>  @VisibleForTesting<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  public void updateRegionState(final HRegionInfo regionInfo, final State state) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    final RegionStateNode regionNode = getOrCreateRegionNode(regionInfo);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    synchronized (regionNode) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      regionNode.setState(state);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  // ============================================================================================<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  //  TODO:<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  // ============================================================================================<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public List&lt;HRegionInfo&gt; getAssignedRegions() {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    final List&lt;HRegionInfo&gt; result = new ArrayList&lt;HRegionInfo&gt;();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      if (!node.isInTransition()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        result.add(node.getRegionInfo());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    return result;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public boolean isRegionInState(final HRegionInfo regionInfo, final State... state) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    if (region != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      synchronized (region) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        return region.isInState(state);<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>    return false;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public boolean isRegionOnline(final HRegionInfo regionInfo) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  /**<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   */<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean isRegionOffline(final HRegionInfo regionInfo) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      final Collection&lt;HRegionInfo&gt; regions) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    final Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (HRegionInfo hri: regions) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      final RegionStateNode node = getRegionNode(hri);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (node == null) continue;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>      // TODO: State.OPEN<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      final ServerName serverName = node.getRegionLocation();<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (serverName == null) continue;<a name="line.665"></a>
 <span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>      serverRegions.add(node.getRegionInfo());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return result;<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>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    return assignments;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final State[] states = State.values();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      if (node.getTable().equals(tableName)) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">667</span>      List&lt;HRegionInfo&gt; serverRegions = result.get(serverName);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (serverRegions == null) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        result.put(serverName, serverRegions);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>      serverRegions.add(node.getRegionInfo());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    return result;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>  public Map&lt;HRegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    final HashMap&lt;HRegionInfo, ServerName&gt; assignments = new HashMap&lt;HRegionInfo, ServerName&gt;();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return assignments;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    final State[] states = State.values();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    final Map&lt;RegionState.State, List&lt;HRegionInfo&gt;&gt; tableRegions =<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        new HashMap&lt;State, List&lt;HRegionInfo&gt;&gt;(states.length);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      tableRegions.put(states[i], new ArrayList&lt;HRegionInfo&gt;());<a name="line.691"></a>
 <span class="sourceLineNo">692</span>    }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    return tableRegions;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (region != null) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      synchronized (region) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        ServerName server = region.getRegionLocation();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        return server != null ? server : region.getLastHost();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    return null;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
-<span class="sourceLineNo">706</span><a name="line.706"></a>
-<span class="sourceLineNo">707</span>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * Can't let out original since it can change and at least the load balancer<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return A clone of current assignments by table.<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   */<a name="line.714"></a>
-<span class="sourceLineNo">715</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      final boolean forceByCluster) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      if (node.getTable().equals(tableName)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return tableRegions;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  public ServerName getRegionServerOfRegion(final HRegionInfo regionInfo) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    final RegionStateNode region = getRegionNode(regionInfo);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (region != null) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      synchronized (region) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        ServerName server = region.getRegionLocation();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        return server != null ? server : region.getLastHost();<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return null;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * Can't let out original since it can change and at least the load balancer<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @return A clone of current assignments by table.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      final boolean forceByCluster) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return result;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (tableResult == null) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        result.put(node.getTable(), tableResult);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>      final ServerName serverName = node.getRegionLocation();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (serverName == null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        LOG.info("Skipping, no server for " + node);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        continue;<a name="line.744"></a>
+<span class="sourceLineNo">725</span>    final HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt; ensemble =<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(serverMap.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result =<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt;(1);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    return result;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      if (tableResult == null) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        tableResult = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>        result.put(node.getTable(), tableResult);<a name="line.744"></a>
 <span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      if (serverResult == null) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        tableResult.put(serverName, serverResult);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>      serverResult.add(node.getRegionInfo());<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return result;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  // ==========================================================================<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  //  Region in transition helpers<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  // ==========================================================================<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      final RegionTransitionProcedure procedure) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return true;<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      final RegionTransitionProcedure procedure) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    regionNode.unsetProcedure(procedure);<a name="line.771"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>      final ServerName serverName = node.getRegionLocation();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (serverName == null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        LOG.info("Skipping, no server for " + node);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>        continue;<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      List&lt;HRegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      if (serverResult == null) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        serverResult = new ArrayList&lt;HRegionInfo&gt;();<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        tableResult.put(serverName, serverResult);<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>      serverResult.add(node.getRegionInfo());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return result;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  // ==========================================================================<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  //  Region in transition helpers<a name="line.764"></a>
+<span class="sourceLineNo">765</span>  // ==========================================================================<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      final RegionTransitionProcedure procedure) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return true;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
 <span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean hasRegionsInTransition() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return !regionInTransition.isEmpty();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return node != null ? node.isInTransition() : false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    if (node == null) return null;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return node.getProcedure();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.792"></a>
+<span class="sourceLineNo">774</span>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      final RegionTransitionProcedure procedure) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    regionNode.unsetProcedure(procedure);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hasRegionsInTransition() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return !regionInTransition.isEmpty();<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean isRegionInTransition(final HRegionInfo regionInfo) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return node != null ? node.isInTransition() : 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>  /**<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final HRegionInfo hri) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    if (node == null) return null;<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    synchronized (node) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      return node.isInTransition() ? createRegionState(node) : null;<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>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the number of regions in transition.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public int getRegionsInTransitionCount() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      rit.add(createRegionState(node));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return rit;<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>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      rit.add(createRegionState(node));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    return rit;<a name="line.825"></a>
-<span class="sourceLineNo">826</span>  }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>  // ==========================================================================<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  //  Region offline helpers<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  // ==========================================================================<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  // TODO: Unused.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    regionOffline.remove(regionInfo);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<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>  //  Region FAIL_OPEN helpers<a name="line.843"></a>
-<span class="sourceLineNo">844</span>  // ==========================================================================<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  public static final class RegionFailedOpen {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    private final RegionStateNode regionNode;<a name="line.846"></a>
+<span class="sourceLineNo">795</span>    return node.getProcedure();<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>  public RegionState getRegionTransitionState(final HRegionInfo hri) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (node == null) return null;<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    synchronized (node) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      return node.isInTransition() ? createRegionState(node) : null;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
+<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<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>   * Get the number of regions in transition.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  public int getRegionsInTransitionCount() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return regionInTransition.size();<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>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      rit.add(createRegionState(node));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    return rit;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      rit.add(createRegionState(node));<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return rit;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  // ==========================================================================<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  //  Region offline helpers<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  // ==========================================================================<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<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>  // TODO: Unused.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  public void removeFromOfflineRegions(final HRegionInfo regionInfo) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    regionOffline.remove(regionInfo);<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>    private volatile Exception exception = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    private volatile int retries = 0;<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>    public RegionFailedOpen(final RegionStateNode regionNode) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      this.regionNode = regionNode;<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>    public RegionStateNode getRegionNode() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      return regionNode;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    public HRegionInfo getRegionInfo() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      return regionNode.getRegionInfo();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    public int incrementAndGetRetries() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return ++this.retries;<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>    public int getRetries() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      return retries;<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>    public void setException(final Exception exception) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      this.exception = exception;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    public Exception getException() {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      return this.exception;<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><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  public RegionFailedOpen addToFailedOpen(final RegionStateNode regionNode) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    final byte[] key = regionNode.getRegionInfo().getRegionName();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    RegionFailedOpen node = regionFailedOpen.get(key);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (node == null) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      RegionFailedOpen newNode = new RegionFailedOpen(regionNode);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      RegionFailedOpen oldNode = regionFailedOpen.putIfAbsent(key, newNode);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      node = oldNode != null ? oldNode : newNode;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    return node;<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>  public RegionFailedOpen getFailedOpen(final HRegionInfo regionInfo) {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    return regionFailedOpen.get(regionInfo.getRegionName());<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>  public void removeFromFailedOpen(final HRegionInfo regionInfo) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    regionFailedOpen.remove(regionInfo.getRegionName());<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>  public List&lt;RegionState&gt; getRegionFailedOpen() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (regionFailedOpen.isEmpty()) return Collections.emptyList();<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionFailedOpen.size());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    for (RegionFailedOpen r: regionFailedOpen.values()) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      regions.add(createRegionState(r.getRegionNode()));<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    return regions;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>  // ==========================================================================<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  //  Servers<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  // ==========================================================================<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public ServerStateNode getOrCreateServer(final ServerName serverName) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    ServerStateNode node = serverMap.get(serverName);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (node == null) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      node = new ServerStateNode(serverName);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      ServerStateNode oldNode = serverMap.putIfAbsent(serverName, node);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      node = oldNode != null ? oldNode : node;<a name="line.917"></a>
-<span class="sourc

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
index a4ec9de..dd72bc5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
@@ -229,242 +229,251 @@
 <span class="sourceLineNo">221</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.221"></a>
 <span class="sourceLineNo">222</span>      pe.submitProcedure(new GCMergedRegionsProcedure(pe.getEnvironment(),<a name="line.222"></a>
 <span class="sourceLineNo">223</span>          mergedRegion, regionA, regionB));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      return true;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return false;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * garbage to collect.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return number of archiving jobs started.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @throws IOException<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  int scan() throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    int result = 0;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("CatalogJanitor already running");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return result;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        getMergedRegionsAndSplitParents();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      /**<a name="line.244"></a>
-<span class="sourceLineNo">245</span>       * clean merge regions first<a name="line.245"></a>
-<span class="sourceLineNo">246</span>       */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        if (this.services.isInMaintenanceMode()) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          // Stop cleaning if the master is in maintenance mode<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          break;<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>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        HRegionInfo regionA = p.getFirst();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        HRegionInfo regionB = p.getSecond();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        if (regionA == null || regionB == null) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          LOG.warn("Unexpected references regionA="<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              + (regionA == null ? "null" : regionA.getShortNameToLog())<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              + ",regionB="<a name="line.260"></a>
-<span class="sourceLineNo">261</span>              + (regionB == null ? "null" : regionB.getShortNameToLog())<a name="line.261"></a>
-<span class="sourceLineNo">262</span>              + " in merged region " + e.getKey().getShortNameToLog());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } else {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            result++;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>       * clean split parents<a name="line.270"></a>
-<span class="sourceLineNo">271</span>       */<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      // regions whose parents are still around<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;&gt;();<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        if (this.services.isInMaintenanceMode()) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          // Stop cleaning if the master is in maintenance mode<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          break;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>              cleanParent(e.getKey(), e.getValue())) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            result++;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        } else {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          // We could not clean the parent, so it's daughters should not be<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // cleaned either (HBASE-6160)<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      return result;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      alreadyRunning.set(false);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * daughters.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // parent before daughters.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if (left == null) return -1;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      if (right == null) return 1;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // Same table name.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      if (result != 0) return result;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Compare start keys.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      if (result != 0) return result;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return result;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * @param parent HRegionInfo of split offlined parent<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * the filesystem.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * @throws IOException<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    // Check whether it is a merged region and not clean reference<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // be inserted/deleted together<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      // wait cleaning merge region first<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return false;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Run checks on each daughter split.<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      String daughterA = daughters.getFirst() != null?<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          daughters.getFirst().getShortNameToLog(): "null";<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      String daughterB = daughters.getSecond() != null?<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          daughters.getSecond().getShortNameToLog(): "null";<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      LOG.debug("Deleting region " + parent.getShortNameToLog() +<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        " because daughters -- " + daughterA + ", " + daughterB +<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        " -- no longer hold references");<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      pe.submitProcedure(new GCRegionProcedure(pe.getEnvironment(), parent));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      return true;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    return false;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  /**<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * whether the daughter has references to the parent.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return !p.getFirst() || !p.getSecond();<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>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * references to parent.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @param parent Parent region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param daughter Daughter region<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * whether the daughter has references to the parent.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @throws IOException<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  throws IOException {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (daughter == null)  {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<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>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HRegionFileSystem regionFs = null;<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    try {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (IOException ioe) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      LOG.error("Error trying to determine if daughter region exists, " +<a name="line.402"></a>
-<span class="sourceLineNo">403</span>               "assuming exists and has references", ioe);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>    boolean references = false;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>      for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          break;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException e) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      LOG.error("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return new Pair&lt;&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws FileNotFoundException, IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  /**<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * them<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * @param region<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * @throws IOException<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      throws IOException {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    // Get merge regions if it is a merged region and already has merge<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // qualifier<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          region.getRegionName());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    if (mergeRegions == null<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // It doesn't have merge qualifier, no need to clean<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      return true;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          + " has only one merge qualifier in META.");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      return false;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        mergeRegions.getSecond());<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">224</span>      // Remove from in-memory states<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(regionA);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(regionB);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      this.services.getServerManager().removeRegion(regionA);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      this.services.getServerManager().removeRegion(regionB);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return true;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    return false;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * garbage to collect.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @return number of archiving jobs started.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @throws IOException<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  int scan() throws IOException {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int result = 0;<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        LOG.debug("CatalogJanitor already running");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        return result;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        getMergedRegionsAndSplitParents();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>       * clean merge regions first<a name="line.251"></a>
+<span class="sourceLineNo">252</span>       */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        if (this.services.isInMaintenanceMode()) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          // Stop cleaning if the master is in maintenance mode<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          break;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        HRegionInfo regionA = p.getFirst();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        HRegionInfo regionB = p.getSecond();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (regionA == null || regionB == null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.warn("Unexpected references regionA="<a name="line.264"></a>
+<span class="sourceLineNo">265</span>              + (regionA == null ? "null" : regionA.getShortNameToLog())<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              + ",regionB="<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              + (regionB == null ? "null" : regionB.getShortNameToLog())<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              + " in merged region " + e.getKey().getShortNameToLog());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            result++;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      /**<a name="line.275"></a>
+<span class="sourceLineNo">276</span>       * clean split parents<a name="line.276"></a>
+<span class="sourceLineNo">277</span>       */<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // regions whose parents are still around<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;&gt;();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        if (this.services.isInMaintenanceMode()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          // Stop cleaning if the master is in maintenance mode<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          break;<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>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          result++;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        } else {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // We could not clean the parent, so it's daughters should not be<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          // cleaned either (HBASE-6160)<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      return result;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    } finally {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      alreadyRunning.set(false);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>  /**<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * daughters.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    @Override<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // parent before daughters.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      if (left == null) return -1;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      if (right == null) return 1;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // Same table name.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (result != 0) return result;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // Compare start keys.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      if (result != 0) return result;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return result;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * @param parent HRegionInfo of split offlined parent<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * the filesystem.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * @throws IOException<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  throws IOException {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    // Check whether it is a merged region and not clean reference<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // be inserted/deleted together<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      // wait cleaning merge region first<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      return false;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // Run checks on each daughter split.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      String daughterA = daughters.getFirst() != null?<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          daughters.getFirst().getShortNameToLog(): "null";<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      String daughterB = daughters.getSecond() != null?<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          daughters.getSecond().getShortNameToLog(): "null";<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      LOG.debug("Deleting region " + parent.getShortNameToLog() +<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        " because daughters -- " + daughterA + ", " + daughterB +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        " -- no longer hold references");<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      ProcedureExecutor&lt;MasterProcedureEnv&gt; pe = this.services.getMasterProcedureExecutor();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      pe.submitProcedure(new GCRegionProcedure(pe.getEnvironment(), parent));<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      // Remove from in-memory states<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      this.services.getAssignmentManager().getRegionStates().deleteRegion(parent);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      this.services.getServerManager().removeRegion(parent);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      return true;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return false;<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>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * whether the daughter has references to the parent.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    return !p.getFirst() || !p.getSecond();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>  /**<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * references to parent.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * @param parent Parent region<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @param daughter Daughter region<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * whether the daughter has references to the parent.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @throws IOException<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    if (daughter == null)  {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>    HRegionFileSystem regionFs = null;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>    try {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        return new Pair&lt;&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    } catch (IOException ioe) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.error("Error trying to determine if daughter region exists, " +<a name="line.411"></a>
+<span class="sourceLineNo">412</span>               "assuming exists and has references", ioe);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    boolean references = false;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    try {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.420"></a>
+<span class="sourceLineNo">421</span><a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          break;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (IOException e) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      LOG.error("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      return new Pair&lt;&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return new Pair&lt;&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      throws FileNotFoundException, IOException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * them<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param region<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * @throws IOException<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      throws IOException {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    // Get merge regions if it is a merged region and already has merge<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    // qualifier<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          region.getRegionName());<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (mergeRegions == null<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      // It doesn't have merge qualifier, no need to clean<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      return true;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    }<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.461"></a>
+<span class="sourceLineNo">462</span>          + " has only one merge qualifier in META.");<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      return false;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        mergeRegions.getSecond());<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>}<a name="line.468"></a>
 
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
index 785d459..62da186 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.NoopRsExecutor.html
@@ -251,7 +251,7 @@
 <span class="sourceLineNo">243</span>    }<a name="line.243"></a>
 <span class="sourceLineNo">244</span>  }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
+<span class="sourceLineNo">246</span>  @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient.<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  public void testSocketTimeout() throws Exception {<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    final TableName tableName = TableName.valueOf(this.name.getMethodName());<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.249"></a>
@@ -262,580 +262,579 @@
 <span class="sourceLineNo">254</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3));<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    exception.expect(ServerCrashException.class);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testServerNotYetRunning() throws Exception {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      final MockRSExecutor executor) throws Exception {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // collect AM metrics before test<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    collectAssignmentManagerMetrics();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Test Assign operation failure<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      fail("unexpected assign completion");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    } catch (RetriesExhaustedException e) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // expected exception<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // Assign the region (without problems)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // There is no count on unassign.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /*<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    // Test Unassign operation failure<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">257</span>    rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // exception.expect(ServerCrashException.class);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  @Test<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void testServerNotYetRunning() throws Exception {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()),<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      new ServerNotYetRunningRsExecutor());<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>  private void testRetriesExhaustedFailure(final TableName tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      final MockRSExecutor executor) throws Exception {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // collect AM metrics before test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    collectAssignmentManagerMetrics();<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Test Assign operation failure<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      fail("unexpected assign completion");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } catch (RetriesExhaustedException e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // expected exception<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<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>    // Assign the region (without problems)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>    // TODO: Currently unassign just keeps trying until it sees a server crash.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // There is no count on unassign.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    /*<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // Test Unassign operation failure<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false)));<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it!<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
 <span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  @Test<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // collect AM metrics before test<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    collectAssignmentManagerMetrics();<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // collect AM metrics before test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    collectAssignmentManagerMetrics();<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  private void testFailedOpen(final TableName tableName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      final MockRSExecutor executor) throws Exception {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Test Assign operation failure<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      fail("unexpected assign completion");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    } catch (RetriesExhaustedException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // expected exception<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    testAssign(executor, NREGIONS);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long st = System.currentTimeMillis();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    bulkSubmit(assignments);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      ProcedureTestingUtility.waitProcedure(<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long et = System.currentTimeMillis();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    float sec = ((et - st) / 1000.0f);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Test<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>    // collect AM metrics before test<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    collectAssignmentManagerMetrics();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // wait first assign<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    waitOnFuture(futureA);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // and skip out doing nothing.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // wait second assign<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    waitOnFuture(futureB);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // TODO: What else can we do to ensure just a noop.<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // better way?<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  }<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // collect AM metrics before test<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    collectAssignmentManagerMetrics();<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // assign the region first<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    // Wait first unassign.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    waitOnFuture(futureA);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // and skip out doing nothing.<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    final Future&lt;byte[]&gt; futureB =<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    waitOnFuture(futureB);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    // Ensure we are still CLOSED.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    // TODO: What else can we do to ensure just a noop.<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // better way?<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } catch (ExecutionException e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      LOG.info("ExecutionException", e);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      throw (Exception)e.getCause();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  // ============================================================================================<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  //  Helpers<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  // ============================================================================================<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      final int threadId = i;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      threads[i] = new Thread() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        @Override<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        public void run() {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          int n = (procs.length / threads.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          int start = threadId * n;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          int stop = start + n;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      };<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      threads[i].start();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      threads[i].join();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return proc;<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>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return proc;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    return new HRegionInfo(tableName,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<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>  private void sendTransitionReport(final ServerName serverName,<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      .addRegionInfo(regionInfo)<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      .setTransitionCode(state)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      .setOpenSeqNum(1)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      .build());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    am.reportRegionStateTransition(req.build());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void doCrash(final ServerName serverName) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            if (state != null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              resp.addOpeningState(state);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>            }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              req.getRegion().getValue().toByteArray());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          if (resp != null) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            builder.addCloseRegion(resp);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return ExecuteProceduresResponse.newBuilder().build();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo regionInfo)<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return null;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  private class GoodRsExecutor extends NoopRsExecutor {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      // Concurrency?<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      if (regions == null) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        regionsToRegionServers.put(server, regions);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      if (regions.contains(hri.getRegionName())) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      regions.add(hri.getRegionName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      return RegionOpeningState.OPENED;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class ServerNotYetRunningRsExecutor implements MockRSExecutor {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      throw new ServerNotRunningYetException("wait on server startup");<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  private static class FaultyRsExecutor implements MockRSExecutor {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private final IOException exception;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    public FaultyRsExecutor(final IOException exception) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.exception = exception;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        throws IOException {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      throw exception;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  private class SocketTimeoutRsExecutor extends GoodRsExecutor {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private final int maxSocketTimeoutRetries;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    private final int maxServerRetries;<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    private ServerName lastServer;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    private int sockTimeoutRetries;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    private int serverRetries;<a name="line.615"></a>
-<span class="sourceLineNo">616</span><a name="line.616"></a>
-<span class="sourceLineNo">617</span>    public SocketTimeoutRsExecutor(int maxSocketTimeoutRetries, int maxServerRetries) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      this.maxServerRetries = maxServerRetries;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.maxSocketTimeoutRetries = maxSocketTimeoutRetries;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // SocketTimeoutException should be a temporary problem<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // unless the server will be declared dead.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (sockTimeoutRetries++ &lt; maxSocketTimeoutRetries) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (sockTimeoutRetries == 1) assertNotEquals(lastServer, server);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        lastServer = server;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      } else if (serverRetries++ &lt; maxServerRetries) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        master.getServerManager().moveFromOnlineToDeadServers(server);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        sockTimeoutRetries = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        throw new SocketTimeoutException("simulate socket timeout");<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        return super.sendRequest(server, req);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      }<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * Takes open request and then returns nothing so acts like a RS that went zombie.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * No response (so proc is stuck/suspended on the Master and won't wake up.). We<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * then send in a crash for this server after a few seconds; crash is supposed to<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * take care of the suspended procedures.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private class HangThenRSCrashExecutor extends GoodRsExecutor {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    private int invocations;<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (this.invocations++ &gt; 0) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        // Return w/o problem the second time through here.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        return super.execOpenRegion(server, openReq);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      // from the RS in this case.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      executor.schedule(new Runnable() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        public void run() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          LOG.info("Sending in CRASH of " + server);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          doCrash(server);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }, 1, TimeUnit.SECONDS);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private class HangOnCloseThenRSCrashExecutor extends GoodRsExecutor {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    public static final int TYPES_OF_FAILURE = 6;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    private int invocations;<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        throws IOException {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      switch (this.invocations++) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      case 0: throw new NotServingRegionException("Fake");<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      case 1: throw new RegionServerAbortedException("Fake!");<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      case 2: throw new RegionServerStoppedException("Fake!");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      case 3: throw new ServerNotRunningYetException("Fake!");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      case 4:<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout");<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        executor.schedule(new Runnable() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          public void run() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            LOG.info("Sending in CRASH of " + server);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            doCrash(server);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        }, 1, TimeUnit.SECONDS);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        return null;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      default:<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        return super.execCloseRegion(server, regionName);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  private class RandRsExecutor extends NoopRsExecutor {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    private final Random rand = new Random();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        throws IOException {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      switch (rand.nextInt(5)) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        case 0: throw new ServerNotRunningYetException("wait on server startup");<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        case 1: throw new SocketTimeoutException("simulate socket timeout");<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        case 2: throw new RemoteException("java.io.IOException", "unexpected exception");<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      return super.sendRequest(server, req);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq)<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        throws IOException {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      switch (rand.nextInt(6)) {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        case 0:<a name="line.717"></a>
-<span class="sourceLineNo">718</span>          LOG.info("Return OPENED response");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          return OpenRegionResponse.RegionOpeningState.OPENED;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>        case 1:<a name="line.721"></a>
-<span class="sourceLineNo">722</span>          LOG.info("Return transition report that OPENED/ALREADY_OPENED response");<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          return OpenRegionResponse.RegionOpeningState.ALREADY_OPENED;<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        case 2:<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          LOG.info("Return transition report that FAILED_OPEN/FAILED_OPENING response");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>          sendTransitionReport(server, openReq.getRegion(), TransitionCode.FAILED_OPEN);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>          return OpenRegionResponse.RegionOpeningState.FAILED_OPENING;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      // The procedure on master will just hang forever because nothing comes back<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      // from the RS in this case.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      LOG.info("Return null as response; means proc stuck so we send in a crash report after a few seconds...");<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      executor.schedule(new Runnable() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        public void run() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          LOG.info("Delayed CRASHING of " + server);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          doCrash(server);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }, 5, TimeUnit.SECONDS);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      return null;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        throws IOException {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      CloseRegionResponse.Builder resp = CloseRegionResponse.newBuilder();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      boolean closed = rand.nextBoolean();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      if (closed) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      resp.setClosed(closed);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return resp.build();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>  private interface MockRSExecutor {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        throws IOException;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private class MockRSProcedureDispatcher extends RSProcedureDispatcher {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    private MockRSExecutor mockRsExec;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    public MockRSProcedureDispatcher(final MasterServices master) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      super(master);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    public void setMockRsExecutor(final MockRSExecutor mockRsExec) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      this.mockRsExec = mockRsExec;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    @Override<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    protected void remoteDispatch(ServerName serverName, Set&lt;RemoteProcedure&gt; operations) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      submitTask(new MockRemoteCall(serverName, operations));<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private class MockRemoteCall extends ExecuteProceduresRemoteCall {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public MockRemoteCall(final ServerName serverName,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          final Set&lt;RemoteProcedure&gt; operations) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super(serverName, operations);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>      @Override<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      protected ExecuteProceduresResponse sendRequest(final ServerName serverName,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>          final ExecuteProceduresRequest request) throws IOException {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        return mockRsExec.sendRequest(serverName, request);<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><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  private class GoodSplitExecutor extends NoopRsExecutor {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    <a name="line.793"></a>
-<span class="sourceLineNo">794</span>    /*<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    protected RegionOpeningState execOpenRegion(ServerName server, RegionOpenInfo openReq)<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        throws IOException {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      sendTransitionReport(server, openReq.getRegion(), TransitionCode.OPENED);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      // Concurrency?<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      // Now update the state of our cluster in regionsToRegionServers.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      SortedSet&lt;byte []&gt; regions = regionsToRegionServers.get(server);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      if (regions == null) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        regions = new ConcurrentSkipListSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        regionsToRegionServers.put(server, regions);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      HRegionInfo hri = HRegionInfo.convert(openReq.getRegion());<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (regions.contains(hri.getRegionName())) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new UnsupportedOperationException(hri.getRegionNameAsString());<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      regions.add(hri.getRegionName());<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      return RegionOpeningState.OPENED;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    protected CloseRegionResponse execCloseRegion(ServerName server, byte[] regionName)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        throws IOException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      HRegionInfo hri = am.getRegionInfo(regionName);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      sendTransitionReport(server, HRegionInfo.convert(hri), TransitionCode.CLOSED);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      return CloseRegionResponse.newBuilder().setClosed(true).build();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }*/<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    <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>  private void collectAssignmentManagerMetrics() {<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    assignFailedCount = assignProcMetrics.getFailedCounter().getCount();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();<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">312</span>  @Test<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void testIOExceptionOnAssignment() throws Exception {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // collect AM metrics before test<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    collectAssignmentManagerMetrics();<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    testFailedOpen(TableName.valueOf("testExceptionOnAssignment"),<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      new FaultyRsExecutor(new IOException("test fault")));<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<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>  @Test<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void testDoNotRetryExceptionOnAssignment() throws Exception {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // collect AM metrics before test<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    collectAssignmentManagerMetrics();<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault")));<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void testFailedOpen(final TableName tableName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      final MockRSExecutor executor) throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Test Assign operation failure<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      fail("unexpected assign completion");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } catch (RetriesExhaustedException e) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      // expected exception<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      LOG.info("REGION STATE " + am.getRegionStates().getRegionNode(hri));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      LOG.info("expected exception from assign operation: " + e.getMessage(), e);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>  private void testAssign(final MockRSExecutor executor) throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    testAssign(executor, NREGIONS);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    rsDispatcher.setMockRsExecutor(executor);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    AssignProcedure[] assignments = new AssignProcedure[nregions];<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long st = System.currentTimeMillis();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    bulkSubmit(assignments);<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (int i = 0; i &lt; assignments.length; ++i) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      ProcedureTestingUtility.waitProcedure(<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        master.getMasterProcedureExecutor(), assignments[i]);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      assertTrue(assignments[i].toString(), assignments[i].isSuccess());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    long et = System.currentTimeMillis();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    float sec = ((et - st) / 1000.0f);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)",<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAssignAnAssignedRegion() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion");<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>    // collect AM metrics before test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    collectAssignmentManagerMetrics();<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // wait first assign<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    waitOnFuture(futureA);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // Second should be a noop. We should recognize region is already OPEN internally<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    // and skip out doing nothing.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // wait second assign<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    final Future&lt;byte[]&gt; futureB = submitProcedure(am.createAssignProcedure(hri, false));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    waitOnFuture(futureB);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    am.getRegionStates().isRegionInState(hri, State.OPEN);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // TODO: What else can we do to ensure just a noop.<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // TODO: Though second assign is noop, it's considered success, can noop be handled in a<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // better way?<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void testUnassignAnUnassignedRegion() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final HRegionInfo hri = createRegionInfo(tableName, 1);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // collect AM metrics before test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    collectAssignmentManagerMetrics();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    rsDispatcher.setMockRsExecutor(new GoodRsExecutor());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    // assign the region first<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    waitOnFuture(submitProcedure(am.createAssignProcedure(hri, false)));<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    final Future&lt;byte[]&gt; futureA = submitProcedure(am.createUnassignProcedure(hri, null, false));<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    // Wait first unassign.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    waitOnFuture(futureA);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Second should be a noop. We should recognize region is already CLOSED internally<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    // and skip out doing nothing.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    final Future&lt;byte[]&gt; futureB =<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        submitProcedure(am.createUnassignProcedure(hri,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            ServerName.valueOf("example.org,1234,1"), false));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    waitOnFuture(futureB);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    // Ensure we are still CLOSED.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    am.getRegionStates().isRegionInState(hri, State.CLOSED);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    // TODO: What else can we do to ensure just a noop.<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TODO: Though second unassign is noop, it's considered success, can noop be handled in a<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // better way?<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount());<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>  private Future&lt;byte[]&gt; submitProcedure(final Procedure proc) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private byte[] waitOnFuture(final Future&lt;byte[]&gt; future) throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      return future.get(5, TimeUnit.SECONDS);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } catch (ExecutionException e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      LOG.info("ExecutionException", e);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      throw (Exception)e.getCause();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  // ============================================================================================<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  //  Helpers<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  // ============================================================================================<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private void bulkSubmit(final AssignProcedure[] procs) throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    final Thread[] threads = new Thread[PROC_NTHREADS];<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      final int threadId = i;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      threads[i] = new Thread() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        public void run() {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          TableName tableName = TableName.valueOf("table-" + threadId);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          int n = (procs.length / threads.length);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          int start = threadId * n;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>          int stop = start + n;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          for (int j = start; j &lt; stop; ++j) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>            procs[j] = createAndSubmitAssign(tableName, j);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      };<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      threads[i].start();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    for (int i = 0; i &lt; threads.length; ++i) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      threads[i].join();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    for (int i = procs.length - 1; i &gt;= 0 &amp;&amp; procs[i] == null; --i) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    AssignProcedure proc = am.createAssignProcedure(hri, false);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return proc;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  private UnassignProcedure createAndSubmitUnassign(TableName tableName, int regionId) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    HRegionInfo hri = createRegionInfo(tableName, regionId);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    UnassignProcedure proc = am.createUnassignProcedure(hri, null, false);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    master.getMasterProcedureExecutor().submitProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return proc;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  private HRegionInfo createRegionInfo(final TableName tableName, final long regionId) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    return new HRegionInfo(tableName,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Bytes.toBytes(regionId), Bytes.toBytes(regionId + 1), false, 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendTransitionReport(final ServerName serverName,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      final RegionInfo regionInfo, final TransitionCode state) throws IOException {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    ReportRegionStateTransitionRequest.Builder req =<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      ReportRegionStateTransitionRequest.newBuilder();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    req.setServer(ProtobufUtil.toServerName(serverName));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    req.addTransition(RegionStateTransition.newBuilder()<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      .addRegionInfo(regionInfo)<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      .setTransitionCode(state)<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      .setOpenSeqNum(1)<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      .build());<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    am.reportRegionStateTransition(req.build());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  private void doCrash(final ServerName serverName) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    this.am.submitServerCrash(serverName, false/*No WALs here*/);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>  private class NoopRsExecutor implements MockRSExecutor {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    public ExecuteProceduresResponse sendRequest(ServerName server,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        ExecuteProceduresRequest request) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      ExecuteProceduresResponse.Builder builder = ExecuteProceduresResponse.newBuilder();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (request.getOpenRegionCount() &gt; 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        for (OpenRegionRequest req: request.getOpenRegionList()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          OpenRegionResponse.Builder resp = OpenRegionResponse.newBuilder();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          for (RegionOpenInfo openReq: req.getOpenInfoList()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            RegionOpeningState state = execOpenRegion(server, openReq);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>            if (state != null) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>              resp.addOpeningState(state);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          builder.addOpenRegion(resp.build());<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>      if (request.getCloseRegionCount() &gt; 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (CloseRegionRequest req: request.getCloseRegionList()) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          CloseRegionResponse resp = execCloseRegion(server,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              req.getRegion().getValue().toByteArray());<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          if (resp != null) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            builder.addCloseRegion(resp);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 1c907b5..2012b9e 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -201,11 +201,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/LockInfo.ResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockInfo.ResourceType</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/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/LockInfo.LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockInfo.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/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockInfo.ResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockInfo.ResourceType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 4d7bfee..9395d4d 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -202,12 +202,12 @@
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/QuotaSnapshotStore.ViolationState.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaSnapshotStore.ViolationState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 9f4d04d..e2479af 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -692,20 +692,20 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/MemStoreCompactor.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactor.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">StoreScanner.StoreScannerCompactionRace</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">RegionOpeningState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">StoreScanner.StoreScannerCompactionRace</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/MemStoreCompactor.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactor.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">RegionOpeningState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 93bb80a..082943d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -132,9 +132,9 @@
 <li type="circle">java.lang.<a href="http://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="http://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="http://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.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteCompare</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 1185ae8..2680226 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -214,8 +214,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/c0fcd7f3/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index dc2f127..91776e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 1a1b294..d5d4962 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -136,9 +136,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 09974e8..689bda0 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="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 cd08056..59ab0ce 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 d8c46f3..8ac81d5 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -522,14 +522,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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.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>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/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 61d7005..9d74ec7 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 = "043ec9b37e43328e8784f88e3d6867b007a31d1d";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "173dce73471da005fb6780a7e7b65b43bad481e2";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri Aug 11 14:40:23 UTC 2017";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Aug 12 14:41:08 UTC 2017";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://asf920.gq1.ygridcore.net/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "ea21724ef60501efdfac991680f85c00";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "0b5fe4e50617b899e986f38527f3404c";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Append.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Append.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Append.html
index ed040f4..b68c723 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Append.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Append.html
@@ -145,10 +145,10 @@
 <span class="sourceLineNo">137</span>    List&lt;Cell&gt; list = this.familyMap.get(family);<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    if (list == null) {<a name="line.138"></a>
 <span class="sourceLineNo">139</span>      list  = new ArrayList&lt;&gt;(1);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // find where the new entry should be placed in the List<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    list.add(cell);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    this.familyMap.put(family, list);<a name="line.143"></a>
+<span class="sourceLineNo">140</span>      this.familyMap.put(family, list);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    // find where the new entry should be placed in the List<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    list.add(cell);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>    return this;<a name="line.144"></a>
 <span class="sourceLineNo">145</span>  }<a name="line.145"></a>
 <span class="sourceLineNo">146</span><a name="line.146"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Delete.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
index d18ceec..8004358 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Delete.html
@@ -191,9 +191,9 @@
 <span class="sourceLineNo">183</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.183"></a>
 <span class="sourceLineNo">184</span>    if (list == null) {<a name="line.184"></a>
 <span class="sourceLineNo">185</span>      list = new ArrayList&lt;&gt;(1);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    list.add(kv);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    familyMap.put(family, list);<a name="line.188"></a>
+<span class="sourceLineNo">186</span>      familyMap.put(family, list);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    list.add(kv);<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    return this;<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>
@@ -227,12 +227,12 @@
 <span class="sourceLineNo">219</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.219"></a>
 <span class="sourceLineNo">220</span>    if(list == null) {<a name="line.220"></a>
 <span class="sourceLineNo">221</span>      list = new ArrayList&lt;&gt;(1);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    } else if(!list.isEmpty()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      list.clear();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    KeyValue kv = new KeyValue(row, family, null, timestamp, KeyValue.Type.DeleteFamily);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    list.add(kv);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    familyMap.put(family, list);<a name="line.227"></a>
+<span class="sourceLineNo">222</span>      familyMap.put(family, list);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } else if(!list.isEmpty()) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      list.clear();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    KeyValue kv = new KeyValue(row, family, null, timestamp, KeyValue.Type.DeleteFamily);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    list.add(kv);<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    return this;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
@@ -247,10 +247,10 @@
 <span class="sourceLineNo">239</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    if(list == null) {<a name="line.240"></a>
 <span class="sourceLineNo">241</span>      list = new ArrayList&lt;&gt;(1);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    list.add(new KeyValue(row, family, null, timestamp,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          KeyValue.Type.DeleteFamilyVersion));<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    familyMap.put(family, list);<a name="line.245"></a>
+<span class="sourceLineNo">242</span>      familyMap.put(family, list);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    list.add(new KeyValue(row, family, null, timestamp,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          KeyValue.Type.DeleteFamilyVersion));<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    return this;<a name="line.246"></a>
 <span class="sourceLineNo">247</span>  }<a name="line.247"></a>
 <span class="sourceLineNo">248</span><a name="line.248"></a>
@@ -280,10 +280,10 @@
 <span class="sourceLineNo">272</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.272"></a>
 <span class="sourceLineNo">273</span>    if (list == null) {<a name="line.273"></a>
 <span class="sourceLineNo">274</span>      list = new ArrayList&lt;&gt;(1);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    list.add(new KeyValue(this.row, family, qualifier, timestamp,<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        KeyValue.Type.DeleteColumn));<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    familyMap.put(family, list);<a name="line.278"></a>
+<span class="sourceLineNo">275</span>      familyMap.put(family, list);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    list.add(new KeyValue(this.row, family, qualifier, timestamp,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        KeyValue.Type.DeleteColumn));<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>
@@ -315,10 +315,10 @@
 <span class="sourceLineNo">307</span>    List&lt;Cell&gt; list = familyMap.get(family);<a name="line.307"></a>
 <span class="sourceLineNo">308</span>    if(list == null) {<a name="line.308"></a>
 <span class="sourceLineNo">309</span>      list = new ArrayList&lt;&gt;(1);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    KeyValue kv = new KeyValue(this.row, family, qualifier, timestamp, KeyValue.Type.Delete);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    list.add(kv);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    familyMap.put(family, list);<a name="line.313"></a>
+<span class="sourceLineNo">310</span>      familyMap.put(family, list);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    KeyValue kv = new KeyValue(this.row, family, qualifier, timestamp, KeyValue.Type.Delete);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    list.add(kv);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span><a name="line.316"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Get.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Get.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Get.html
index 48420d2..5f2f9af 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Get.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Get.html
@@ -213,12 +213,12 @@
 <span class="sourceLineNo">205</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    if(set == null) {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (qualifier == null) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    set.add(qualifier);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    familyMap.put(family, set);<a name="line.213"></a>
+<span class="sourceLineNo">208</span>      familyMap.put(family, set);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    if (qualifier == null) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    set.add(qualifier);<a name="line.213"></a>
 <span class="sourceLineNo">214</span>    return this;<a name="line.214"></a>
 <span class="sourceLineNo">215</span>  }<a name="line.215"></a>
 <span class="sourceLineNo">216</span><a name="line.216"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c0fcd7f3/devapidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Increment.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
index a49bc05..0dbe2fb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Increment.html
@@ -110,242 +110,240 @@
 <span class="sourceLineNo">102</span>        " doesn't match the original one " +  Bytes.toStringBinary(this.row));<a name="line.102"></a>
 <span class="sourceLineNo">103</span>    }<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    list.add(cell);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    familyMap.put(family, list);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    return this;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /**<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * Increment the column from the specific family with the specified qualifier<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * by the specified amount.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * &lt;p&gt;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * Overrides previous calls to addColumn for this family and qualifier.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @param family family name<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param qualifier column qualifier<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * @param amount amount to increment by<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @return the Increment object<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public Increment addColumn(byte [] family, byte [] qualifier, long amount) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (family == null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      throw new IllegalArgumentException("family cannot be null");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    list.add(kv);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    familyMap.put(CellUtil.cloneFamily(kv), list);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return this;<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>   * Gets the TimeRange used for this increment.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @return TimeRange<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  public TimeRange getTimeRange() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    return this.tr;<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>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * Sets the TimeRange to be used on the Get for this increment.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * &lt;p&gt;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * This is useful for when you have counters that only last for specific<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * periods of time (ie. counters that are partitioned by time).  By setting<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * the range of valid times for this increment, you can potentially gain<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * some performance with a more optimal Get operation.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * &lt;p&gt;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * This range is used as [minStamp, maxStamp).<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @throws IOException if invalid time range<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @return this<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   */<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public Increment setTimeRange(long minStamp, long maxStamp)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  throws IOException {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  <a name="line.157"></a>
-<span class="sourceLineNo">158</span>  /**<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param returnResults True (default) if the increment operation should return the results. A<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   *          client that is not interested in the result can save network bandwidth setting this<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   *          to false.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public Increment setReturnResults(boolean returnResults) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    super.setReturnResults(returnResults);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    return this;<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>   * @return current setting for returnResults<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  // This method makes public the superclasses's protected method.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public boolean isReturnResults() {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    return super.isReturnResults();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * Method for retrieving the number of families to increment from<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @return number of families<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public int numFamilies() {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    return this.familyMap.size();<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>   * Method for checking if any families have been inserted into this Increment<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return true if familyMap is non empty false otherwise<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public boolean hasFamilies() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return !this.familyMap.isEmpty();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  /**<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * Before 0.95, when you called Increment#getFamilyMap(), you got back<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * a map of families to a list of Longs.  Now, {@link #getFamilyCellMap()} returns<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * families by list of Cells.  This method has been added so you can have the<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * old behavior.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @return Map of families to a Map of qualifiers and their Long increments.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @since 0.95.0<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public Map&lt;byte[], NavigableMap&lt;byte [], Long&gt;&gt; getFamilyMapOfLongs() {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map = super.getFamilyCellMap();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    Map&lt;byte [], NavigableMap&lt;byte[], Long&gt;&gt; results = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: map.entrySet()) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      NavigableMap&lt;byte [], Long&gt; longs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      for (Cell cell: entry.getValue()) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        longs.put(CellUtil.cloneQualifier(cell),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      results.put(entry.getKey(), longs);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return results;<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>   * @return String<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  @Override<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public String toString() {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    StringBuilder sb = new StringBuilder();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    sb.append("row=");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    sb.append(Bytes.toStringBinary(this.row));<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    if(this.familyMap.isEmpty()) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      sb.append(", no columns set to be incremented");<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      return sb.toString();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    sb.append(", families=");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    boolean moreThanOne = false;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: this.familyMap.entrySet()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      if(moreThanOne) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        sb.append("), ");<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        moreThanOne = true;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        sb.append("{");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      sb.append("(family=");<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      sb.append(Bytes.toString(entry.getKey()));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      sb.append(", columns=");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      if(entry.getValue() == null) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        sb.append("NONE");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      } else {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        sb.append("{");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        boolean moreThanOneB = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        for(Cell cell : entry.getValue()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          if(moreThanOneB) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>            sb.append(", ");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          } else {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            moreThanOneB = true;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          sb.append(CellUtil.getCellKeyAsString(cell) + "+=" +<a name="line.250"></a>
-<span class="sourceLineNo">251</span>              Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        sb.append("}");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    sb.append("}");<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return sb.toString();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public int compareTo(Row i) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return Bytes.compareTo(this.getRow(), i.getRow());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  @Override<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public int hashCode() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // TODO: This is wrong.  Can't have two gets the same just because on same row.  But it<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // matches how equals works currently and gets rid of the findbugs warning.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return Bytes.hashCode(this.getRow());<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>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public boolean equals(Object obj) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (this == obj) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      return true;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      return false;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    Row other = (Row) obj;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return compareTo(other) == 0;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  protected long extraHeapSize(){<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    return HEAP_OVERHEAD;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public Increment setAttribute(String name, byte[] value) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    return (Increment) super.setAttribute(name, value);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Override<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public Increment setId(String id) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    return (Increment) super.setId(id);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  @Override<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public Increment setDurability(Durability d) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return (Increment) super.setDurability(d);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  @Override<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public Increment setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return (Increment) super.setFamilyCellMap(map);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public Increment setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    return (Increment) super.setClusterIds(clusterIds);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public Increment setCellVisibility(CellVisibility expression) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    return (Increment) super.setCellVisibility(expression);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public Increment setACL(String user, Permission perms) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    return (Increment) super.setACL(user, perms);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>  @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  public Increment setACL(Map&lt;String, Permission&gt; perms) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    return (Increment) super.setACL(perms);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  @Override<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public Increment setTTL(long ttl) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    return (Increment) super.setTTL(ttl);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  @Override<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public Increment setPriority(int priority) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    return (Increment) super.setPriority(priority);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>}<a name="line.340"></a>
+<span class="sourceLineNo">105</span>    return this;<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>  /**<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * Increment the column from the specific family with the specified qualifier<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * by the specified amount.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * &lt;p&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Overrides previous calls to addColumn for this family and qualifier.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param family family name<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @param qualifier column qualifier<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @param amount amount to increment by<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return the Increment object<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public Increment addColumn(byte [] family, byte [] qualifier, long amount) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (family == null) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      throw new IllegalArgumentException("family cannot be null");<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    List&lt;Cell&gt; list = getCellList(family);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    list.add(kv);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return this;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * Gets the TimeRange used for this increment.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @return TimeRange<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public TimeRange getTimeRange() {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return this.tr;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Sets the TimeRange to be used on the Get for this increment.<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * &lt;p&gt;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * This is useful for when you have counters that only last for specific<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * periods of time (ie. counters that are partitioned by time).  By setting<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * the range of valid times for this increment, you can potentially gain<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * some performance with a more optimal Get operation.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * &lt;p&gt;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * This range is used as [minStamp, maxStamp).<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @throws IOException if invalid time range<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * @return this<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public Increment setTimeRange(long minStamp, long maxStamp)<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  throws IOException {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    return this;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  <a name="line.155"></a>
+<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param returnResults True (default) if the increment operation should return the results. A<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   *          client that is not interested in the result can save network bandwidth setting this<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   *          to false.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public Increment setReturnResults(boolean returnResults) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    super.setReturnResults(returnResults);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return this;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @return current setting for returnResults<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  // This method makes public the superclasses's protected method.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public boolean isReturnResults() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return super.isReturnResults();<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>  /**<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * Method for retrieving the number of families to increment from<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @return number of families<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public int numFamilies() {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return this.familyMap.size();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * Method for checking if any families have been inserted into this Increment<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @return true if familyMap is non empty false otherwise<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public boolean hasFamilies() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    return !this.familyMap.isEmpty();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  /**<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * Before 0.95, when you called Increment#getFamilyMap(), you got back<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * a map of families to a list of Longs.  Now, {@link #getFamilyCellMap()} returns<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * families by list of Cells.  This method has been added so you can have the<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * old behavior.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @return Map of families to a Map of qualifiers and their Long increments.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @since 0.95.0<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  public Map&lt;byte[], NavigableMap&lt;byte [], Long&gt;&gt; getFamilyMapOfLongs() {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map = super.getFamilyCellMap();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Map&lt;byte [], NavigableMap&lt;byte[], Long&gt;&gt; results = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: map.entrySet()) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      NavigableMap&lt;byte [], Long&gt; longs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      for (Cell cell: entry.getValue()) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        longs.put(CellUtil.cloneQualifier(cell),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>            Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      results.put(entry.getKey(), longs);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return results;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @return String<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public String toString() {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    StringBuilder sb = new StringBuilder();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    sb.append("row=");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    sb.append(Bytes.toStringBinary(this.row));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if(this.familyMap.isEmpty()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      sb.append(", no columns set to be incremented");<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return sb.toString();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    sb.append(", families=");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    boolean moreThanOne = false;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    for(Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: this.familyMap.entrySet()) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if(moreThanOne) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        sb.append("), ");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        moreThanOne = true;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        sb.append("{");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      sb.append("(family=");<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      sb.append(Bytes.toString(entry.getKey()));<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      sb.append(", columns=");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      if(entry.getValue() == null) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        sb.append("NONE");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } else {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        sb.append("{");<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        boolean moreThanOneB = false;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        for(Cell cell : entry.getValue()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          if(moreThanOneB) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            sb.append(", ");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          } else {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            moreThanOneB = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          sb.append(CellUtil.getCellKeyAsString(cell) + "+=" +<a name="line.248"></a>
+<span class="sourceLineNo">249</span>              Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        sb.append("}");<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>    sb.append("}");<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return sb.toString();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  public int compareTo(Row i) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    return Bytes.compareTo(this.getRow(), i.getRow());<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public int hashCode() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // TODO: This is wrong.  Can't have two gets the same just because on same row.  But it<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // matches how equals works currently and gets rid of the findbugs warning.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return Bytes.hashCode(this.getRow());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public boolean equals(Object obj) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // TODO: This is wrong.  Can't have two the same just because on same row.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (this == obj) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return true;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      return false;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Row other = (Row) obj;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    return compareTo(other) == 0;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @Override<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  protected long extraHeapSize(){<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    return HEAP_OVERHEAD;<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>  @Override<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public Increment setAttribute(String name, byte[] value) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return (Increment) super.setAttribute(name, value);<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>  public Increment setId(String id) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return (Increment) super.setId(id);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Increment setDurability(Durability d) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return (Increment) super.setDurability(d);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Increment setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; map) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return (Increment) super.setFamilyCellMap(map);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public Increment setClusterIds(List&lt;UUID&gt; clusterIds) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return (Increment) super.setClusterIds(clusterIds);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  @Override<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  public Increment setCellVisibility(CellVisibility expression) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return (Increment) super.setCellVisibility(expression);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>  @Override<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  public Increment setACL(String user, Permission perms) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return (Increment) super.setACL(user, perms);<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public Increment setACL(Map&lt;String, Permission&gt; perms) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    return (Increment) super.setACL(perms);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public Increment setTTL(long ttl) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return (Increment) super.setTTL(ttl);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public Increment setPriority(int priority) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return (Increment) super.setPriority(priority);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>}<a name="line.338"></a>