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 2025/10/09 14:52:05 UTC

(hbase-site) branch asf-site updated: Published site at d8b1912361218ce9de3c3f7d4c5194c23519fa69.

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 845ca279311 Published site at d8b1912361218ce9de3c3f7d4c5194c23519fa69.
845ca279311 is described below

commit 845ca279311adbf4f8aef386d35f770b4c9cd15c
Author: jenkins <bu...@apache.org>
AuthorDate: Thu Oct 9 14:50:57 2025 +0000

    Published site at d8b1912361218ce9de3c3f7d4c5194c23519fa69.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 apidocs/index-all.html                             |   14 +
 apidocs/member-search-index.js                     |    2 +-
 .../hadoop/hbase/client/class-use/RegionInfo.html  |  104 +-
 .../coprocessor/class-use/ObserverContext.html     |  918 +-
 .../class-use/RegionCoprocessorEnvironment.html    |  298 +-
 .../apache/hadoop/hbase/wal/class-use/WALEdit.html |   98 +-
 .../apache/hadoop/hbase/wal/class-use/WALKey.html  |   40 +-
 .../coprocessor/RegionObserver.MutationType.html   |  386 +-
 .../hadoop/hbase/coprocessor/RegionObserver.html   |  386 +-
 .../regionserver/HRegion.BulkLoadListener.html     | 6349 ++++++-------
 .../regionserver/HRegion.FlushResult.Result.html   | 6349 ++++++-------
 .../hbase/regionserver/HRegion.FlushResult.html    | 6349 ++++++-------
 .../regionserver/HRegion.FlushResultImpl.html      | 6349 ++++++-------
 .../regionserver/HRegion.PrepareFlushResult.html   | 6349 ++++++-------
 .../hbase/regionserver/HRegion.RowLockImpl.html    | 6349 ++++++-------
 .../apache/hadoop/hbase/regionserver/HRegion.html  | 6349 ++++++-------
 .../hadoop/hbase/regionserver/RSRpcServices.html   | 3848 ++++----
 .../hbase/regionserver/RegionCoprocessorHost.html  |  441 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   30 +-
 checkstyle.rss                                     |   16 +-
 coc.html                                           |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/index-all.html                          |   14 +
 devapidocs/member-search-index.js                  |    2 +-
 .../apache/hadoop/hbase/backup/BackupObserver.html |    2 +-
 .../hadoop/hbase/client/class-use/RegionInfo.html  |  104 +-
 .../hbase/constraint/ConstraintProcessor.html      |    2 +-
 ...MetaTableMetrics.ExampleRegionObserverMeta.html |    2 +-
 .../hadoop/hbase/coprocessor/RegionObserver.html   |  336 +-
 .../coprocessor/class-use/ObserverContext.html     |  936 +-
 .../class-use/RegionCoprocessorEnvironment.html    |  316 +-
 ...nObserverWithMetrics.ExampleRegionObserver.html |    2 +-
 .../coprocessor/example/ScanModifyingObserver.html |    2 +-
 .../example/ValueRewritingObserver.html            |    2 +-
 .../example/WriteHeavyIncrementObserver.html       |    2 +-
 .../example/ZooKeeperScanPolicyObserver.html       |    2 +-
 .../row/stats/RowStatisticsCompactionObserver.html |    2 +-
 .../regionserver/HRegion.BulkLoadListener.html     |    8 +-
 .../hbase/regionserver/HRegion.RowLockContext.html |   28 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html    |   16 +-
 .../apache/hadoop/hbase/regionserver/HRegion.html  |  278 +-
 .../hadoop/hbase/regionserver/RSRpcServices.html   |  102 +-
 .../hbase/regionserver/RegionCoprocessorHost.html  |  273 +-
 .../regionserver/ReplicationObserver.html          |    2 +-
 .../hbase/security/access/AccessController.html    |    2 +-
 .../security/visibility/VisibilityController.html  |    2 +-
 .../hadoop/hbase/tool/WriteSinkCoprocessor.html    |    2 +-
 .../apache/hadoop/hbase/wal/class-use/WALEdit.html |  110 +-
 .../apache/hadoop/hbase/wal/class-use/WALKey.html  |   40 +-
 .../coprocessor/RegionObserver.MutationType.html   |  386 +-
 .../hadoop/hbase/coprocessor/RegionObserver.html   |  386 +-
 .../HRegion.BatchOperation.Visitor.html            | 6349 ++++++-------
 .../hbase/regionserver/HRegion.BatchOperation.html | 6349 ++++++-------
 .../regionserver/HRegion.BulkLoadListener.html     | 6349 ++++++-------
 .../regionserver/HRegion.FlushResult.Result.html   | 6349 ++++++-------
 .../hbase/regionserver/HRegion.FlushResult.html    | 6349 ++++++-------
 .../regionserver/HRegion.FlushResultImpl.html      | 6349 ++++++-------
 .../HRegion.MutationBatchOperation.html            | 6349 ++++++-------
 .../HRegion.ObservedExceptionsInBatch.html         | 6349 ++++++-------
 .../regionserver/HRegion.PrepareFlushResult.html   | 6349 ++++++-------
 .../regionserver/HRegion.ReplayBatchOperation.html | 6349 ++++++-------
 .../hbase/regionserver/HRegion.RowLockContext.html | 6349 ++++++-------
 .../hbase/regionserver/HRegion.RowLockImpl.html    | 6349 ++++++-------
 .../hbase/regionserver/HRegion.WriteState.html     | 6349 ++++++-------
 .../apache/hadoop/hbase/regionserver/HRegion.html  | 6349 ++++++-------
 .../RSRpcServices.RegionScannerCloseCallBack.html  | 3848 ++++----
 .../RSRpcServices.RegionScannerContext.html        | 3848 ++++----
 .../RSRpcServices.RegionScannerHolder.html         | 3848 ++++----
 ...RSRpcServices.RegionScannerShippedCallBack.html | 3848 ++++----
 .../RSRpcServices.RegionScannersCloseCallBack.html | 3848 ++++----
 .../RSRpcServices.ScannerListener.html             | 3848 ++++----
 .../hadoop/hbase/regionserver/RSRpcServices.html   | 3848 ++++----
 ...nCoprocessorHost.BulkLoadObserverOperation.html |  441 +-
 .../RegionCoprocessorHost.RegionEnvironment.html   |  441 +-
 ...rHost.RegionEnvironmentForCoreCoprocessors.html |  441 +-
 ...rHost.RegionObserverOperationWithoutResult.html |  441 +-
 ...nCoprocessorHost.TableCoprocessorAttribute.html |  441 +-
 .../hbase/regionserver/RegionCoprocessorHost.html  |  441 +-
 documentation-1.4.html                             |    2 +-
 documentation-2.3.html                             |    2 +-
 documentation-2.4.html                             |    2 +-
 documentation-2.5.html                             |    2 +-
 documentation-2.6.html                             |    2 +-
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 scm.html                                           |    2 +-
 sponsors.html                                      |    2 +-
 summary.html                                       |    2 +-
 supportingprojects.html                            |    2 +-
 team.html                                          |    2 +-
 testapidocs/allclasses-index.html                  | 6336 ++++++-------
 testapidocs/index-all.html                         |   36 +
 testapidocs/member-search-index.js                 |    2 +-
 .../hbase/class-use/JUnitResourceCheckers.html     |   10 +-
 .../hadoop/hbase/class-use/ResourceChecker.html    |    9 +-
 .../org/apache/hadoop/hbase/package-summary.html   |  436 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    3 +-
 testapidocs/overview-tree.html                     |    3 +-
 .../apache/hadoop/hbase/HBaseJupiterExtension.html |  383 +-
 .../apache/hadoop/hbase/JUnitResourceCheckers.html |  219 +
 .../hadoop/hbase/ResourceCheckerJUnitListener.html |  226 +-
 .../coprocessor/SampleRegionWALCoprocessor.html    |  276 +-
 .../hbase/coprocessor/SimpleRegionObserver.html    | 1574 ++--
 ...tRegionObserverInterface.EvenOnlyCompactor.html |  379 +-
 .../coprocessor/TestRegionObserverInterface.html   |  379 +-
 .../hadoop/hbase/coprocessor/TestWALObserver.html  |  230 +-
 testapidocs/type-search-index.js                   |    2 +-
 testdevapidocs/allclasses-index.html               | 9440 ++++++++++----------
 testdevapidocs/constant-values.html                |    3 +
 testdevapidocs/index-all.html                      |  122 +-
 testdevapidocs/member-search-index.js              |    2 +-
 .../apache/hadoop/hbase/HBaseJupiterExtension.html |  121 +-
 ...heckers.AvailableMemoryMBResourceAnalyzer.html} |   24 +-
 ...heckers.MaxFileDescriptorResourceAnalyzer.html} |   24 +-
 ...eckers.OpenFileDescriptorResourceAnalyzer.html} |   26 +-
 ...urceCheckers.ProcessCountResourceAnalyzer.html} |   24 +-
 ...heckers.SystemLoadAverageResourceAnalyzer.html} |   24 +-
 ...itResourceCheckers.ThreadResourceAnalyzer.html} |   36 +-
 ...rceAnalyzer.html => JUnitResourceCheckers.html} |   92 +-
 .../hbase/ResourceChecker.ResourceAnalyzer.html    |    2 +-
 .../hadoop/hbase/ResourceCheckerJUnitListener.html |   44 +-
 .../TestJMXConnectorServer.MyAccessController.html |    2 +-
 ...heckers.AvailableMemoryMBResourceAnalyzer.html} |   10 +-
 ...heckers.MaxFileDescriptorResourceAnalyzer.html} |   10 +-
 ...eckers.OpenFileDescriptorResourceAnalyzer.html} |   10 +-
 ...urceCheckers.ProcessCountResourceAnalyzer.html} |   10 +-
 ...heckers.SystemLoadAverageResourceAnalyzer.html} |   10 +-
 ...itResourceCheckers.ThreadResourceAnalyzer.html} |   10 +-
 ...rceAnalyzer.html => JUnitResourceCheckers.html} |   10 +-
 .../hbase/class-use/ResourceChecker.Phase.html     |   26 +-
 .../ResourceChecker.ResourceAnalyzer.html          |   24 +-
 .../hadoop/hbase/class-use/ResourceChecker.html    |   11 +-
 ...istener.OpenFileDescriptorResourceAnalyzer.html |   62 -
 ...Listener.SystemLoadAverageResourceAnalyzer.html |   62 -
 ...ncTableRegionReplicasRead.FailPrimaryGetCP.html |    2 +-
 ...bstractTestCITimeout.SleepAndFailFirstTime.html |    2 +-
 .../AbstractTestCITimeout.SleepCoprocessor.html    |    2 +-
 ...3TestBase.WaitingForMultiMutationsObserver.html |    2 +-
 ...ClientSide3TestBase.WaitingForScanObserver.html |    2 +-
 .../hadoop/hbase/client/SleepAtFirstRpcCall.html   |    2 +-
 ...atorConcurrenyLimit.CountingRegionObserver.html |    2 +-
 ...TestAsyncRegionLocator.SleepRegionObserver.html |    2 +-
 .../TestAsyncTableBatch.ErrorInjectObserver.html   |    2 +-
 .../TestAsyncTableNoncedRetry.SleepOnceCP.html     |    2 +-
 .../TestAsyncTableScanException.ErrorCP.html       |    2 +-
 ...TableUseMetaReplicas.FailPrimaryMetaScanCp.html |    2 +-
 ...sIntoShippedBlocks.CompactorRegionObserver.html |    2 +-
 ...ictionFromClient.CustomInnerRegionObserver.html |    2 +-
 ...romClient.CustomInnerRegionObserverWrapper.html |    2 +-
 ...stClientOperationInterrupt.TestCoprocessor.html |    2 +-
 ...ConnectionAttributes.AttributesCoprocessor.html |    2 +-
 ...meoutRequest.SleepLongerAtFirstCoprocessor.html |    2 +-
 ...loneLinksAfterDelete.DelayFlushCoprocessor.html |    2 +-
 ...rverHostingPrimayMetaRegionSlowOrStopCopro.html |    2 +-
 ...eplicaWithCluster.RegionServerStoppedCopro.html |    2 +-
 .../client/TestReplicaWithCluster.SlowMeCopro.html |    2 +-
 .../client/TestReplicasClient.SlowMeCopro.html     |    2 +-
 ...estRequestAttributes.AttributesCoprocessor.html |    2 +-
 .../TestResultFromCoprocessor.MyObserver.html      |    2 +-
 .../TestServerBusyException.SleepCoprocessor.html  |    2 +-
 ...usyException.SleepLongerAtFirstCoprocessor.html |    2 +-
 ...tion.ThrowDoNotRetryIOExceptionCoprocessor.html |    2 +-
 ...ationException.ThrowIOExceptionCoprocessor.html |    2 +-
 .../coprocessor/SampleRegionWALCoprocessor.html    |  150 +-
 .../hbase/coprocessor/SimpleRegionObserver.html    |  690 +-
 .../TestAppendTimeRange.MyObserver.html            |    2 +-
 ...TestCoprocessorHost.SimpleRegionObserverV2.html |    4 +-
 ...TestCoprocessorHost.SimpleRegionObserverV3.html |    4 +-
 .../TestCoprocessorInterface.CoprocessorImpl.html  |    2 +-
 ...estCoprocessorMetrics.CustomRegionObserver.html |    2 +-
 ...stCoprocessorMetrics.CustomRegionObserver2.html |    2 +-
 ...ncrementAndAppendWithNullResult.MyObserver.html |    2 +-
 .../TestIncrementTimeRange.MyObserver.html         |    4 +-
 ...WithSlowCoprocessor.FlushingRegionObserver.html |    4 +-
 ...eInCoprocessor.CustomThreadPoolCoprocessor.html |    2 +-
 ...eInCoprocessor.SendToOtherTableCoprocessor.html |    2 +-
 ...pendBeforeWAL.ChangeCellWithACLTagObserver.html |    2 +-
 ...ChangeCellWithDifferntColumnFamilyObserver.html |    2 +-
 ...ChangeCellWithNotExistColumnFamilyObserver.html |    2 +-
 ...stRegionCoprocessorHost.TempRegionObserver.html |    2 +-
 ...gionCoprocessorQuotaUsage.MyRegionObserver.html |    2 +-
 .../TestRegionObserverBypass.TestCoprocessor.html  |    2 +-
 .../TestRegionObserverBypass.TestCoprocessor2.html |    2 +-
 .../TestRegionObserverBypass.TestCoprocessor3.html |    2 +-
 ...FromCoprocessors.TestDeleteCellCoprocessor.html |    2 +-
 ...omCoprocessors.TestDeleteFamilyCoprocessor.html |    2 +-
 ...sFromCoprocessors.TestDeleteRowCoprocessor.html |    2 +-
 ...mCoprocessors.TestMultiMutationCoprocessor.html |    2 +-
 ...FromCoprocessors.TestPutWithTTLCoprocessor.html |    2 +-
 ...tRegionObserverInterface.EvenOnlyCompactor.html |    2 +-
 ...erInterface.PreWALAppendWALActionsListener.html |   10 +-
 .../coprocessor/TestRegionObserverInterface.html   |   38 +-
 ...erPreFlushAndPreCompact.TestRegionObserver.html |    2 +-
 ...ObserverScannerOpenHook.EmptyRegionObsever.html |    2 +-
 ...serverScannerOpenHook.NoDataFromCompaction.html |    2 +-
 ...ionObserverScannerOpenHook.NoDataFromFlush.html |    2 +-
 ...gionObserverScannerOpenHook.NoDataFromScan.html |    2 +-
 .../TestRegionObserverStacking.ObserverA.html      |    2 +-
 .../TestRegionObserverStacking.ObserverB.html      |    2 +-
 .../TestRegionObserverStacking.ObserverC.html      |    2 +-
 ...ssorExceptionWithAbort.BuggyRegionObserver.html |    4 +-
 ...sorExceptionWithRemove.BuggyRegionObserver.html |    4 +-
 .../hadoop/hbase/coprocessor/TestWALObserver.html  |   20 +-
 ...er.TestableRowStatisticsCompactionObserver.html |    2 +-
 ...tionTestBulkLoad.SlowMeCoproScanOperations.html |    2 +-
 .../TestImportExport.MetadataController.html       |    2 +-
 ...tributes.OperationAttributesTestController.html |    2 +-
 .../TestImportTSVWithTTLs.TTLCheckingObserver.html |    2 +-
 ...TestMasterAbortAndRSGotKilled.DelayCloseCP.html |    2 +-
 ...erCoprocessorServices.MockAccessController.html |    2 +-
 ...processorServices.MockVisibilityController.html |    2 +-
 ...erHandlerFullWhenTransitRegion.DelayOpenCP.html |    2 +-
 ...ionServerHostingReplicaSlowOpenCoprocessor.html |    2 +-
 .../TestExceptionInAssignRegion.ThrowInOpenCP.html |    2 +-
 ...ExceptionInUnassignedRegion.ThrowInCloseCP.html |    2 +-
 .../procedure/TestProcedurePriority.MyCP.html      |    2 +-
 .../TestNamespaceAuditor.CustomObserver.html       |    2 +-
 .../org/apache/hadoop/hbase/package-summary.html   |  594 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   15 +-
 .../hbase/regionserver/NoOpScanPolicyObserver.html |    2 +-
 ...pactionLifeCycleTracker.CompactionObserver.html |    2 +-
 ...WithShippingCoprocessor.CompactionObserver.html |    2 +-
 .../TestFlushLifeCycleTracker.FlushObserver.html   |    2 +-
 .../TestHRegion.NoOpRegionCoprocessor.html         |    2 +-
 .../TestHRegionServerBulkLoad.MyObserver.html      |    2 +-
 ...egionInterrupt.MutationDelayingCoprocessor.html |    2 +-
 ...gionServerAbort.StopBlockingRegionObserver.html |    2 +-
 ...rverAbortTimeout.SleepWhenCloseCoprocessor.html |    2 +-
 ...erReadRequestMetrics.ScanRegionCoprocessor.html |    2 +-
 ...ejectDuringAbort.SleepWhenCloseCoprocessor.html |    2 +-
 ...nnerRetriableFailure.FaultyScannerObserver.html |    2 +-
 ...erWithCorruptHFile.CorruptHFileCoprocessor.html |    2 +-
 ...ingTimeoutOnBlockingPoint.SleepCoprocessor.html |    2 +-
 .../TestTags.TestCoprocessorForTags.html           |    2 +-
 ...licationForWriteException.MyRegionObserver.html |    2 +-
 .../TestMasterReplication.CoprocessorCounter.html  |    2 +-
 ...ationWithTags.TestCoprocessorForTagsAtSink.html |    2 +-
 ...ionWithTags.TestCoprocessorForTagsAtSource.html |    2 +-
 ...utes.TestCoprocessorForWALAnnotationAtSink.html |    2 +-
 ...es.TestCoprocessorForWALAnnotationAtSource.html |    2 +-
 .../TestAccessController2.MyAccessController.html  |    2 +-
 ...stAccessController3.FaultyAccessController.html |    2 +-
 ...WhitelistMasterObserver.TestRegionObserver.html |    2 +-
 .../TestVisibilityLabelsReplication.SimpleCP.html  |    2 +-
 ...lsReplication.TestCoprocessorForTagsAtSink.html |    2 +-
 .../hbase/thrift/ErrorThrowingGetObserver.html     |    2 +-
 ...HBaseServiceHandler.DelayingRegionObserver.html |    2 +-
 .../TestCoprocessorScanPolicy.ScanObserver.html    |    2 +-
 testdevapidocs/overview-tree.html                  |   15 +-
 .../apache/hadoop/hbase/HBaseJupiterExtension.html |  383 +-
 ...Checkers.AvailableMemoryMBResourceAnalyzer.html |  219 +
 ...Checkers.MaxFileDescriptorResourceAnalyzer.html |  219 +
 ...heckers.OpenFileDescriptorResourceAnalyzer.html |  219 +
 ...ourceCheckers.ProcessCountResourceAnalyzer.html |  219 +
 ...Checkers.SystemLoadAverageResourceAnalyzer.html |  219 +
 ...nitResourceCheckers.ThreadResourceAnalyzer.html |  219 +
 .../apache/hadoop/hbase/JUnitResourceCheckers.html |  219 +
 ...Listener.AvailableMemoryMBResourceAnalyzer.html |  265 -
 ...Listener.MaxFileDescriptorResourceAnalyzer.html |  265 -
 ...istener.OpenFileDescriptorResourceAnalyzer.html |  265 -
 ...JUnitListener.ProcessCountResourceAnalyzer.html |  265 -
 ...Listener.SystemLoadAverageResourceAnalyzer.html |  265 -
 ...heckerJUnitListener.ThreadResourceAnalyzer.html |  265 -
 .../hadoop/hbase/ResourceCheckerJUnitListener.html |  226 +-
 .../coprocessor/SampleRegionWALCoprocessor.html    |  276 +-
 .../hbase/coprocessor/SimpleRegionObserver.html    | 1574 ++--
 ...tRegionObserverInterface.EvenOnlyCompactor.html |  379 +-
 ...erInterface.PreWALAppendWALActionsListener.html |  379 +-
 .../coprocessor/TestRegionObserverInterface.html   |  379 +-
 .../hadoop/hbase/coprocessor/TestWALObserver.html  |  230 +-
 testdevapidocs/type-search-index.js                |    2 +-
 291 files changed, 101991 insertions(+), 100385 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index c6ca4db1f22..e9a06172a17 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -714,7 +714,7 @@ ASF
         All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
       </div>
       <div class="mt-3" style="float: right">
-        Last Published: 2025-10-08
+        Last Published: 2025-10-09
       </div>
 
       </div>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 3e55d816c2e..f5ad7b763ae 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 2.0.6, based on Prawn 2.4.0)
 /Producer (Apache HBase Team)
-/ModDate (D:20251008143125+00'00')
-/CreationDate (D:20251008144704+00'00')
+/ModDate (D:20251009143133+00'00')
+/CreationDate (D:20251009144715+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index a40b4f71a7a..77b48894776 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -53736,6 +53736,12 @@ service.</div>
 <dd>
 <div class="block">Called after update rsgroup config.</div>
 </dd>
+<dt>postWALRestore(RegionInfo, WALKey, WALEdit) - Method in class org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost</dt>
+<dd>&nbsp;</dd>
+<dt>postWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt;, RegionInfo, WALKey, WALEdit) - Method in interface org.apache.hadoop.hbase.coprocessor.RegionObserver</dt>
+<dd>
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
+</dd>
 <dt>postWALRoll(Path, Path) - Method in class org.apache.hadoop.hbase.regionserver.wal.WALCoprocessorHost</dt>
 <dd>
 <div class="block">Called after rolling the current WAL</div>
@@ -55107,6 +55113,14 @@ service.</div>
 </dd>
 <dt>preWALAppend(WALKey, WALEdit) - Method in class org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost</dt>
 <dd>&nbsp;</dd>
+<dt>preWALRestore(RegionInfo, WALKey, WALEdit) - Method in class org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost</dt>
+<dd>
+<div class="block">Supports Coprocessor 'bypass'.</div>
+</dd>
+<dt>preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt;, RegionInfo, WALKey, WALEdit) - Method in interface org.apache.hadoop.hbase.coprocessor.RegionObserver</dt>
+<dd>
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
+</dd>
 <dt>preWALRoll(Path, Path) - Method in class org.apache.hadoop.hbase.regionserver.wal.WALCoprocessorHost</dt>
 <dd>
 <div class="block">Called before rolling the current WAL</div>
diff --git a/apidocs/member-search-index.js b/apidocs/member-search-index.js
index 6d333868c3e..2069315814f 100644
--- a/apidocs/member-search-index.js
+++ b/apidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hdfs","c":"DummyDFSOutputStream","l":"abort()"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abo [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hdfs","c":"DummyDFSOutputStream","l":"abort()"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abo [...]
\ No newline at end of file
diff --git a/apidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html b/apidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
index 4adfdcb3f1b..3faaf3aee04 100644
--- a/apidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
+++ b/apidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
@@ -1030,99 +1030,115 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Called after the region unassignment has been requested.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preAssign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called prior to assigning a specific region.</div>
+<div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
- org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regions)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preAssign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before a new table is created by <code>HMaster</code>.</div>
+<div class="block">Called prior to assigning a specific region.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regions)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Called before a new table is created by <code>HMaster</code>.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
+ org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regions)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before merge regions request.</div>
+<div class="block">Called before a new table is created by <code>HMaster</code>.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the regions merge.</div>
+<div class="block">Called before merge regions request.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsCommitAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before the regions merge.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsCommitAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;metaEntries)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">This will be called before update META step as part of regions merge transaction.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMove<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMove<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;region,
  org.apache.hadoop.hbase.ServerName&nbsp;srcServer,
  org.apache.hadoop.hbase.ServerName&nbsp;destServer)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called prior to moving a given region from one region server to another.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRegionOffline<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRegionOffline<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to marking a given region as offline.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before replaying WALs for this region.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRequestLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRequestLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionInfos,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;description)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before new LockProcedure is queued.</div>
 </div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before the truncate region procedure is called.</div>
+</div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the truncate region procedure is called.</div>
+<div class="block">Called before the region is truncated.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUnassign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the region is truncated.</div>
+<div class="block">Called prior to unassigning a given region.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preUnassign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called prior to unassigning a given region.</div>
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>preWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
@@ -2271,9 +2287,21 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
- org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Supports Coprocessor 'bypass'.</div>
+</div>
 <div class="col-first even-row-color"><code>static boolean</code></div>
 <div class="col-second even-row-color"><span class="type-name-label">HRegion.</span><code>rowIsInRange<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  byte[]&nbsp;row)</code></div>
diff --git a/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html b/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
index 55e04f4fd20..20158413d8a 100644
--- a/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
+++ b/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
@@ -1129,109 +1129,117 @@ loadScripts(document, 'script');</script>
 <div class="block">Called after update rsgroup config.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALRoll<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>postWALRoll<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.fs.Path&nbsp;oldPath,
  org.apache.hadoop.fs.Path&nbsp;newPath)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called after rolling the current WAL</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preAbortProcedure<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preAbortProcedure<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  long&nbsp;procId)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a abortProcedure request has been processed.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preAddReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preAddReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId,
  org.apache.hadoop.hbase.replication.ReplicationPeerConfig&nbsp;peerConfig)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before add a replication peer</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preAddRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preAddRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;name)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a new region server group is added</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before Append.</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppendAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppendAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preAssign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preAssign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to assigning a specific region.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RpcObserver.</span><code>preAuthorizeConnection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RpcCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RpcObserver.</span><code>preAuthorizeConnection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RpcCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;connectionHeader,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetAddress.html" title="class or interface in java.net" class="external-link">InetAddress</a>&nbsp;remoteAddr)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before authorizing connection</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalance<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalance<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.BalanceRequest&nbsp;request)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to requesting rebalancing of the cluster regions, though after the initial checks
  for regions in transition and the balance switch flag.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalanceRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalanceRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName,
  org.apache.hadoop.hbase.client.BalanceRequest&nbsp;request)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a region server group is removed</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalanceSwitch<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preBalanceSwitch<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  boolean&nbsp;newValue)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to modifying the flag used to enable/disable region balancing.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">This will be called for every batch mutation operation happening at the server.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preBulkLoadHFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preBulkLoadHFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.util.Pair&lt;byte[],<wbr><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;&gt;&nbsp;familyPaths)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before bulkLoadHFile.</div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -1239,24 +1247,24 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -1264,38 +1272,38 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  <a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a>&nbsp;checkAndMutate,
  org.apache.hadoop.hbase.client.CheckAndMutateResult&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before checkAndMutate</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutateAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutateAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  <a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a>&nbsp;checkAndMutate,
  org.apache.hadoop.hbase.client.CheckAndMutateResult&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before checkAndDelete but after acquiring rowlock.</div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -1303,24 +1311,24 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -1328,780 +1336,780 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>preCleanupBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Called as part of SecureBulkLoadEndpoint.cleanupBulkLoad() RPC call.</div>
-</div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preClearCompactionQueues<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>preCleanupBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">This will be called before clearing compaction queues</div>
+<div class="block">Called as part of SecureBulkLoadEndpoint.cleanupBulkLoad() RPC call.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preClearDeadServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preClearCompactionQueues<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before clear dead region servers.</div>
+<div class="block">This will be called before clearing compaction queues</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preClearRegionBlockCache<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preClearDeadServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before clearing the block caches for one or more regions</div>
+<div class="block">Called before clear dead region servers.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCloneSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preClearRegionBlockCache<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Called before clearing the block caches for one or more regions</div>
+</div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCloneSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;tableDescriptor)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a snapshot is cloned.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  boolean&nbsp;abortRequested)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the region is reported as closed to the master.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCommitStoreFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCommitStoreFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  byte[]&nbsp;family,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.util.Pair&lt;org.apache.hadoop.fs.Path,<wbr>org.apache.hadoop.fs.Path&gt;&gt;&nbsp;pairs)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before moving bulk loaded hfile to region directory.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
  org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to writing the <code>StoreFile</code>s selected for compaction into a new
  <code>StoreFile</code>.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before we open store scanner for compaction.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactSelection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactSelection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;? extends org.apache.hadoop.hbase.regionserver.StoreFile&gt;&nbsp;candidates,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to selecting the <code>StoreFiles</code> to compact from the list of
  available candidates.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.NamespaceDescriptor&nbsp;ns)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a new namespace is created by <code>HMaster</code>.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regions)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a new table is created by <code>HMaster</code>.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regions)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a new table is created by <code>HMaster</code>.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.TableDescriptor</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableRegionsInfos<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.TableDescriptor</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTableRegionsInfos<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before we create the region infos for this table.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDecommissionRegionServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDecommissionRegionServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.ServerName&gt;&nbsp;servers,
  boolean&nbsp;offload)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before decommission region servers.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client deletes a value.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Called before <code>HMaster</code> deletes a namespace</div>
-</div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before a snapshot is deleted.</div>
+<div class="block">Called before <code>HMaster</code> deletes a namespace</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before <code>HMaster</code> deletes a table.</div>
+<div class="block">Called before a snapshot is deleted.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Called before <code>HMaster</code> deletes a table.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before disable a replication peer</div>
+<div class="block">Called before <code>HMaster</code> deletes a table.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called prior to disabling a table.</div>
+<div class="block">Called before disable a replication peer</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last odd-row-color">
 <div class="block">Called prior to disabling a table.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before enable a replication peer</div>
+<div class="block">Called prior to disabling a table.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called prior to enabling a table.</div>
+<div class="block">Called before enable a replication peer</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Called prior to enabling a table.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hbase.thirdparty.com.google.protobuf.Message</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">EndpointObserver.</span><code>preEndpointInvocation<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called prior to enabling a table.</div>
+</div>
+<div class="col-first even-row-color"><code>default org.apache.hbase.thirdparty.com.google.protobuf.Message</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">EndpointObserver.</span><code>preEndpointInvocation<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hbase.thirdparty.com.google.protobuf.Service&nbsp;service,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName,
  org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;request)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before an Endpoint service method is invoked.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preExecuteProcedures<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preExecuteProcedures<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">This will be called before executing procedures</div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preExists<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preExists<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Get&nbsp;get,
  boolean&nbsp;exists)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client tests for existence using a Get.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the memstore is flushed to disk.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a Store's memstore is flushed to disk.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlushScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlushScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Called before we open store scanner for flush.</div>
-</div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetClusterMetrics<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before get cluster status.</div>
+<div class="block">Called before we open store scanner for flush.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetConfiguredNamespacesAndTablesInRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetClusterMetrics<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before getting the configured namespaces and tables in the region server group.</div>
+<div class="block">Called before get cluster status.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetLocks<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetConfiguredNamespacesAndTablesInRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before a getLocks request has been processed.</div>
+<div class="block">Called before getting the configured namespaces and tables in the region server group.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetNamespaceDescriptor<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetLocks<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before a getNamespaceDescriptor request has been processed.</div>
+<div class="block">Called before a getLocks request has been processed.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preGetOp<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
- org.apache.hadoop.hbase.client.Get&nbsp;get,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.Cell&gt;&nbsp;result)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetNamespaceDescriptor<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the client performs a Get</div>
+<div class="block">Called before a getNamespaceDescriptor request has been processed.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetProcedures<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preGetOp<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+ org.apache.hadoop.hbase.client.Get&nbsp;get,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.Cell&gt;&nbsp;result)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before a getProcedures request has been processed.</div>
+<div class="block">Called before the client performs a Get</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetReplicationPeerConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetProcedures<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before get the configured ReplicationPeerConfig for the specified peer</div>
+<div class="block">Called before a getProcedures request has been processed.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfo<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetReplicationPeerConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before getting region server group info of the passed groupName.</div>
+<div class="block">Called before get the configured ReplicationPeerConfig for the specified peer</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfoOfServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.net.Address&nbsp;server)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfo<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before getting region server group info of the passed server.</div>
+<div class="block">Called before getting region server group info of the passed groupName.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfoOfTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfoOfServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.net.Address&nbsp;server)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before getting region server group info of the passed tableName.</div>
+<div class="block">Called before getting region server group info of the passed server.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetTableDescriptors<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfoOfTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before getting region server group info of the passed tableName.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetTableDescriptors<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.TableName&gt;&nbsp;tableNamesList,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.TableDescriptor&gt;&nbsp;descriptors,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;regex)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a getTableDescriptors request has been processed.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetTableNames<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetTableNames<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.TableDescriptor&gt;&nbsp;descriptors,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;regex)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a getTableNames request has been processed.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetUserPermissions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetUserPermissions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before getting user permissions.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preGrant<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGrant<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.security.access.UserPermission&nbsp;userPermission,
  boolean&nbsp;mergeExistingPermissions)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before granting user permissions.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preHasUserPermissions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preHasUserPermissions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;permissions)</code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before Increment.</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrementAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrementAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preIsRpcThrottleEnabled<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Called before getting if is rpc throttle enabled.</div>
-</div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListDecommissionedRegionServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preIsRpcThrottleEnabled<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before list decommissioned region servers.</div>
+<div class="block">Called before getting if is rpc throttle enabled.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListNamespaceDescriptors<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.NamespaceDescriptor&gt;&nbsp;descriptors)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListDecommissionedRegionServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before a listNamespaceDescriptors request has been processed.</div>
+<div class="block">Called before list decommissioned region servers.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListNamespaces<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;&nbsp;namespaces)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListNamespaceDescriptors<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.NamespaceDescriptor&gt;&nbsp;descriptors)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before a listNamespaces request has been processed.</div>
+<div class="block">Called before a listNamespaceDescriptors request has been processed.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListReplicationPeers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;regex)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListNamespaces<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;&nbsp;namespaces)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before list replication peers.</div>
+<div class="block">Called before a listNamespaces request has been processed.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListRSGroups<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListReplicationPeers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;regex)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before listing region server group information.</div>
+<div class="block">Called before list replication peers.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListRSGroups<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before listSnapshots request has been processed.</div>
+<div class="block">Called before listing region server group information.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListTablesInRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preListSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before listing all tables in the region server group.</div>
+<div class="block">Called before listSnapshots request has been processed.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preLockHeartbeat<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tn,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;description)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preListTablesInRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before heartbeat to a lock.</div>
+<div class="block">Called before listing all tables in the region server group.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMasterInitialization<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preLockHeartbeat<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tn,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;description)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Call before the master initialization is set to true.</div>
+<div class="block">Called before heartbeat to a lock.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMasterStoreFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMasterInitialization<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the master local region memstore is flushed to disk.</div>
+<div class="block">Call before the master initialization is set to true.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompaction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
- org.apache.hadoop.hbase.regionserver.Store&nbsp;store)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMasterStoreFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
 <div class="col-last even-row-color">
+<div class="block">Called before the master local region memstore is flushed to disk.</div>
+</div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompaction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+ org.apache.hadoop.hbase.regionserver.Store&nbsp;store)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Called before in memory compaction started.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before we do in memory compaction.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before we open store scanner for in memory compaction.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before merge regions request.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the regions merge.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsCommitAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsCommitAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;metaEntries)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">This will be called before update META step as part of regions merge transaction.</div>
 </div>
-<div class="col-first even-row-color"><code>default <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyColumnFamilyStoreFileTracker<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyColumnFamilyStoreFileTracker<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  byte[]&nbsp;family,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;dstSFT)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called prior to modifying a family's store file tracker.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyNamespace<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.NamespaceDescriptor&nbsp;currentNsDescriptor,
  org.apache.hadoop.hbase.NamespaceDescriptor&nbsp;newNsDescriptor)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to modifying a namespace's properties.</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.TableDescriptor</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.TableDescriptor</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;currentDescriptor,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;newDescriptor)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called prior to modifying a table's properties.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;currentDescriptor,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;newDescriptor)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to modifying a table's properties.</div>
 </div>
-<div class="col-first even-row-color"><code>default <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTableStoreFileTracker<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preModifyTableStoreFileTracker<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;dstSFT)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called prior to modifying a table's store file tracker.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMove<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMove<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;region,
  org.apache.hadoop.hbase.ServerName&nbsp;srcServer,
  org.apache.hadoop.hbase.ServerName&nbsp;destServer)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Called prior to moving a given region from one region server to another.</div>
-</div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.net.Address&gt;&nbsp;servers,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;targetGroup)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before servers are moved to target region server group</div>
+<div class="block">Called prior to moving a given region from one region server to another.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServersAndTables<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.net.Address&gt;&nbsp;servers,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.TableName&gt;&nbsp;tables,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;targetGroup)</code></div>
 <div class="col-last odd-row-color">
 <div class="block">Called before servers are moved to target region server group</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveTables<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServersAndTables<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.net.Address&gt;&nbsp;servers,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.TableName&gt;&nbsp;tables,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;targetGroup)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before tables are moved to target region server group</div>
+<div class="block">Called before servers are moved to target region server group</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveTables<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.TableName&gt;&nbsp;tables,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;targetGroup)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the region is reported as open to the master.</div>
+<div class="block">Called before tables are moved to target region server group</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called as part of SecureBulkLoadEndpoint.prepareBulkLoad() RPC call.</div>
+<div class="block">Called before the region is reported as open to the master.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePrepareTimeStampForDeleteVersion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-second odd-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called as part of SecureBulkLoadEndpoint.prepareBulkLoad() RPC call.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePrepareTimeStampForDeleteVersion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Mutation&nbsp;mutation,
  org.apache.hadoop.hbase.Cell&nbsp;cell,
  byte[]&nbsp;byteNow,
  org.apache.hadoop.hbase.client.Get&nbsp;get)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">Since hbase-2.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client stores a value.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRecommissionRegionServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRecommissionRegionServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.ServerName&nbsp;server,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;byte[]&gt;&nbsp;encodedRegionNames)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before recommission region server.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRegionOffline<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRegionOffline<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to marking a given region as offline.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveReplicationPeer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before remove a replication peer</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;name)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a region server group is removed</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRemoveServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html" title="class or interface in java.util" class="external-link">Set</a>&lt;org.apache.hadoop.hbase.net.Address&gt;&nbsp;servers)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before servers are removed from rsgroup</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRenameRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRenameRSGroup<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;oldName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;newName)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before rename rsgroup.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before replaying WALs for this region.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preReplicateLogEntries<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preReplicateLogEntries<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">As of release 2.0.0 with out any replacement, plan to remove in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preReplicationSinkBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preReplicationSinkBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WALEntry&nbsp;walEntry,
  org.apache.hadoop.hbase.client.Mutation&nbsp;mutation)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">This will be called before replication sink mutations are executed on the sink table as part of
  batch call.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRequestLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRequestLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionInfos,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;description)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before new LockProcedure is queued.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRestoreSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRestoreSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;tableDescriptor)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a snapshot is restored.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preRevoke<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preRevoke<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.security.access.UserPermission&nbsp;userPermission)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before revoking user permissions.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preRollWALWriterRequest<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preRollWALWriterRequest<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">This will be called before executing user request to roll a region server WAL.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client closes a scanner.</div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerNext<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerNext<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.Result&gt;&nbsp;result,
  int&nbsp;limit,
  boolean&nbsp;hasNext)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client asks for the next row on a scanner.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Scan&nbsp;scan)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client opens a new scanner.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetNamespaceQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetNamespaceQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
  org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the quota for the namespace is stored.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetRegionServerQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetRegionServerQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;regionServer,
  org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the quota for the region server is stored.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetSplitOrMergeEnabled<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetSplitOrMergeEnabled<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  boolean&nbsp;newValue,
  org.apache.hadoop.hbase.client.MasterSwitchType&nbsp;switchType)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Called prior to setting split / merge switch Supports Coprocessor 'bypass'.</div>
-</div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetTableQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName,
- org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the quota for the table is stored.</div>
+<div class="block">Called prior to setting split / merge switch Supports Coprocessor 'bypass'.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetUserQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetTableQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the quota for the user on the specified namespace is stored.</div>
+<div class="block">Called before the quota for the table is stored.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetUserQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;namespace,
  org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the quota for the user is stored.</div>
+<div class="block">Called before the quota for the user on the specified namespace is stored.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
 <div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetUserQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
- org.apache.hadoop.hbase.TableName&nbsp;tableName,
  org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the quota for the user on the specified table is stored.</div>
+<div class="block">Called before the quota for the user is stored.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preShutdown<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetUserQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;userName,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName,
+ org.apache.hadoop.hbase.quotas.GlobalQuotaSettings&nbsp;quotas)</code></div>
 <div class="col-last odd-row-color">
+<div class="block">Called before the quota for the user on the specified table is stored.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preShutdown<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Called prior to shutting down the full HBase cluster, including this
  <code>HMaster</code> process.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSnapshot<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.SnapshotDescription&nbsp;snapshot,
  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;tableDescriptor)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a new snapshot is taken.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  byte[]&nbsp;splitRow)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the split region procedure is called.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.TableName&nbsp;tableName,
  byte[]&nbsp;splitRow)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the region is split.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionAfterMETAAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionAfterMETAAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
 <div class="block">This will be called after update META step as part of split transaction</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionBeforeMETAAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSplitRegionBeforeMETAAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  byte[]&nbsp;splitKey,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;metaEntries)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">This will be called before update META step as part of split transaction.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preStopMaster<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preStopMaster<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Called immediately prior to stopping this <code>HMaster</code>
  process.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preStopRegionServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preStopRegionServer<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Called before stopping region server.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.StoreFileReader</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreFileReaderOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.StoreFileReader</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreFileReaderOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.fs.FileSystem&nbsp;fs,
  org.apache.hadoop.fs.Path&nbsp;p,
  org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;in,
@@ -2109,106 +2117,114 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.io.hfile.CacheConfig&nbsp;cacheConf,
  org.apache.hadoop.hbase.io.Reference&nbsp;r,
  org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">For Phoenix only, StoreFileReader is not a stable interface.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options)</code></div>
-<div class="col-last even-row-color">
-<div class="block">Called before a store opens a new scanner.</div>
-</div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSwitchExceedThrottleQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- boolean&nbsp;enable)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before switching exceed throttle quota state.</div>
+<div class="block">Called before a store opens a new scanner.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSwitchRpcThrottle<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSwitchExceedThrottleQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  boolean&nbsp;enable)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before switching rpc throttle enabled state.</div>
+<div class="block">Called before switching exceed throttle quota state.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTableFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preSwitchRpcThrottle<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ boolean&nbsp;enable)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the table memstore is flushed to disk.</div>
+<div class="block">Called before switching rpc throttle enabled state.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTransitReplicationPeerSyncReplicationState<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId,
- org.apache.hadoop.hbase.replication.SyncReplicationState&nbsp;state)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTableFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before transit current cluster state for the specified synchronous replication peer</div>
+<div class="block">Called before the table memstore is flushed to disk.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
- org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTransitReplicationPeerSyncReplicationState<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId,
+ org.apache.hadoop.hbase.replication.SyncReplicationState&nbsp;state)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before the truncate region procedure is called.</div>
+<div class="block">Called before transit current cluster state for the specified synchronous replication peer</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the region is truncated.</div>
+<div class="block">Called before the truncate region procedure is called.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;c,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before <code>HMaster</code> truncates a table.</div>
+<div class="block">Called before the region is truncated.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Called before <code>HMaster</code> truncates a table.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUnassign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateTableAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.TableName&nbsp;tableName)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called prior to unassigning a given region.</div>
+<div class="block">Called before <code>HMaster</code> truncates a table.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateMasterConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
- org.apache.hadoop.conf.Configuration&nbsp;preReloadConf)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preUnassign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;regionInfo)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before reloading the HMaster's <code>Configuration</code> from disk</div>
+<div class="block">Called prior to unassigning a given region.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preUpdateRegionServerConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateMasterConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.conf.Configuration&nbsp;preReloadConf)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called before reloading the RegionServer's <code>Configuration</code> from disk</div>
+<div class="block">Called before reloading the HMaster's <code>Configuration</code> from disk</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateReplicationPeerConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preUpdateRegionServerConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.conf.Configuration&nbsp;preReloadConf)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Called before reloading the RegionServer's <code>Configuration</code> from disk</div>
+</div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateReplicationPeerConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;peerId,
  org.apache.hadoop.hbase.replication.ReplicationPeerConfig&nbsp;peerConfig)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before update peerConfig for the specified peer</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateRSGroupConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateRSGroupConfig<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;groupName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Map.html" title="class or interface in java.util" class="external-link">Map</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">St [...]
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before update rsgroup config.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called just before the WAL Entry is appended to the WAL.</div>
 </div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
+</div>
 <div class="col-first odd-row-color"><code>default void</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>preWALRoll<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.fs.Path&nbsp;oldPath,
diff --git a/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html b/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
index 3ad20eb153b..8cef29de00b 100644
--- a/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
+++ b/apidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
@@ -420,43 +420,51 @@ loadScripts(document, 'script');</script>
 <div class="deprecation-comment">For Phoenix only, StoreFileReader is not a stable interface.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
- org.apache.hadoop.hbase.client.Append&nbsp;append)</code></div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last odd-row-color">
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
+</div>
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+ org.apache.hadoop.hbase.client.Append&nbsp;append)</code></div>
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before Append.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppendAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppendAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preBatchMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">This will be called for every batch mutation operation happening at the server.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preBulkLoadHFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preBulkLoadHFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.util.Pair&lt;byte[],<wbr><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;&gt;&nbsp;familyPaths)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before bulkLoadHFile.</div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -464,24 +472,24 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -489,38 +497,38 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndDeleteAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutate<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  <a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a>&nbsp;checkAndMutate,
  org.apache.hadoop.hbase.client.CheckAndMutateResult&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before checkAndMutate</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutateAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.CheckAndMutateResult</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndMutateAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  <a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a>&nbsp;checkAndMutate,
  org.apache.hadoop.hbase.client.CheckAndMutateResult&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before checkAndDelete but after acquiring rowlock.</div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -528,24 +536,24 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default boolean</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default boolean</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  byte[]&nbsp;family,
  byte[]&nbsp;qualifier,
@@ -553,242 +561,242 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.filter.ByteArrayComparable&nbsp;comparator,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCheckAndPutAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  byte[]&nbsp;row,
  org.apache.hadoop.hbase.filter.Filter&nbsp;filter,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  boolean&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>preCleanupBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
-<div class="col-last even-row-color">
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>preCleanupBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Called as part of SecureBulkLoadEndpoint.cleanupBulkLoad() RPC call.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  boolean&nbsp;abortRequested)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the region is reported as closed to the master.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCommitStoreFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCommitStoreFile<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  byte[]&nbsp;family,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.util.Pair&lt;org.apache.hadoop.fs.Path,<wbr>org.apache.hadoop.fs.Path&gt;&gt;&nbsp;pairs)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before moving bulk loaded hfile to region directory.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
  org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to writing the <code>StoreFile</code>s selected for compaction into a new
  <code>StoreFile</code>.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before we open store scanner for compaction.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactSelection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preCompactSelection<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;? extends org.apache.hadoop.hbase.regionserver.StoreFile&gt;&nbsp;candidates,
  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called prior to selecting the <code>StoreFiles</code> to compact from the list of
  available candidates.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client deletes a value.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hbase.thirdparty.com.google.protobuf.Message</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">EndpointObserver.</span><code>preEndpointInvocation<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default org.apache.hbase.thirdparty.com.google.protobuf.Message</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">EndpointObserver.</span><code>preEndpointInvocation<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hbase.thirdparty.com.google.protobuf.Service&nbsp;service,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName,
  org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;request)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before an Endpoint service method is invoked.</div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preExists<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preExists<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Get&nbsp;get,
  boolean&nbsp;exists)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client tests for existence using a Get.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the memstore is flushed to disk.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlush<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before a Store's memstore is flushed to disk.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlushScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preFlushScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options,
  org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before we open store scanner for flush.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preGetOp<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preGetOp<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Get&nbsp;get,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.Cell&gt;&nbsp;result)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client performs a Get</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before Increment.</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrementAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrementAfterRowLock<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompaction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompaction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before in memory compaction started.</div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.InternalScanner</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompact<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before we do in memory compaction.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preMemStoreCompactionCompactScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options)</code></div>
-<div class="col-last odd-row-color">
-<div class="block">Called before we open store scanner for in memory compaction.</div>
-</div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called before the region is reported as open to the master.</div>
+<div class="block">Called before we open store scanner for in memory compaction.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code></div>
 <div class="col-last odd-row-color">
-<div class="block">Called as part of SecureBulkLoadEndpoint.prepareBulkLoad() RPC call.</div>
+<div class="block">Called before the region is reported as open to the master.</div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePrepareTimeStampForDeleteVersion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-second even-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Called as part of SecureBulkLoadEndpoint.prepareBulkLoad() RPC call.</div>
+</div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePrepareTimeStampForDeleteVersion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Mutation&nbsp;mutation,
  org.apache.hadoop.hbase.Cell&nbsp;cell,
  byte[]&nbsp;byteNow,
  org.apache.hadoop.hbase.client.Get&nbsp;get)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">Since hbase-2.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client stores a value.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preReplayWALs<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.fs.Path&nbsp;edits)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before replaying WALs for this region.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerClose<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client closes a scanner.</div>
 </div>
-<div class="col-first odd-row-color"><code>default boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerNext<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerNext<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.client.Result&gt;&nbsp;result,
  int&nbsp;limit,
  boolean&nbsp;hasNext)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client asks for the next row on a scanner.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Scan&nbsp;scan)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client opens a new scanner.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.regionserver.StoreFileReader</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreFileReaderOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.regionserver.StoreFileReader</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreFileReaderOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.fs.FileSystem&nbsp;fs,
  org.apache.hadoop.fs.Path&nbsp;p,
  org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;in,
@@ -796,25 +804,33 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.hbase.io.hfile.CacheConfig&nbsp;cacheConf,
  org.apache.hadoop.hbase.io.Reference&nbsp;r,
  org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">For Phoenix only, StoreFileReader is not a stable interface.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preStoreScannerOpen<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
  org.apache.hadoop.hbase.regionserver.ScanOptions&nbsp;options)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before a store opens a new scanner.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called just before the WAL Entry is appended to the WAL.</div>
 </div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
+</div>
 </div>
 </section>
 </li>
diff --git a/apidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html b/apidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
index 7f94a48d048..c015cf207cd 100644
--- a/apidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
+++ b/apidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
@@ -134,68 +134,84 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </div>
 </div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last even-row-color">
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
+</div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
 <div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
 </div>
-<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Append&nbsp;append,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before Append.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before the client deletes a value.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first even-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Increment&nbsp;increment,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block">Called before Increment.</div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called before the client stores a value.</div>
 </div>
-<div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>prePut<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
  org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
  org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code></div>
-<div class="col-last even-row-color">
+<div class="col-last odd-row-color">
 <div class="block"><span class="deprecated-label">Deprecated.</span>
 <div class="deprecation-comment">since 3.0.0 and will be removed in 4.0.0.</div>
 </div>
 </div>
-<div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called just before the WAL Entry is appended to the WAL.</div>
 </div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
+</div>
 <div class="col-first even-row-color"><code>default void</code></div>
 <div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>preWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
@@ -273,34 +289,46 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>postPut<wbr>(org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.client.Append&nbsp;append,
+<div class="col-first even-row-color"><code>void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preAppend<wbr>(org.apache.hadoop.hbase.client.Append&nbsp;append,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Supports Coprocessor 'bypass'.</div>
+</div>
+<div class="col-first even-row-color"><code>boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.client.Delete&nbsp;delete,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Supports Coprocessor 'bypass'.</div>
 </div>
-<div class="col-first odd-row-color"><code>boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preDelete<wbr>(org.apache.hadoop.hbase.client.Delete&nbsp;delete,
+<div class="col-first odd-row-color"><code>org.apache.hadoop.hbase.client.Result</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.client.Increment&nbsp;increment,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
 <div class="col-last odd-row-color">
 <div class="block">Supports Coprocessor 'bypass'.</div>
 </div>
-<div class="col-first even-row-color"><code>org.apache.hadoop.hbase.client.Result</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preIncrement<wbr>(org.apache.hadoop.hbase.client.Increment&nbsp;increment,
+<div class="col-first even-row-color"><code>boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>prePut<wbr>(org.apache.hadoop.hbase.client.Put&nbsp;put,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
 <div class="col-last even-row-color">
 <div class="block">Supports Coprocessor 'bypass'.</div>
 </div>
-<div class="col-first odd-row-color"><code>boolean</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>prePut<wbr>(org.apache.hadoop.hbase.client.Put&nbsp;put,
+<div class="col-first odd-row-color"><code>void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last even-row-color">
 <div class="block">Supports Coprocessor 'bypass'.</div>
 </div>
-<div class="col-first even-row-color"><code>void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
- org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>void</code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">MiniBatchOperationInProgress.</span><code>setWalEdit<wbr>(int&nbsp;index,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;walEdit)</code></div>
diff --git a/apidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html b/apidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
index e882248d53b..b019cfb3f08 100644
--- a/apidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
+++ b/apidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
@@ -82,20 +82,36 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="table-header col-second">Method</div>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><code>default void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last even-row-color">
-<div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
+<div class="block">Called after a <code>WALEdit</code> replayed for this region.</div>
 </div>
 <div class="col-first odd-row-color"><code>default void</code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called after a <code>WALEdit</code> is writen to WAL.</div>
+</div>
+<div class="col-first even-row-color"><code>default void</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
  org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last even-row-color">
 <div class="block">Called just before the WAL Entry is appended to the WAL.</div>
 </div>
+<div class="col-first odd-row-color"><code>default void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+ org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last odd-row-color">
+<div class="block">Called before a <code>WALEdit</code> replayed for this region.</div>
+</div>
 <div class="col-first even-row-color"><code>default void</code></div>
 <div class="col-second even-row-color"><span class="type-name-label">WALObserver.</span><code>preWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment&gt;&nbsp;ctx,
  org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
@@ -142,9 +158,21 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="table-header col-second">Method</div>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><code>void</code></div>
-<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
- org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>void</code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALAppend<wbr>(org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>boolean</code></div>
+<div class="col-second even-row-color"><span class="type-name-label">RegionCoprocessorHost.</span><code>preWALRestore<wbr>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+ org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+ org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code></div>
+<div class="col-last even-row-color">
+<div class="block">Supports Coprocessor 'bypass'.</div>
+</div>
 </div>
 </section>
 </li>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html b/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
index ee7059997d5..f73c86380f6 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
@@ -1426,191 +1426,207 @@
 <span class="source-line-no">1413</span><span id="line-1413">  }</span>
 <span class="source-line-no">1414</span><span id="line-1414"></span>
 <span class="source-line-no">1415</span><span id="line-1415">  /**</span>
-<span class="source-line-no">1416</span><span id="line-1416">   * Called before bulkLoadHFile. Users can create a StoreFile instance to access the contents of a</span>
-<span class="source-line-no">1417</span><span id="line-1417">   * HFile.</span>
-<span class="source-line-no">1418</span><span id="line-1418">   * @param ctx         the environment provided by the region server</span>
-<span class="source-line-no">1419</span><span id="line-1419">   * @param familyPaths pairs of { CF, HFile path } submitted for bulk load. Adding or removing from</span>
-<span class="source-line-no">1420</span><span id="line-1420">   *                    this list will add or remove HFiles to be bulk loaded.</span>
-<span class="source-line-no">1421</span><span id="line-1421">   */</span>
-<span class="source-line-no">1422</span><span id="line-1422">  default void preBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1423</span><span id="line-1423">    List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {</span>
-<span class="source-line-no">1424</span><span id="line-1424">  }</span>
-<span class="source-line-no">1425</span><span id="line-1425"></span>
-<span class="source-line-no">1426</span><span id="line-1426">  /**</span>
-<span class="source-line-no">1427</span><span id="line-1427">   * Called before moving bulk loaded hfile to region directory.</span>
-<span class="source-line-no">1428</span><span id="line-1428">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1429</span><span id="line-1429">   * @param family column family</span>
-<span class="source-line-no">1430</span><span id="line-1430">   * @param pairs  List of pairs of { HFile location in staging dir, HFile path in region dir } Each</span>
-<span class="source-line-no">1431</span><span id="line-1431">   *               pair are for the same hfile.</span>
-<span class="source-line-no">1432</span><span id="line-1432">   */</span>
-<span class="source-line-no">1433</span><span id="line-1433">  default void preCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1434</span><span id="line-1434">    byte[] family, List&lt;Pair&lt;Path, Path&gt;&gt; pairs) throws IOException {</span>
-<span class="source-line-no">1435</span><span id="line-1435">  }</span>
-<span class="source-line-no">1436</span><span id="line-1436"></span>
-<span class="source-line-no">1437</span><span id="line-1437">  /**</span>
-<span class="source-line-no">1438</span><span id="line-1438">   * Called after moving bulk loaded hfile to region directory.</span>
-<span class="source-line-no">1439</span><span id="line-1439">   * @param ctx     the environment provided by the region server</span>
-<span class="source-line-no">1440</span><span id="line-1440">   * @param family  column family</span>
-<span class="source-line-no">1441</span><span id="line-1441">   * @param srcPath Path to file before the move</span>
-<span class="source-line-no">1442</span><span id="line-1442">   * @param dstPath Path to file after the move</span>
-<span class="source-line-no">1443</span><span id="line-1443">   */</span>
-<span class="source-line-no">1444</span><span id="line-1444">  default void postCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1445</span><span id="line-1445">    byte[] family, Path srcPath, Path dstPath) throws IOException {</span>
-<span class="source-line-no">1446</span><span id="line-1446">  }</span>
-<span class="source-line-no">1447</span><span id="line-1447"></span>
-<span class="source-line-no">1448</span><span id="line-1448">  /**</span>
-<span class="source-line-no">1449</span><span id="line-1449">   * Called after bulkLoadHFile.</span>
-<span class="source-line-no">1450</span><span id="line-1450">   * @param ctx                the environment provided by the region server</span>
-<span class="source-line-no">1451</span><span id="line-1451">   * @param stagingFamilyPaths pairs of { CF, HFile path } submitted for bulk load</span>
-<span class="source-line-no">1452</span><span id="line-1452">   * @param finalPaths         Map of CF to List of file paths for the loaded files if the Map is</span>
-<span class="source-line-no">1453</span><span id="line-1453">   *                           not null, the bulkLoad was successful. Otherwise the bulk load</span>
-<span class="source-line-no">1454</span><span id="line-1454">   *                           failed. bulkload is done by the time this hook is called.</span>
-<span class="source-line-no">1455</span><span id="line-1455">   */</span>
-<span class="source-line-no">1456</span><span id="line-1456">  default void postBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1457</span><span id="line-1457">    List&lt;Pair&lt;byte[], String&gt;&gt; stagingFamilyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; finalPaths)</span>
-<span class="source-line-no">1458</span><span id="line-1458">    throws IOException {</span>
-<span class="source-line-no">1459</span><span id="line-1459">  }</span>
-<span class="source-line-no">1460</span><span id="line-1460"></span>
-<span class="source-line-no">1461</span><span id="line-1461">  /**</span>
-<span class="source-line-no">1462</span><span id="line-1462">   * Called before creation of Reader for a store file. Calling</span>
-<span class="source-line-no">1463</span><span id="line-1463">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
-<span class="source-line-no">1464</span><span id="line-1464">   * hook.</span>
-<span class="source-line-no">1465</span><span id="line-1465">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1466</span><span id="line-1466">   * @param fs     fileystem to read from</span>
-<span class="source-line-no">1467</span><span id="line-1467">   * @param p      path to the file</span>
-<span class="source-line-no">1468</span><span id="line-1468">   * @param in     {@link FSDataInputStreamWrapper}</span>
-<span class="source-line-no">1469</span><span id="line-1469">   * @param size   Full size of the file</span>
-<span class="source-line-no">1470</span><span id="line-1470">   * @param r      original reference file. This will be not null only when reading a split file.</span>
-<span class="source-line-no">1471</span><span id="line-1471">   * @param reader the base reader, if not {@code null}, from previous RegionObserver in the chain</span>
-<span class="source-line-no">1472</span><span id="line-1472">   * @return a Reader instance to use instead of the base reader if overriding default behavior,</span>
-<span class="source-line-no">1473</span><span id="line-1473">   *         null otherwise</span>
-<span class="source-line-no">1474</span><span id="line-1474">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
-<span class="source-line-no">1475</span><span id="line-1475">   */</span>
-<span class="source-line-no">1476</span><span id="line-1476">  @Deprecated</span>
-<span class="source-line-no">1477</span><span id="line-1477">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
-<span class="source-line-no">1478</span><span id="line-1478">  // This is fine as the hook is deprecated any way.</span>
-<span class="source-line-no">1479</span><span id="line-1479">  default StoreFileReader preStoreFileReaderOpen(</span>
-<span class="source-line-no">1480</span><span id="line-1480">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
-<span class="source-line-no">1481</span><span id="line-1481">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
-<span class="source-line-no">1482</span><span id="line-1482">    StoreFileReader reader) throws IOException {</span>
-<span class="source-line-no">1483</span><span id="line-1483">    return reader;</span>
-<span class="source-line-no">1484</span><span id="line-1484">  }</span>
-<span class="source-line-no">1485</span><span id="line-1485"></span>
-<span class="source-line-no">1486</span><span id="line-1486">  /**</span>
-<span class="source-line-no">1487</span><span id="line-1487">   * Called after the creation of Reader for a store file.</span>
-<span class="source-line-no">1488</span><span id="line-1488">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1489</span><span id="line-1489">   * @param fs     fileystem to read from</span>
-<span class="source-line-no">1490</span><span id="line-1490">   * @param p      path to the file</span>
-<span class="source-line-no">1491</span><span id="line-1491">   * @param in     {@link FSDataInputStreamWrapper}</span>
-<span class="source-line-no">1492</span><span id="line-1492">   * @param size   Full size of the file</span>
-<span class="source-line-no">1493</span><span id="line-1493">   * @param r      original reference file. This will be not null only when reading a split file.</span>
-<span class="source-line-no">1494</span><span id="line-1494">   * @param reader the base reader instance</span>
-<span class="source-line-no">1495</span><span id="line-1495">   * @return The reader to use</span>
-<span class="source-line-no">1496</span><span id="line-1496">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
-<span class="source-line-no">1497</span><span id="line-1497">   */</span>
-<span class="source-line-no">1498</span><span id="line-1498">  @Deprecated</span>
-<span class="source-line-no">1499</span><span id="line-1499">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
-<span class="source-line-no">1500</span><span id="line-1500">  // This is fine as the hook is deprecated any way.</span>
-<span class="source-line-no">1501</span><span id="line-1501">  default StoreFileReader postStoreFileReaderOpen(</span>
-<span class="source-line-no">1502</span><span id="line-1502">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
-<span class="source-line-no">1503</span><span id="line-1503">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
-<span class="source-line-no">1504</span><span id="line-1504">    StoreFileReader reader) throws IOException {</span>
-<span class="source-line-no">1505</span><span id="line-1505">    return reader;</span>
-<span class="source-line-no">1506</span><span id="line-1506">  }</span>
-<span class="source-line-no">1507</span><span id="line-1507"></span>
-<span class="source-line-no">1508</span><span id="line-1508">  /**</span>
-<span class="source-line-no">1509</span><span id="line-1509">   * Called after a new cell has been created during an increment operation, but before it is</span>
-<span class="source-line-no">1510</span><span id="line-1510">   * committed to the WAL or memstore. Calling</span>
-<span class="source-line-no">1511</span><span id="line-1511">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
-<span class="source-line-no">1512</span><span id="line-1512">   * hook.</span>
-<span class="source-line-no">1513</span><span id="line-1513">   * @param ctx      the environment provided by the region server</span>
-<span class="source-line-no">1514</span><span id="line-1514">   * @param opType   the operation type</span>
-<span class="source-line-no">1515</span><span id="line-1515">   * @param mutation the current mutation</span>
-<span class="source-line-no">1516</span><span id="line-1516">   * @param oldCell  old cell containing previous value</span>
-<span class="source-line-no">1517</span><span id="line-1517">   * @param newCell  the new cell containing the computed value</span>
-<span class="source-line-no">1518</span><span id="line-1518">   * @return the new cell, possibly changed</span>
-<span class="source-line-no">1519</span><span id="line-1519">   * @deprecated since 2.2.0 and will be removedin 4.0.0. Use</span>
-<span class="source-line-no">1520</span><span id="line-1520">   *             {@link #postIncrementBeforeWAL(ObserverContext, Mutation, List)} or</span>
-<span class="source-line-no">1521</span><span id="line-1521">   *             {@link #postAppendBeforeWAL(ObserverContext, Mutation, List)} instead.</span>
-<span class="source-line-no">1522</span><span id="line-1522">   * @see #postIncrementBeforeWAL(ObserverContext, Mutation, List)</span>
-<span class="source-line-no">1523</span><span id="line-1523">   * @see #postAppendBeforeWAL(ObserverContext, Mutation, List)</span>
-<span class="source-line-no">1524</span><span id="line-1524">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21643"&gt;HBASE-21643&lt;/a&gt;</span>
-<span class="source-line-no">1525</span><span id="line-1525">   */</span>
-<span class="source-line-no">1526</span><span id="line-1526">  @Deprecated</span>
-<span class="source-line-no">1527</span><span id="line-1527">  default Cell postMutationBeforeWAL(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1528</span><span id="line-1528">    MutationType opType, Mutation mutation, Cell oldCell, Cell newCell) throws IOException {</span>
-<span class="source-line-no">1529</span><span id="line-1529">    return newCell;</span>
-<span class="source-line-no">1530</span><span id="line-1530">  }</span>
-<span class="source-line-no">1531</span><span id="line-1531"></span>
-<span class="source-line-no">1532</span><span id="line-1532">  /**</span>
-<span class="source-line-no">1533</span><span id="line-1533">   * Called after a list of new cells has been created during an increment operation, but before</span>
-<span class="source-line-no">1534</span><span id="line-1534">   * they are committed to the WAL or memstore.</span>
-<span class="source-line-no">1535</span><span id="line-1535">   * @param ctx       the environment provided by the region server</span>
-<span class="source-line-no">1536</span><span id="line-1536">   * @param mutation  the current mutation</span>
-<span class="source-line-no">1537</span><span id="line-1537">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
-<span class="source-line-no">1538</span><span id="line-1538">   *                  second cell is the new cell.</span>
-<span class="source-line-no">1539</span><span id="line-1539">   * @return a list of cell pair, possibly changed.</span>
-<span class="source-line-no">1540</span><span id="line-1540">   */</span>
-<span class="source-line-no">1541</span><span id="line-1541">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postIncrementBeforeWAL(</span>
-<span class="source-line-no">1542</span><span id="line-1542">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
-<span class="source-line-no">1543</span><span id="line-1543">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
-<span class="source-line-no">1544</span><span id="line-1544">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
-<span class="source-line-no">1545</span><span id="line-1545">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
-<span class="source-line-no">1546</span><span id="line-1546">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.INCREMENT,</span>
-<span class="source-line-no">1547</span><span id="line-1547">        mutation, pair.getFirst(), pair.getSecond())));</span>
-<span class="source-line-no">1548</span><span id="line-1548">    }</span>
-<span class="source-line-no">1549</span><span id="line-1549">    return resultPairs;</span>
-<span class="source-line-no">1550</span><span id="line-1550">  }</span>
-<span class="source-line-no">1551</span><span id="line-1551"></span>
-<span class="source-line-no">1552</span><span id="line-1552">  /**</span>
-<span class="source-line-no">1553</span><span id="line-1553">   * Called after a list of new cells has been created during an append operation, but before they</span>
-<span class="source-line-no">1554</span><span id="line-1554">   * are committed to the WAL or memstore.</span>
-<span class="source-line-no">1555</span><span id="line-1555">   * @param ctx       the environment provided by the region server</span>
-<span class="source-line-no">1556</span><span id="line-1556">   * @param mutation  the current mutation</span>
-<span class="source-line-no">1557</span><span id="line-1557">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
-<span class="source-line-no">1558</span><span id="line-1558">   *                  second cell is the new cell.</span>
-<span class="source-line-no">1559</span><span id="line-1559">   * @return a list of cell pair, possibly changed.</span>
-<span class="source-line-no">1560</span><span id="line-1560">   */</span>
-<span class="source-line-no">1561</span><span id="line-1561">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postAppendBeforeWAL(</span>
-<span class="source-line-no">1562</span><span id="line-1562">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
-<span class="source-line-no">1563</span><span id="line-1563">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
-<span class="source-line-no">1564</span><span id="line-1564">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
-<span class="source-line-no">1565</span><span id="line-1565">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
-<span class="source-line-no">1566</span><span id="line-1566">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.APPEND,</span>
-<span class="source-line-no">1567</span><span id="line-1567">        mutation, pair.getFirst(), pair.getSecond())));</span>
-<span class="source-line-no">1568</span><span id="line-1568">    }</span>
-<span class="source-line-no">1569</span><span id="line-1569">    return resultPairs;</span>
-<span class="source-line-no">1570</span><span id="line-1570">  }</span>
-<span class="source-line-no">1571</span><span id="line-1571"></span>
-<span class="source-line-no">1572</span><span id="line-1572">  /**</span>
-<span class="source-line-no">1573</span><span id="line-1573">   * Called after the ScanQueryMatcher creates ScanDeleteTracker. Implementing this hook would help</span>
-<span class="source-line-no">1574</span><span id="line-1574">   * in creating customised DeleteTracker and returning the newly created DeleteTracker</span>
-<span class="source-line-no">1575</span><span id="line-1575">   * &lt;p&gt;</span>
-<span class="source-line-no">1576</span><span id="line-1576">   * Warn: This is used by internal coprocessors. Should not be implemented by user coprocessors</span>
-<span class="source-line-no">1577</span><span id="line-1577">   * @param ctx        the environment provided by the region server</span>
-<span class="source-line-no">1578</span><span id="line-1578">   * @param delTracker the deleteTracker that is created by the QueryMatcher</span>
-<span class="source-line-no">1579</span><span id="line-1579">   * @return the Delete Tracker</span>
-<span class="source-line-no">1580</span><span id="line-1580">   * @deprecated Since 2.0.0, will be removed in 4.0.0. Visibility label feature still use this</span>
-<span class="source-line-no">1581</span><span id="line-1581">   *             method, so it can not be removed in 3.0.0</span>
-<span class="source-line-no">1582</span><span id="line-1582">   */</span>
-<span class="source-line-no">1583</span><span id="line-1583">  @Deprecated</span>
-<span class="source-line-no">1584</span><span id="line-1584">  default DeleteTracker postInstantiateDeleteTracker(</span>
-<span class="source-line-no">1585</span><span id="line-1585">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, DeleteTracker delTracker)</span>
-<span class="source-line-no">1586</span><span id="line-1586">    throws IOException {</span>
-<span class="source-line-no">1587</span><span id="line-1587">    return delTracker;</span>
-<span class="source-line-no">1588</span><span id="line-1588">  }</span>
-<span class="source-line-no">1589</span><span id="line-1589"></span>
-<span class="source-line-no">1590</span><span id="line-1590">  /**</span>
-<span class="source-line-no">1591</span><span id="line-1591">   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows</span>
-<span class="source-line-no">1592</span><span id="line-1592">   * coprocessors to add extended attributes to the WALKey that then get persisted to the WAL, and</span>
-<span class="source-line-no">1593</span><span id="line-1593">   * are available to replication endpoints to use in processing WAL Entries.</span>
-<span class="source-line-no">1594</span><span id="line-1594">   * @param ctx the environment provided by the region server</span>
-<span class="source-line-no">1595</span><span id="line-1595">   * @param key the WALKey associated with a particular append to a WAL</span>
-<span class="source-line-no">1596</span><span id="line-1596">   */</span>
-<span class="source-line-no">1597</span><span id="line-1597">  default void preWALAppend(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, WALKey key,</span>
-<span class="source-line-no">1598</span><span id="line-1598">    WALEdit edit) throws IOException {</span>
-<span class="source-line-no">1599</span><span id="line-1599">  }</span>
-<span class="source-line-no">1600</span><span id="line-1600">}</span>
+<span class="source-line-no">1416</span><span id="line-1416">   * Called before a {@link WALEdit} replayed for this region.</span>
+<span class="source-line-no">1417</span><span id="line-1417">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1418</span><span id="line-1418">   */</span>
+<span class="source-line-no">1419</span><span id="line-1419">  default void preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1420</span><span id="line-1420">    RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {</span>
+<span class="source-line-no">1421</span><span id="line-1421">  }</span>
+<span class="source-line-no">1422</span><span id="line-1422"></span>
+<span class="source-line-no">1423</span><span id="line-1423">  /**</span>
+<span class="source-line-no">1424</span><span id="line-1424">   * Called after a {@link WALEdit} replayed for this region.</span>
+<span class="source-line-no">1425</span><span id="line-1425">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1426</span><span id="line-1426">   */</span>
+<span class="source-line-no">1427</span><span id="line-1427">  default void postWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1428</span><span id="line-1428">    RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {</span>
+<span class="source-line-no">1429</span><span id="line-1429">  }</span>
+<span class="source-line-no">1430</span><span id="line-1430"></span>
+<span class="source-line-no">1431</span><span id="line-1431">  /**</span>
+<span class="source-line-no">1432</span><span id="line-1432">   * Called before bulkLoadHFile. Users can create a StoreFile instance to access the contents of a</span>
+<span class="source-line-no">1433</span><span id="line-1433">   * HFile.</span>
+<span class="source-line-no">1434</span><span id="line-1434">   * @param ctx         the environment provided by the region server</span>
+<span class="source-line-no">1435</span><span id="line-1435">   * @param familyPaths pairs of { CF, HFile path } submitted for bulk load. Adding or removing from</span>
+<span class="source-line-no">1436</span><span id="line-1436">   *                    this list will add or remove HFiles to be bulk loaded.</span>
+<span class="source-line-no">1437</span><span id="line-1437">   */</span>
+<span class="source-line-no">1438</span><span id="line-1438">  default void preBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1439</span><span id="line-1439">    List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {</span>
+<span class="source-line-no">1440</span><span id="line-1440">  }</span>
+<span class="source-line-no">1441</span><span id="line-1441"></span>
+<span class="source-line-no">1442</span><span id="line-1442">  /**</span>
+<span class="source-line-no">1443</span><span id="line-1443">   * Called before moving bulk loaded hfile to region directory.</span>
+<span class="source-line-no">1444</span><span id="line-1444">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1445</span><span id="line-1445">   * @param family column family</span>
+<span class="source-line-no">1446</span><span id="line-1446">   * @param pairs  List of pairs of { HFile location in staging dir, HFile path in region dir } Each</span>
+<span class="source-line-no">1447</span><span id="line-1447">   *               pair are for the same hfile.</span>
+<span class="source-line-no">1448</span><span id="line-1448">   */</span>
+<span class="source-line-no">1449</span><span id="line-1449">  default void preCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1450</span><span id="line-1450">    byte[] family, List&lt;Pair&lt;Path, Path&gt;&gt; pairs) throws IOException {</span>
+<span class="source-line-no">1451</span><span id="line-1451">  }</span>
+<span class="source-line-no">1452</span><span id="line-1452"></span>
+<span class="source-line-no">1453</span><span id="line-1453">  /**</span>
+<span class="source-line-no">1454</span><span id="line-1454">   * Called after moving bulk loaded hfile to region directory.</span>
+<span class="source-line-no">1455</span><span id="line-1455">   * @param ctx     the environment provided by the region server</span>
+<span class="source-line-no">1456</span><span id="line-1456">   * @param family  column family</span>
+<span class="source-line-no">1457</span><span id="line-1457">   * @param srcPath Path to file before the move</span>
+<span class="source-line-no">1458</span><span id="line-1458">   * @param dstPath Path to file after the move</span>
+<span class="source-line-no">1459</span><span id="line-1459">   */</span>
+<span class="source-line-no">1460</span><span id="line-1460">  default void postCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1461</span><span id="line-1461">    byte[] family, Path srcPath, Path dstPath) throws IOException {</span>
+<span class="source-line-no">1462</span><span id="line-1462">  }</span>
+<span class="source-line-no">1463</span><span id="line-1463"></span>
+<span class="source-line-no">1464</span><span id="line-1464">  /**</span>
+<span class="source-line-no">1465</span><span id="line-1465">   * Called after bulkLoadHFile.</span>
+<span class="source-line-no">1466</span><span id="line-1466">   * @param ctx                the environment provided by the region server</span>
+<span class="source-line-no">1467</span><span id="line-1467">   * @param stagingFamilyPaths pairs of { CF, HFile path } submitted for bulk load</span>
+<span class="source-line-no">1468</span><span id="line-1468">   * @param finalPaths         Map of CF to List of file paths for the loaded files if the Map is</span>
+<span class="source-line-no">1469</span><span id="line-1469">   *                           not null, the bulkLoad was successful. Otherwise the bulk load</span>
+<span class="source-line-no">1470</span><span id="line-1470">   *                           failed. bulkload is done by the time this hook is called.</span>
+<span class="source-line-no">1471</span><span id="line-1471">   */</span>
+<span class="source-line-no">1472</span><span id="line-1472">  default void postBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1473</span><span id="line-1473">    List&lt;Pair&lt;byte[], String&gt;&gt; stagingFamilyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; finalPaths)</span>
+<span class="source-line-no">1474</span><span id="line-1474">    throws IOException {</span>
+<span class="source-line-no">1475</span><span id="line-1475">  }</span>
+<span class="source-line-no">1476</span><span id="line-1476"></span>
+<span class="source-line-no">1477</span><span id="line-1477">  /**</span>
+<span class="source-line-no">1478</span><span id="line-1478">   * Called before creation of Reader for a store file. Calling</span>
+<span class="source-line-no">1479</span><span id="line-1479">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
+<span class="source-line-no">1480</span><span id="line-1480">   * hook.</span>
+<span class="source-line-no">1481</span><span id="line-1481">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1482</span><span id="line-1482">   * @param fs     fileystem to read from</span>
+<span class="source-line-no">1483</span><span id="line-1483">   * @param p      path to the file</span>
+<span class="source-line-no">1484</span><span id="line-1484">   * @param in     {@link FSDataInputStreamWrapper}</span>
+<span class="source-line-no">1485</span><span id="line-1485">   * @param size   Full size of the file</span>
+<span class="source-line-no">1486</span><span id="line-1486">   * @param r      original reference file. This will be not null only when reading a split file.</span>
+<span class="source-line-no">1487</span><span id="line-1487">   * @param reader the base reader, if not {@code null}, from previous RegionObserver in the chain</span>
+<span class="source-line-no">1488</span><span id="line-1488">   * @return a Reader instance to use instead of the base reader if overriding default behavior,</span>
+<span class="source-line-no">1489</span><span id="line-1489">   *         null otherwise</span>
+<span class="source-line-no">1490</span><span id="line-1490">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
+<span class="source-line-no">1491</span><span id="line-1491">   */</span>
+<span class="source-line-no">1492</span><span id="line-1492">  @Deprecated</span>
+<span class="source-line-no">1493</span><span id="line-1493">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
+<span class="source-line-no">1494</span><span id="line-1494">  // This is fine as the hook is deprecated any way.</span>
+<span class="source-line-no">1495</span><span id="line-1495">  default StoreFileReader preStoreFileReaderOpen(</span>
+<span class="source-line-no">1496</span><span id="line-1496">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
+<span class="source-line-no">1497</span><span id="line-1497">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
+<span class="source-line-no">1498</span><span id="line-1498">    StoreFileReader reader) throws IOException {</span>
+<span class="source-line-no">1499</span><span id="line-1499">    return reader;</span>
+<span class="source-line-no">1500</span><span id="line-1500">  }</span>
+<span class="source-line-no">1501</span><span id="line-1501"></span>
+<span class="source-line-no">1502</span><span id="line-1502">  /**</span>
+<span class="source-line-no">1503</span><span id="line-1503">   * Called after the creation of Reader for a store file.</span>
+<span class="source-line-no">1504</span><span id="line-1504">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1505</span><span id="line-1505">   * @param fs     fileystem to read from</span>
+<span class="source-line-no">1506</span><span id="line-1506">   * @param p      path to the file</span>
+<span class="source-line-no">1507</span><span id="line-1507">   * @param in     {@link FSDataInputStreamWrapper}</span>
+<span class="source-line-no">1508</span><span id="line-1508">   * @param size   Full size of the file</span>
+<span class="source-line-no">1509</span><span id="line-1509">   * @param r      original reference file. This will be not null only when reading a split file.</span>
+<span class="source-line-no">1510</span><span id="line-1510">   * @param reader the base reader instance</span>
+<span class="source-line-no">1511</span><span id="line-1511">   * @return The reader to use</span>
+<span class="source-line-no">1512</span><span id="line-1512">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
+<span class="source-line-no">1513</span><span id="line-1513">   */</span>
+<span class="source-line-no">1514</span><span id="line-1514">  @Deprecated</span>
+<span class="source-line-no">1515</span><span id="line-1515">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
+<span class="source-line-no">1516</span><span id="line-1516">  // This is fine as the hook is deprecated any way.</span>
+<span class="source-line-no">1517</span><span id="line-1517">  default StoreFileReader postStoreFileReaderOpen(</span>
+<span class="source-line-no">1518</span><span id="line-1518">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
+<span class="source-line-no">1519</span><span id="line-1519">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
+<span class="source-line-no">1520</span><span id="line-1520">    StoreFileReader reader) throws IOException {</span>
+<span class="source-line-no">1521</span><span id="line-1521">    return reader;</span>
+<span class="source-line-no">1522</span><span id="line-1522">  }</span>
+<span class="source-line-no">1523</span><span id="line-1523"></span>
+<span class="source-line-no">1524</span><span id="line-1524">  /**</span>
+<span class="source-line-no">1525</span><span id="line-1525">   * Called after a new cell has been created during an increment operation, but before it is</span>
+<span class="source-line-no">1526</span><span id="line-1526">   * committed to the WAL or memstore. Calling</span>
+<span class="source-line-no">1527</span><span id="line-1527">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
+<span class="source-line-no">1528</span><span id="line-1528">   * hook.</span>
+<span class="source-line-no">1529</span><span id="line-1529">   * @param ctx      the environment provided by the region server</span>
+<span class="source-line-no">1530</span><span id="line-1530">   * @param opType   the operation type</span>
+<span class="source-line-no">1531</span><span id="line-1531">   * @param mutation the current mutation</span>
+<span class="source-line-no">1532</span><span id="line-1532">   * @param oldCell  old cell containing previous value</span>
+<span class="source-line-no">1533</span><span id="line-1533">   * @param newCell  the new cell containing the computed value</span>
+<span class="source-line-no">1534</span><span id="line-1534">   * @return the new cell, possibly changed</span>
+<span class="source-line-no">1535</span><span id="line-1535">   * @deprecated since 2.2.0 and will be removedin 4.0.0. Use</span>
+<span class="source-line-no">1536</span><span id="line-1536">   *             {@link #postIncrementBeforeWAL(ObserverContext, Mutation, List)} or</span>
+<span class="source-line-no">1537</span><span id="line-1537">   *             {@link #postAppendBeforeWAL(ObserverContext, Mutation, List)} instead.</span>
+<span class="source-line-no">1538</span><span id="line-1538">   * @see #postIncrementBeforeWAL(ObserverContext, Mutation, List)</span>
+<span class="source-line-no">1539</span><span id="line-1539">   * @see #postAppendBeforeWAL(ObserverContext, Mutation, List)</span>
+<span class="source-line-no">1540</span><span id="line-1540">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21643"&gt;HBASE-21643&lt;/a&gt;</span>
+<span class="source-line-no">1541</span><span id="line-1541">   */</span>
+<span class="source-line-no">1542</span><span id="line-1542">  @Deprecated</span>
+<span class="source-line-no">1543</span><span id="line-1543">  default Cell postMutationBeforeWAL(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1544</span><span id="line-1544">    MutationType opType, Mutation mutation, Cell oldCell, Cell newCell) throws IOException {</span>
+<span class="source-line-no">1545</span><span id="line-1545">    return newCell;</span>
+<span class="source-line-no">1546</span><span id="line-1546">  }</span>
+<span class="source-line-no">1547</span><span id="line-1547"></span>
+<span class="source-line-no">1548</span><span id="line-1548">  /**</span>
+<span class="source-line-no">1549</span><span id="line-1549">   * Called after a list of new cells has been created during an increment operation, but before</span>
+<span class="source-line-no">1550</span><span id="line-1550">   * they are committed to the WAL or memstore.</span>
+<span class="source-line-no">1551</span><span id="line-1551">   * @param ctx       the environment provided by the region server</span>
+<span class="source-line-no">1552</span><span id="line-1552">   * @param mutation  the current mutation</span>
+<span class="source-line-no">1553</span><span id="line-1553">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
+<span class="source-line-no">1554</span><span id="line-1554">   *                  second cell is the new cell.</span>
+<span class="source-line-no">1555</span><span id="line-1555">   * @return a list of cell pair, possibly changed.</span>
+<span class="source-line-no">1556</span><span id="line-1556">   */</span>
+<span class="source-line-no">1557</span><span id="line-1557">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postIncrementBeforeWAL(</span>
+<span class="source-line-no">1558</span><span id="line-1558">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
+<span class="source-line-no">1559</span><span id="line-1559">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
+<span class="source-line-no">1560</span><span id="line-1560">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
+<span class="source-line-no">1561</span><span id="line-1561">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
+<span class="source-line-no">1562</span><span id="line-1562">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.INCREMENT,</span>
+<span class="source-line-no">1563</span><span id="line-1563">        mutation, pair.getFirst(), pair.getSecond())));</span>
+<span class="source-line-no">1564</span><span id="line-1564">    }</span>
+<span class="source-line-no">1565</span><span id="line-1565">    return resultPairs;</span>
+<span class="source-line-no">1566</span><span id="line-1566">  }</span>
+<span class="source-line-no">1567</span><span id="line-1567"></span>
+<span class="source-line-no">1568</span><span id="line-1568">  /**</span>
+<span class="source-line-no">1569</span><span id="line-1569">   * Called after a list of new cells has been created during an append operation, but before they</span>
+<span class="source-line-no">1570</span><span id="line-1570">   * are committed to the WAL or memstore.</span>
+<span class="source-line-no">1571</span><span id="line-1571">   * @param ctx       the environment provided by the region server</span>
+<span class="source-line-no">1572</span><span id="line-1572">   * @param mutation  the current mutation</span>
+<span class="source-line-no">1573</span><span id="line-1573">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
+<span class="source-line-no">1574</span><span id="line-1574">   *                  second cell is the new cell.</span>
+<span class="source-line-no">1575</span><span id="line-1575">   * @return a list of cell pair, possibly changed.</span>
+<span class="source-line-no">1576</span><span id="line-1576">   */</span>
+<span class="source-line-no">1577</span><span id="line-1577">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postAppendBeforeWAL(</span>
+<span class="source-line-no">1578</span><span id="line-1578">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
+<span class="source-line-no">1579</span><span id="line-1579">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
+<span class="source-line-no">1580</span><span id="line-1580">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
+<span class="source-line-no">1581</span><span id="line-1581">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
+<span class="source-line-no">1582</span><span id="line-1582">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.APPEND,</span>
+<span class="source-line-no">1583</span><span id="line-1583">        mutation, pair.getFirst(), pair.getSecond())));</span>
+<span class="source-line-no">1584</span><span id="line-1584">    }</span>
+<span class="source-line-no">1585</span><span id="line-1585">    return resultPairs;</span>
+<span class="source-line-no">1586</span><span id="line-1586">  }</span>
+<span class="source-line-no">1587</span><span id="line-1587"></span>
+<span class="source-line-no">1588</span><span id="line-1588">  /**</span>
+<span class="source-line-no">1589</span><span id="line-1589">   * Called after the ScanQueryMatcher creates ScanDeleteTracker. Implementing this hook would help</span>
+<span class="source-line-no">1590</span><span id="line-1590">   * in creating customised DeleteTracker and returning the newly created DeleteTracker</span>
+<span class="source-line-no">1591</span><span id="line-1591">   * &lt;p&gt;</span>
+<span class="source-line-no">1592</span><span id="line-1592">   * Warn: This is used by internal coprocessors. Should not be implemented by user coprocessors</span>
+<span class="source-line-no">1593</span><span id="line-1593">   * @param ctx        the environment provided by the region server</span>
+<span class="source-line-no">1594</span><span id="line-1594">   * @param delTracker the deleteTracker that is created by the QueryMatcher</span>
+<span class="source-line-no">1595</span><span id="line-1595">   * @return the Delete Tracker</span>
+<span class="source-line-no">1596</span><span id="line-1596">   * @deprecated Since 2.0.0, will be removed in 4.0.0. Visibility label feature still use this</span>
+<span class="source-line-no">1597</span><span id="line-1597">   *             method, so it can not be removed in 3.0.0</span>
+<span class="source-line-no">1598</span><span id="line-1598">   */</span>
+<span class="source-line-no">1599</span><span id="line-1599">  @Deprecated</span>
+<span class="source-line-no">1600</span><span id="line-1600">  default DeleteTracker postInstantiateDeleteTracker(</span>
+<span class="source-line-no">1601</span><span id="line-1601">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, DeleteTracker delTracker)</span>
+<span class="source-line-no">1602</span><span id="line-1602">    throws IOException {</span>
+<span class="source-line-no">1603</span><span id="line-1603">    return delTracker;</span>
+<span class="source-line-no">1604</span><span id="line-1604">  }</span>
+<span class="source-line-no">1605</span><span id="line-1605"></span>
+<span class="source-line-no">1606</span><span id="line-1606">  /**</span>
+<span class="source-line-no">1607</span><span id="line-1607">   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows</span>
+<span class="source-line-no">1608</span><span id="line-1608">   * coprocessors to add extended attributes to the WALKey that then get persisted to the WAL, and</span>
+<span class="source-line-no">1609</span><span id="line-1609">   * are available to replication endpoints to use in processing WAL Entries.</span>
+<span class="source-line-no">1610</span><span id="line-1610">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1611</span><span id="line-1611">   * @param key the WALKey associated with a particular append to a WAL</span>
+<span class="source-line-no">1612</span><span id="line-1612">   */</span>
+<span class="source-line-no">1613</span><span id="line-1613">  default void preWALAppend(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, WALKey key,</span>
+<span class="source-line-no">1614</span><span id="line-1614">    WALEdit edit) throws IOException {</span>
+<span class="source-line-no">1615</span><span id="line-1615">  }</span>
+<span class="source-line-no">1616</span><span id="line-1616">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html b/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
index abb79d8e291..f6cb867940b 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
@@ -1426,191 +1426,207 @@
 <span class="source-line-no">1413</span><span id="line-1413">  }</span>
 <span class="source-line-no">1414</span><span id="line-1414"></span>
 <span class="source-line-no">1415</span><span id="line-1415">  /**</span>
-<span class="source-line-no">1416</span><span id="line-1416">   * Called before bulkLoadHFile. Users can create a StoreFile instance to access the contents of a</span>
-<span class="source-line-no">1417</span><span id="line-1417">   * HFile.</span>
-<span class="source-line-no">1418</span><span id="line-1418">   * @param ctx         the environment provided by the region server</span>
-<span class="source-line-no">1419</span><span id="line-1419">   * @param familyPaths pairs of { CF, HFile path } submitted for bulk load. Adding or removing from</span>
-<span class="source-line-no">1420</span><span id="line-1420">   *                    this list will add or remove HFiles to be bulk loaded.</span>
-<span class="source-line-no">1421</span><span id="line-1421">   */</span>
-<span class="source-line-no">1422</span><span id="line-1422">  default void preBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1423</span><span id="line-1423">    List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {</span>
-<span class="source-line-no">1424</span><span id="line-1424">  }</span>
-<span class="source-line-no">1425</span><span id="line-1425"></span>
-<span class="source-line-no">1426</span><span id="line-1426">  /**</span>
-<span class="source-line-no">1427</span><span id="line-1427">   * Called before moving bulk loaded hfile to region directory.</span>
-<span class="source-line-no">1428</span><span id="line-1428">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1429</span><span id="line-1429">   * @param family column family</span>
-<span class="source-line-no">1430</span><span id="line-1430">   * @param pairs  List of pairs of { HFile location in staging dir, HFile path in region dir } Each</span>
-<span class="source-line-no">1431</span><span id="line-1431">   *               pair are for the same hfile.</span>
-<span class="source-line-no">1432</span><span id="line-1432">   */</span>
-<span class="source-line-no">1433</span><span id="line-1433">  default void preCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1434</span><span id="line-1434">    byte[] family, List&lt;Pair&lt;Path, Path&gt;&gt; pairs) throws IOException {</span>
-<span class="source-line-no">1435</span><span id="line-1435">  }</span>
-<span class="source-line-no">1436</span><span id="line-1436"></span>
-<span class="source-line-no">1437</span><span id="line-1437">  /**</span>
-<span class="source-line-no">1438</span><span id="line-1438">   * Called after moving bulk loaded hfile to region directory.</span>
-<span class="source-line-no">1439</span><span id="line-1439">   * @param ctx     the environment provided by the region server</span>
-<span class="source-line-no">1440</span><span id="line-1440">   * @param family  column family</span>
-<span class="source-line-no">1441</span><span id="line-1441">   * @param srcPath Path to file before the move</span>
-<span class="source-line-no">1442</span><span id="line-1442">   * @param dstPath Path to file after the move</span>
-<span class="source-line-no">1443</span><span id="line-1443">   */</span>
-<span class="source-line-no">1444</span><span id="line-1444">  default void postCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1445</span><span id="line-1445">    byte[] family, Path srcPath, Path dstPath) throws IOException {</span>
-<span class="source-line-no">1446</span><span id="line-1446">  }</span>
-<span class="source-line-no">1447</span><span id="line-1447"></span>
-<span class="source-line-no">1448</span><span id="line-1448">  /**</span>
-<span class="source-line-no">1449</span><span id="line-1449">   * Called after bulkLoadHFile.</span>
-<span class="source-line-no">1450</span><span id="line-1450">   * @param ctx                the environment provided by the region server</span>
-<span class="source-line-no">1451</span><span id="line-1451">   * @param stagingFamilyPaths pairs of { CF, HFile path } submitted for bulk load</span>
-<span class="source-line-no">1452</span><span id="line-1452">   * @param finalPaths         Map of CF to List of file paths for the loaded files if the Map is</span>
-<span class="source-line-no">1453</span><span id="line-1453">   *                           not null, the bulkLoad was successful. Otherwise the bulk load</span>
-<span class="source-line-no">1454</span><span id="line-1454">   *                           failed. bulkload is done by the time this hook is called.</span>
-<span class="source-line-no">1455</span><span id="line-1455">   */</span>
-<span class="source-line-no">1456</span><span id="line-1456">  default void postBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1457</span><span id="line-1457">    List&lt;Pair&lt;byte[], String&gt;&gt; stagingFamilyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; finalPaths)</span>
-<span class="source-line-no">1458</span><span id="line-1458">    throws IOException {</span>
-<span class="source-line-no">1459</span><span id="line-1459">  }</span>
-<span class="source-line-no">1460</span><span id="line-1460"></span>
-<span class="source-line-no">1461</span><span id="line-1461">  /**</span>
-<span class="source-line-no">1462</span><span id="line-1462">   * Called before creation of Reader for a store file. Calling</span>
-<span class="source-line-no">1463</span><span id="line-1463">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
-<span class="source-line-no">1464</span><span id="line-1464">   * hook.</span>
-<span class="source-line-no">1465</span><span id="line-1465">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1466</span><span id="line-1466">   * @param fs     fileystem to read from</span>
-<span class="source-line-no">1467</span><span id="line-1467">   * @param p      path to the file</span>
-<span class="source-line-no">1468</span><span id="line-1468">   * @param in     {@link FSDataInputStreamWrapper}</span>
-<span class="source-line-no">1469</span><span id="line-1469">   * @param size   Full size of the file</span>
-<span class="source-line-no">1470</span><span id="line-1470">   * @param r      original reference file. This will be not null only when reading a split file.</span>
-<span class="source-line-no">1471</span><span id="line-1471">   * @param reader the base reader, if not {@code null}, from previous RegionObserver in the chain</span>
-<span class="source-line-no">1472</span><span id="line-1472">   * @return a Reader instance to use instead of the base reader if overriding default behavior,</span>
-<span class="source-line-no">1473</span><span id="line-1473">   *         null otherwise</span>
-<span class="source-line-no">1474</span><span id="line-1474">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
-<span class="source-line-no">1475</span><span id="line-1475">   */</span>
-<span class="source-line-no">1476</span><span id="line-1476">  @Deprecated</span>
-<span class="source-line-no">1477</span><span id="line-1477">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
-<span class="source-line-no">1478</span><span id="line-1478">  // This is fine as the hook is deprecated any way.</span>
-<span class="source-line-no">1479</span><span id="line-1479">  default StoreFileReader preStoreFileReaderOpen(</span>
-<span class="source-line-no">1480</span><span id="line-1480">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
-<span class="source-line-no">1481</span><span id="line-1481">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
-<span class="source-line-no">1482</span><span id="line-1482">    StoreFileReader reader) throws IOException {</span>
-<span class="source-line-no">1483</span><span id="line-1483">    return reader;</span>
-<span class="source-line-no">1484</span><span id="line-1484">  }</span>
-<span class="source-line-no">1485</span><span id="line-1485"></span>
-<span class="source-line-no">1486</span><span id="line-1486">  /**</span>
-<span class="source-line-no">1487</span><span id="line-1487">   * Called after the creation of Reader for a store file.</span>
-<span class="source-line-no">1488</span><span id="line-1488">   * @param ctx    the environment provided by the region server</span>
-<span class="source-line-no">1489</span><span id="line-1489">   * @param fs     fileystem to read from</span>
-<span class="source-line-no">1490</span><span id="line-1490">   * @param p      path to the file</span>
-<span class="source-line-no">1491</span><span id="line-1491">   * @param in     {@link FSDataInputStreamWrapper}</span>
-<span class="source-line-no">1492</span><span id="line-1492">   * @param size   Full size of the file</span>
-<span class="source-line-no">1493</span><span id="line-1493">   * @param r      original reference file. This will be not null only when reading a split file.</span>
-<span class="source-line-no">1494</span><span id="line-1494">   * @param reader the base reader instance</span>
-<span class="source-line-no">1495</span><span id="line-1495">   * @return The reader to use</span>
-<span class="source-line-no">1496</span><span id="line-1496">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
-<span class="source-line-no">1497</span><span id="line-1497">   */</span>
-<span class="source-line-no">1498</span><span id="line-1498">  @Deprecated</span>
-<span class="source-line-no">1499</span><span id="line-1499">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
-<span class="source-line-no">1500</span><span id="line-1500">  // This is fine as the hook is deprecated any way.</span>
-<span class="source-line-no">1501</span><span id="line-1501">  default StoreFileReader postStoreFileReaderOpen(</span>
-<span class="source-line-no">1502</span><span id="line-1502">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
-<span class="source-line-no">1503</span><span id="line-1503">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
-<span class="source-line-no">1504</span><span id="line-1504">    StoreFileReader reader) throws IOException {</span>
-<span class="source-line-no">1505</span><span id="line-1505">    return reader;</span>
-<span class="source-line-no">1506</span><span id="line-1506">  }</span>
-<span class="source-line-no">1507</span><span id="line-1507"></span>
-<span class="source-line-no">1508</span><span id="line-1508">  /**</span>
-<span class="source-line-no">1509</span><span id="line-1509">   * Called after a new cell has been created during an increment operation, but before it is</span>
-<span class="source-line-no">1510</span><span id="line-1510">   * committed to the WAL or memstore. Calling</span>
-<span class="source-line-no">1511</span><span id="line-1511">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
-<span class="source-line-no">1512</span><span id="line-1512">   * hook.</span>
-<span class="source-line-no">1513</span><span id="line-1513">   * @param ctx      the environment provided by the region server</span>
-<span class="source-line-no">1514</span><span id="line-1514">   * @param opType   the operation type</span>
-<span class="source-line-no">1515</span><span id="line-1515">   * @param mutation the current mutation</span>
-<span class="source-line-no">1516</span><span id="line-1516">   * @param oldCell  old cell containing previous value</span>
-<span class="source-line-no">1517</span><span id="line-1517">   * @param newCell  the new cell containing the computed value</span>
-<span class="source-line-no">1518</span><span id="line-1518">   * @return the new cell, possibly changed</span>
-<span class="source-line-no">1519</span><span id="line-1519">   * @deprecated since 2.2.0 and will be removedin 4.0.0. Use</span>
-<span class="source-line-no">1520</span><span id="line-1520">   *             {@link #postIncrementBeforeWAL(ObserverContext, Mutation, List)} or</span>
-<span class="source-line-no">1521</span><span id="line-1521">   *             {@link #postAppendBeforeWAL(ObserverContext, Mutation, List)} instead.</span>
-<span class="source-line-no">1522</span><span id="line-1522">   * @see #postIncrementBeforeWAL(ObserverContext, Mutation, List)</span>
-<span class="source-line-no">1523</span><span id="line-1523">   * @see #postAppendBeforeWAL(ObserverContext, Mutation, List)</span>
-<span class="source-line-no">1524</span><span id="line-1524">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21643"&gt;HBASE-21643&lt;/a&gt;</span>
-<span class="source-line-no">1525</span><span id="line-1525">   */</span>
-<span class="source-line-no">1526</span><span id="line-1526">  @Deprecated</span>
-<span class="source-line-no">1527</span><span id="line-1527">  default Cell postMutationBeforeWAL(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
-<span class="source-line-no">1528</span><span id="line-1528">    MutationType opType, Mutation mutation, Cell oldCell, Cell newCell) throws IOException {</span>
-<span class="source-line-no">1529</span><span id="line-1529">    return newCell;</span>
-<span class="source-line-no">1530</span><span id="line-1530">  }</span>
-<span class="source-line-no">1531</span><span id="line-1531"></span>
-<span class="source-line-no">1532</span><span id="line-1532">  /**</span>
-<span class="source-line-no">1533</span><span id="line-1533">   * Called after a list of new cells has been created during an increment operation, but before</span>
-<span class="source-line-no">1534</span><span id="line-1534">   * they are committed to the WAL or memstore.</span>
-<span class="source-line-no">1535</span><span id="line-1535">   * @param ctx       the environment provided by the region server</span>
-<span class="source-line-no">1536</span><span id="line-1536">   * @param mutation  the current mutation</span>
-<span class="source-line-no">1537</span><span id="line-1537">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
-<span class="source-line-no">1538</span><span id="line-1538">   *                  second cell is the new cell.</span>
-<span class="source-line-no">1539</span><span id="line-1539">   * @return a list of cell pair, possibly changed.</span>
-<span class="source-line-no">1540</span><span id="line-1540">   */</span>
-<span class="source-line-no">1541</span><span id="line-1541">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postIncrementBeforeWAL(</span>
-<span class="source-line-no">1542</span><span id="line-1542">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
-<span class="source-line-no">1543</span><span id="line-1543">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
-<span class="source-line-no">1544</span><span id="line-1544">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
-<span class="source-line-no">1545</span><span id="line-1545">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
-<span class="source-line-no">1546</span><span id="line-1546">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.INCREMENT,</span>
-<span class="source-line-no">1547</span><span id="line-1547">        mutation, pair.getFirst(), pair.getSecond())));</span>
-<span class="source-line-no">1548</span><span id="line-1548">    }</span>
-<span class="source-line-no">1549</span><span id="line-1549">    return resultPairs;</span>
-<span class="source-line-no">1550</span><span id="line-1550">  }</span>
-<span class="source-line-no">1551</span><span id="line-1551"></span>
-<span class="source-line-no">1552</span><span id="line-1552">  /**</span>
-<span class="source-line-no">1553</span><span id="line-1553">   * Called after a list of new cells has been created during an append operation, but before they</span>
-<span class="source-line-no">1554</span><span id="line-1554">   * are committed to the WAL or memstore.</span>
-<span class="source-line-no">1555</span><span id="line-1555">   * @param ctx       the environment provided by the region server</span>
-<span class="source-line-no">1556</span><span id="line-1556">   * @param mutation  the current mutation</span>
-<span class="source-line-no">1557</span><span id="line-1557">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
-<span class="source-line-no">1558</span><span id="line-1558">   *                  second cell is the new cell.</span>
-<span class="source-line-no">1559</span><span id="line-1559">   * @return a list of cell pair, possibly changed.</span>
-<span class="source-line-no">1560</span><span id="line-1560">   */</span>
-<span class="source-line-no">1561</span><span id="line-1561">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postAppendBeforeWAL(</span>
-<span class="source-line-no">1562</span><span id="line-1562">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
-<span class="source-line-no">1563</span><span id="line-1563">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
-<span class="source-line-no">1564</span><span id="line-1564">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
-<span class="source-line-no">1565</span><span id="line-1565">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
-<span class="source-line-no">1566</span><span id="line-1566">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.APPEND,</span>
-<span class="source-line-no">1567</span><span id="line-1567">        mutation, pair.getFirst(), pair.getSecond())));</span>
-<span class="source-line-no">1568</span><span id="line-1568">    }</span>
-<span class="source-line-no">1569</span><span id="line-1569">    return resultPairs;</span>
-<span class="source-line-no">1570</span><span id="line-1570">  }</span>
-<span class="source-line-no">1571</span><span id="line-1571"></span>
-<span class="source-line-no">1572</span><span id="line-1572">  /**</span>
-<span class="source-line-no">1573</span><span id="line-1573">   * Called after the ScanQueryMatcher creates ScanDeleteTracker. Implementing this hook would help</span>
-<span class="source-line-no">1574</span><span id="line-1574">   * in creating customised DeleteTracker and returning the newly created DeleteTracker</span>
-<span class="source-line-no">1575</span><span id="line-1575">   * &lt;p&gt;</span>
-<span class="source-line-no">1576</span><span id="line-1576">   * Warn: This is used by internal coprocessors. Should not be implemented by user coprocessors</span>
-<span class="source-line-no">1577</span><span id="line-1577">   * @param ctx        the environment provided by the region server</span>
-<span class="source-line-no">1578</span><span id="line-1578">   * @param delTracker the deleteTracker that is created by the QueryMatcher</span>
-<span class="source-line-no">1579</span><span id="line-1579">   * @return the Delete Tracker</span>
-<span class="source-line-no">1580</span><span id="line-1580">   * @deprecated Since 2.0.0, will be removed in 4.0.0. Visibility label feature still use this</span>
-<span class="source-line-no">1581</span><span id="line-1581">   *             method, so it can not be removed in 3.0.0</span>
-<span class="source-line-no">1582</span><span id="line-1582">   */</span>
-<span class="source-line-no">1583</span><span id="line-1583">  @Deprecated</span>
-<span class="source-line-no">1584</span><span id="line-1584">  default DeleteTracker postInstantiateDeleteTracker(</span>
-<span class="source-line-no">1585</span><span id="line-1585">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, DeleteTracker delTracker)</span>
-<span class="source-line-no">1586</span><span id="line-1586">    throws IOException {</span>
-<span class="source-line-no">1587</span><span id="line-1587">    return delTracker;</span>
-<span class="source-line-no">1588</span><span id="line-1588">  }</span>
-<span class="source-line-no">1589</span><span id="line-1589"></span>
-<span class="source-line-no">1590</span><span id="line-1590">  /**</span>
-<span class="source-line-no">1591</span><span id="line-1591">   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows</span>
-<span class="source-line-no">1592</span><span id="line-1592">   * coprocessors to add extended attributes to the WALKey that then get persisted to the WAL, and</span>
-<span class="source-line-no">1593</span><span id="line-1593">   * are available to replication endpoints to use in processing WAL Entries.</span>
-<span class="source-line-no">1594</span><span id="line-1594">   * @param ctx the environment provided by the region server</span>
-<span class="source-line-no">1595</span><span id="line-1595">   * @param key the WALKey associated with a particular append to a WAL</span>
-<span class="source-line-no">1596</span><span id="line-1596">   */</span>
-<span class="source-line-no">1597</span><span id="line-1597">  default void preWALAppend(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, WALKey key,</span>
-<span class="source-line-no">1598</span><span id="line-1598">    WALEdit edit) throws IOException {</span>
-<span class="source-line-no">1599</span><span id="line-1599">  }</span>
-<span class="source-line-no">1600</span><span id="line-1600">}</span>
+<span class="source-line-no">1416</span><span id="line-1416">   * Called before a {@link WALEdit} replayed for this region.</span>
+<span class="source-line-no">1417</span><span id="line-1417">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1418</span><span id="line-1418">   */</span>
+<span class="source-line-no">1419</span><span id="line-1419">  default void preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1420</span><span id="line-1420">    RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {</span>
+<span class="source-line-no">1421</span><span id="line-1421">  }</span>
+<span class="source-line-no">1422</span><span id="line-1422"></span>
+<span class="source-line-no">1423</span><span id="line-1423">  /**</span>
+<span class="source-line-no">1424</span><span id="line-1424">   * Called after a {@link WALEdit} replayed for this region.</span>
+<span class="source-line-no">1425</span><span id="line-1425">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1426</span><span id="line-1426">   */</span>
+<span class="source-line-no">1427</span><span id="line-1427">  default void postWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1428</span><span id="line-1428">    RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {</span>
+<span class="source-line-no">1429</span><span id="line-1429">  }</span>
+<span class="source-line-no">1430</span><span id="line-1430"></span>
+<span class="source-line-no">1431</span><span id="line-1431">  /**</span>
+<span class="source-line-no">1432</span><span id="line-1432">   * Called before bulkLoadHFile. Users can create a StoreFile instance to access the contents of a</span>
+<span class="source-line-no">1433</span><span id="line-1433">   * HFile.</span>
+<span class="source-line-no">1434</span><span id="line-1434">   * @param ctx         the environment provided by the region server</span>
+<span class="source-line-no">1435</span><span id="line-1435">   * @param familyPaths pairs of { CF, HFile path } submitted for bulk load. Adding or removing from</span>
+<span class="source-line-no">1436</span><span id="line-1436">   *                    this list will add or remove HFiles to be bulk loaded.</span>
+<span class="source-line-no">1437</span><span id="line-1437">   */</span>
+<span class="source-line-no">1438</span><span id="line-1438">  default void preBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1439</span><span id="line-1439">    List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {</span>
+<span class="source-line-no">1440</span><span id="line-1440">  }</span>
+<span class="source-line-no">1441</span><span id="line-1441"></span>
+<span class="source-line-no">1442</span><span id="line-1442">  /**</span>
+<span class="source-line-no">1443</span><span id="line-1443">   * Called before moving bulk loaded hfile to region directory.</span>
+<span class="source-line-no">1444</span><span id="line-1444">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1445</span><span id="line-1445">   * @param family column family</span>
+<span class="source-line-no">1446</span><span id="line-1446">   * @param pairs  List of pairs of { HFile location in staging dir, HFile path in region dir } Each</span>
+<span class="source-line-no">1447</span><span id="line-1447">   *               pair are for the same hfile.</span>
+<span class="source-line-no">1448</span><span id="line-1448">   */</span>
+<span class="source-line-no">1449</span><span id="line-1449">  default void preCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1450</span><span id="line-1450">    byte[] family, List&lt;Pair&lt;Path, Path&gt;&gt; pairs) throws IOException {</span>
+<span class="source-line-no">1451</span><span id="line-1451">  }</span>
+<span class="source-line-no">1452</span><span id="line-1452"></span>
+<span class="source-line-no">1453</span><span id="line-1453">  /**</span>
+<span class="source-line-no">1454</span><span id="line-1454">   * Called after moving bulk loaded hfile to region directory.</span>
+<span class="source-line-no">1455</span><span id="line-1455">   * @param ctx     the environment provided by the region server</span>
+<span class="source-line-no">1456</span><span id="line-1456">   * @param family  column family</span>
+<span class="source-line-no">1457</span><span id="line-1457">   * @param srcPath Path to file before the move</span>
+<span class="source-line-no">1458</span><span id="line-1458">   * @param dstPath Path to file after the move</span>
+<span class="source-line-no">1459</span><span id="line-1459">   */</span>
+<span class="source-line-no">1460</span><span id="line-1460">  default void postCommitStoreFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1461</span><span id="line-1461">    byte[] family, Path srcPath, Path dstPath) throws IOException {</span>
+<span class="source-line-no">1462</span><span id="line-1462">  }</span>
+<span class="source-line-no">1463</span><span id="line-1463"></span>
+<span class="source-line-no">1464</span><span id="line-1464">  /**</span>
+<span class="source-line-no">1465</span><span id="line-1465">   * Called after bulkLoadHFile.</span>
+<span class="source-line-no">1466</span><span id="line-1466">   * @param ctx                the environment provided by the region server</span>
+<span class="source-line-no">1467</span><span id="line-1467">   * @param stagingFamilyPaths pairs of { CF, HFile path } submitted for bulk load</span>
+<span class="source-line-no">1468</span><span id="line-1468">   * @param finalPaths         Map of CF to List of file paths for the loaded files if the Map is</span>
+<span class="source-line-no">1469</span><span id="line-1469">   *                           not null, the bulkLoad was successful. Otherwise the bulk load</span>
+<span class="source-line-no">1470</span><span id="line-1470">   *                           failed. bulkload is done by the time this hook is called.</span>
+<span class="source-line-no">1471</span><span id="line-1471">   */</span>
+<span class="source-line-no">1472</span><span id="line-1472">  default void postBulkLoadHFile(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1473</span><span id="line-1473">    List&lt;Pair&lt;byte[], String&gt;&gt; stagingFamilyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; finalPaths)</span>
+<span class="source-line-no">1474</span><span id="line-1474">    throws IOException {</span>
+<span class="source-line-no">1475</span><span id="line-1475">  }</span>
+<span class="source-line-no">1476</span><span id="line-1476"></span>
+<span class="source-line-no">1477</span><span id="line-1477">  /**</span>
+<span class="source-line-no">1478</span><span id="line-1478">   * Called before creation of Reader for a store file. Calling</span>
+<span class="source-line-no">1479</span><span id="line-1479">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
+<span class="source-line-no">1480</span><span id="line-1480">   * hook.</span>
+<span class="source-line-no">1481</span><span id="line-1481">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1482</span><span id="line-1482">   * @param fs     fileystem to read from</span>
+<span class="source-line-no">1483</span><span id="line-1483">   * @param p      path to the file</span>
+<span class="source-line-no">1484</span><span id="line-1484">   * @param in     {@link FSDataInputStreamWrapper}</span>
+<span class="source-line-no">1485</span><span id="line-1485">   * @param size   Full size of the file</span>
+<span class="source-line-no">1486</span><span id="line-1486">   * @param r      original reference file. This will be not null only when reading a split file.</span>
+<span class="source-line-no">1487</span><span id="line-1487">   * @param reader the base reader, if not {@code null}, from previous RegionObserver in the chain</span>
+<span class="source-line-no">1488</span><span id="line-1488">   * @return a Reader instance to use instead of the base reader if overriding default behavior,</span>
+<span class="source-line-no">1489</span><span id="line-1489">   *         null otherwise</span>
+<span class="source-line-no">1490</span><span id="line-1490">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
+<span class="source-line-no">1491</span><span id="line-1491">   */</span>
+<span class="source-line-no">1492</span><span id="line-1492">  @Deprecated</span>
+<span class="source-line-no">1493</span><span id="line-1493">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
+<span class="source-line-no">1494</span><span id="line-1494">  // This is fine as the hook is deprecated any way.</span>
+<span class="source-line-no">1495</span><span id="line-1495">  default StoreFileReader preStoreFileReaderOpen(</span>
+<span class="source-line-no">1496</span><span id="line-1496">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
+<span class="source-line-no">1497</span><span id="line-1497">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
+<span class="source-line-no">1498</span><span id="line-1498">    StoreFileReader reader) throws IOException {</span>
+<span class="source-line-no">1499</span><span id="line-1499">    return reader;</span>
+<span class="source-line-no">1500</span><span id="line-1500">  }</span>
+<span class="source-line-no">1501</span><span id="line-1501"></span>
+<span class="source-line-no">1502</span><span id="line-1502">  /**</span>
+<span class="source-line-no">1503</span><span id="line-1503">   * Called after the creation of Reader for a store file.</span>
+<span class="source-line-no">1504</span><span id="line-1504">   * @param ctx    the environment provided by the region server</span>
+<span class="source-line-no">1505</span><span id="line-1505">   * @param fs     fileystem to read from</span>
+<span class="source-line-no">1506</span><span id="line-1506">   * @param p      path to the file</span>
+<span class="source-line-no">1507</span><span id="line-1507">   * @param in     {@link FSDataInputStreamWrapper}</span>
+<span class="source-line-no">1508</span><span id="line-1508">   * @param size   Full size of the file</span>
+<span class="source-line-no">1509</span><span id="line-1509">   * @param r      original reference file. This will be not null only when reading a split file.</span>
+<span class="source-line-no">1510</span><span id="line-1510">   * @param reader the base reader instance</span>
+<span class="source-line-no">1511</span><span id="line-1511">   * @return The reader to use</span>
+<span class="source-line-no">1512</span><span id="line-1512">   * @deprecated For Phoenix only, StoreFileReader is not a stable interface.</span>
+<span class="source-line-no">1513</span><span id="line-1513">   */</span>
+<span class="source-line-no">1514</span><span id="line-1514">  @Deprecated</span>
+<span class="source-line-no">1515</span><span id="line-1515">  // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.</span>
+<span class="source-line-no">1516</span><span id="line-1516">  // This is fine as the hook is deprecated any way.</span>
+<span class="source-line-no">1517</span><span id="line-1517">  default StoreFileReader postStoreFileReaderOpen(</span>
+<span class="source-line-no">1518</span><span id="line-1518">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, FileSystem fs, Path p,</span>
+<span class="source-line-no">1519</span><span id="line-1519">    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,</span>
+<span class="source-line-no">1520</span><span id="line-1520">    StoreFileReader reader) throws IOException {</span>
+<span class="source-line-no">1521</span><span id="line-1521">    return reader;</span>
+<span class="source-line-no">1522</span><span id="line-1522">  }</span>
+<span class="source-line-no">1523</span><span id="line-1523"></span>
+<span class="source-line-no">1524</span><span id="line-1524">  /**</span>
+<span class="source-line-no">1525</span><span id="line-1525">   * Called after a new cell has been created during an increment operation, but before it is</span>
+<span class="source-line-no">1526</span><span id="line-1526">   * committed to the WAL or memstore. Calling</span>
+<span class="source-line-no">1527</span><span id="line-1527">   * {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no effect in this</span>
+<span class="source-line-no">1528</span><span id="line-1528">   * hook.</span>
+<span class="source-line-no">1529</span><span id="line-1529">   * @param ctx      the environment provided by the region server</span>
+<span class="source-line-no">1530</span><span id="line-1530">   * @param opType   the operation type</span>
+<span class="source-line-no">1531</span><span id="line-1531">   * @param mutation the current mutation</span>
+<span class="source-line-no">1532</span><span id="line-1532">   * @param oldCell  old cell containing previous value</span>
+<span class="source-line-no">1533</span><span id="line-1533">   * @param newCell  the new cell containing the computed value</span>
+<span class="source-line-no">1534</span><span id="line-1534">   * @return the new cell, possibly changed</span>
+<span class="source-line-no">1535</span><span id="line-1535">   * @deprecated since 2.2.0 and will be removedin 4.0.0. Use</span>
+<span class="source-line-no">1536</span><span id="line-1536">   *             {@link #postIncrementBeforeWAL(ObserverContext, Mutation, List)} or</span>
+<span class="source-line-no">1537</span><span id="line-1537">   *             {@link #postAppendBeforeWAL(ObserverContext, Mutation, List)} instead.</span>
+<span class="source-line-no">1538</span><span id="line-1538">   * @see #postIncrementBeforeWAL(ObserverContext, Mutation, List)</span>
+<span class="source-line-no">1539</span><span id="line-1539">   * @see #postAppendBeforeWAL(ObserverContext, Mutation, List)</span>
+<span class="source-line-no">1540</span><span id="line-1540">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21643"&gt;HBASE-21643&lt;/a&gt;</span>
+<span class="source-line-no">1541</span><span id="line-1541">   */</span>
+<span class="source-line-no">1542</span><span id="line-1542">  @Deprecated</span>
+<span class="source-line-no">1543</span><span id="line-1543">  default Cell postMutationBeforeWAL(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx,</span>
+<span class="source-line-no">1544</span><span id="line-1544">    MutationType opType, Mutation mutation, Cell oldCell, Cell newCell) throws IOException {</span>
+<span class="source-line-no">1545</span><span id="line-1545">    return newCell;</span>
+<span class="source-line-no">1546</span><span id="line-1546">  }</span>
+<span class="source-line-no">1547</span><span id="line-1547"></span>
+<span class="source-line-no">1548</span><span id="line-1548">  /**</span>
+<span class="source-line-no">1549</span><span id="line-1549">   * Called after a list of new cells has been created during an increment operation, but before</span>
+<span class="source-line-no">1550</span><span id="line-1550">   * they are committed to the WAL or memstore.</span>
+<span class="source-line-no">1551</span><span id="line-1551">   * @param ctx       the environment provided by the region server</span>
+<span class="source-line-no">1552</span><span id="line-1552">   * @param mutation  the current mutation</span>
+<span class="source-line-no">1553</span><span id="line-1553">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
+<span class="source-line-no">1554</span><span id="line-1554">   *                  second cell is the new cell.</span>
+<span class="source-line-no">1555</span><span id="line-1555">   * @return a list of cell pair, possibly changed.</span>
+<span class="source-line-no">1556</span><span id="line-1556">   */</span>
+<span class="source-line-no">1557</span><span id="line-1557">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postIncrementBeforeWAL(</span>
+<span class="source-line-no">1558</span><span id="line-1558">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
+<span class="source-line-no">1559</span><span id="line-1559">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
+<span class="source-line-no">1560</span><span id="line-1560">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
+<span class="source-line-no">1561</span><span id="line-1561">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
+<span class="source-line-no">1562</span><span id="line-1562">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.INCREMENT,</span>
+<span class="source-line-no">1563</span><span id="line-1563">        mutation, pair.getFirst(), pair.getSecond())));</span>
+<span class="source-line-no">1564</span><span id="line-1564">    }</span>
+<span class="source-line-no">1565</span><span id="line-1565">    return resultPairs;</span>
+<span class="source-line-no">1566</span><span id="line-1566">  }</span>
+<span class="source-line-no">1567</span><span id="line-1567"></span>
+<span class="source-line-no">1568</span><span id="line-1568">  /**</span>
+<span class="source-line-no">1569</span><span id="line-1569">   * Called after a list of new cells has been created during an append operation, but before they</span>
+<span class="source-line-no">1570</span><span id="line-1570">   * are committed to the WAL or memstore.</span>
+<span class="source-line-no">1571</span><span id="line-1571">   * @param ctx       the environment provided by the region server</span>
+<span class="source-line-no">1572</span><span id="line-1572">   * @param mutation  the current mutation</span>
+<span class="source-line-no">1573</span><span id="line-1573">   * @param cellPairs a list of cell pair. The first cell is old cell which may be null. And the</span>
+<span class="source-line-no">1574</span><span id="line-1574">   *                  second cell is the new cell.</span>
+<span class="source-line-no">1575</span><span id="line-1575">   * @return a list of cell pair, possibly changed.</span>
+<span class="source-line-no">1576</span><span id="line-1576">   */</span>
+<span class="source-line-no">1577</span><span id="line-1577">  default List&lt;Pair&lt;Cell, Cell&gt;&gt; postAppendBeforeWAL(</span>
+<span class="source-line-no">1578</span><span id="line-1578">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, Mutation mutation,</span>
+<span class="source-line-no">1579</span><span id="line-1579">    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs) throws IOException {</span>
+<span class="source-line-no">1580</span><span id="line-1580">    List&lt;Pair&lt;Cell, Cell&gt;&gt; resultPairs = new ArrayList&lt;&gt;(cellPairs.size());</span>
+<span class="source-line-no">1581</span><span id="line-1581">    for (Pair&lt;Cell, Cell&gt; pair : cellPairs) {</span>
+<span class="source-line-no">1582</span><span id="line-1582">      resultPairs.add(new Pair&lt;&gt;(pair.getFirst(), postMutationBeforeWAL(ctx, MutationType.APPEND,</span>
+<span class="source-line-no">1583</span><span id="line-1583">        mutation, pair.getFirst(), pair.getSecond())));</span>
+<span class="source-line-no">1584</span><span id="line-1584">    }</span>
+<span class="source-line-no">1585</span><span id="line-1585">    return resultPairs;</span>
+<span class="source-line-no">1586</span><span id="line-1586">  }</span>
+<span class="source-line-no">1587</span><span id="line-1587"></span>
+<span class="source-line-no">1588</span><span id="line-1588">  /**</span>
+<span class="source-line-no">1589</span><span id="line-1589">   * Called after the ScanQueryMatcher creates ScanDeleteTracker. Implementing this hook would help</span>
+<span class="source-line-no">1590</span><span id="line-1590">   * in creating customised DeleteTracker and returning the newly created DeleteTracker</span>
+<span class="source-line-no">1591</span><span id="line-1591">   * &lt;p&gt;</span>
+<span class="source-line-no">1592</span><span id="line-1592">   * Warn: This is used by internal coprocessors. Should not be implemented by user coprocessors</span>
+<span class="source-line-no">1593</span><span id="line-1593">   * @param ctx        the environment provided by the region server</span>
+<span class="source-line-no">1594</span><span id="line-1594">   * @param delTracker the deleteTracker that is created by the QueryMatcher</span>
+<span class="source-line-no">1595</span><span id="line-1595">   * @return the Delete Tracker</span>
+<span class="source-line-no">1596</span><span id="line-1596">   * @deprecated Since 2.0.0, will be removed in 4.0.0. Visibility label feature still use this</span>
+<span class="source-line-no">1597</span><span id="line-1597">   *             method, so it can not be removed in 3.0.0</span>
+<span class="source-line-no">1598</span><span id="line-1598">   */</span>
+<span class="source-line-no">1599</span><span id="line-1599">  @Deprecated</span>
+<span class="source-line-no">1600</span><span id="line-1600">  default DeleteTracker postInstantiateDeleteTracker(</span>
+<span class="source-line-no">1601</span><span id="line-1601">    ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, DeleteTracker delTracker)</span>
+<span class="source-line-no">1602</span><span id="line-1602">    throws IOException {</span>
+<span class="source-line-no">1603</span><span id="line-1603">    return delTracker;</span>
+<span class="source-line-no">1604</span><span id="line-1604">  }</span>
+<span class="source-line-no">1605</span><span id="line-1605"></span>
+<span class="source-line-no">1606</span><span id="line-1606">  /**</span>
+<span class="source-line-no">1607</span><span id="line-1607">   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows</span>
+<span class="source-line-no">1608</span><span id="line-1608">   * coprocessors to add extended attributes to the WALKey that then get persisted to the WAL, and</span>
+<span class="source-line-no">1609</span><span id="line-1609">   * are available to replication endpoints to use in processing WAL Entries.</span>
+<span class="source-line-no">1610</span><span id="line-1610">   * @param ctx the environment provided by the region server</span>
+<span class="source-line-no">1611</span><span id="line-1611">   * @param key the WALKey associated with a particular append to a WAL</span>
+<span class="source-line-no">1612</span><span id="line-1612">   */</span>
+<span class="source-line-no">1613</span><span id="line-1613">  default void preWALAppend(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; ctx, WALKey key,</span>
+<span class="source-line-no">1614</span><span id="line-1614">    WALEdit edit) throws IOException {</span>
+<span class="source-line-no">1615</span><span id="line-1615">  }</span>
+<span class="source-line-no">1616</span><span id="line-1616">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/apidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index e61c91e55de..d7e473c0e90 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -5765,3222 +5765,3235 @@
 <span class="source-line-no">5752</span><span id="line-5752">          currentReplaySeqId =</span>
 <span class="source-line-no">5753</span><span id="line-5753">            (key.getOrigLogSeqNum() &gt; 0) ? key.getOrigLogSeqNum() : currentEditSeqId;</span>
 <span class="source-line-no">5754</span><span id="line-5754"></span>
-<span class="source-line-no">5755</span><span id="line-5755">          boolean checkRowWithinBoundary = false;</span>
-<span class="source-line-no">5756</span><span id="line-5756">          // Check this edit is for this region.</span>
-<span class="source-line-no">5757</span><span id="line-5757">          if (</span>
-<span class="source-line-no">5758</span><span id="line-5758">            !Bytes.equals(key.getEncodedRegionName(), this.getRegionInfo().getEncodedNameAsBytes())</span>
-<span class="source-line-no">5759</span><span id="line-5759">          ) {</span>
-<span class="source-line-no">5760</span><span id="line-5760">            checkRowWithinBoundary = true;</span>
-<span class="source-line-no">5761</span><span id="line-5761">          }</span>
-<span class="source-line-no">5762</span><span id="line-5762"></span>
-<span class="source-line-no">5763</span><span id="line-5763">          boolean flush = false;</span>
-<span class="source-line-no">5764</span><span id="line-5764">          MemStoreSizing memStoreSizing = new NonThreadSafeMemStoreSizing();</span>
-<span class="source-line-no">5765</span><span id="line-5765">          for (Cell c : val.getCells()) {</span>
-<span class="source-line-no">5766</span><span id="line-5766">            assert c instanceof ExtendedCell;</span>
-<span class="source-line-no">5767</span><span id="line-5767">            ExtendedCell cell = (ExtendedCell) c;</span>
-<span class="source-line-no">5768</span><span id="line-5768">            // Check this edit is for me. Also, guard against writing the special</span>
-<span class="source-line-no">5769</span><span id="line-5769">            // METACOLUMN info such as HBASE::CACHEFLUSH entries</span>
-<span class="source-line-no">5770</span><span id="line-5770">            if (WALEdit.isMetaEditFamily(cell)) {</span>
-<span class="source-line-no">5771</span><span id="line-5771">              // if region names don't match, skipp replaying compaction marker</span>
-<span class="source-line-no">5772</span><span id="line-5772">              if (!checkRowWithinBoundary) {</span>
-<span class="source-line-no">5773</span><span id="line-5773">                // this is a special edit, we should handle it</span>
-<span class="source-line-no">5774</span><span id="line-5774">                CompactionDescriptor compaction = WALEdit.getCompaction(cell);</span>
-<span class="source-line-no">5775</span><span id="line-5775">                if (compaction != null) {</span>
-<span class="source-line-no">5776</span><span id="line-5776">                  // replay the compaction</span>
-<span class="source-line-no">5777</span><span id="line-5777">                  replayWALCompactionMarker(compaction, false, true, Long.MAX_VALUE);</span>
-<span class="source-line-no">5778</span><span id="line-5778">                }</span>
-<span class="source-line-no">5779</span><span id="line-5779">              }</span>
-<span class="source-line-no">5780</span><span id="line-5780">              skippedEdits++;</span>
-<span class="source-line-no">5781</span><span id="line-5781">              continue;</span>
-<span class="source-line-no">5782</span><span id="line-5782">            }</span>
-<span class="source-line-no">5783</span><span id="line-5783">            // Figure which store the edit is meant for.</span>
-<span class="source-line-no">5784</span><span id="line-5784">            if (</span>
-<span class="source-line-no">5785</span><span id="line-5785">              store == null</span>
-<span class="source-line-no">5786</span><span id="line-5786">                || !CellUtil.matchingFamily(cell, store.getColumnFamilyDescriptor().getName())</span>
-<span class="source-line-no">5787</span><span id="line-5787">            ) {</span>
-<span class="source-line-no">5788</span><span id="line-5788">              store = getStore(cell);</span>
-<span class="source-line-no">5789</span><span id="line-5789">            }</span>
-<span class="source-line-no">5790</span><span id="line-5790">            if (store == null) {</span>
-<span class="source-line-no">5791</span><span id="line-5791">              // This should never happen. Perhaps schema was changed between</span>
-<span class="source-line-no">5792</span><span id="line-5792">              // crash and redeploy?</span>
-<span class="source-line-no">5793</span><span id="line-5793">              LOG.warn("No family for cell {} in region {}", cell, this);</span>
-<span class="source-line-no">5794</span><span id="line-5794">              skippedEdits++;</span>
-<span class="source-line-no">5795</span><span id="line-5795">              continue;</span>
-<span class="source-line-no">5796</span><span id="line-5796">            }</span>
-<span class="source-line-no">5797</span><span id="line-5797">            if (</span>
-<span class="source-line-no">5798</span><span id="line-5798">              checkRowWithinBoundary &amp;&amp; !rowIsInRange(this.getRegionInfo(), cell.getRowArray(),</span>
-<span class="source-line-no">5799</span><span id="line-5799">                cell.getRowOffset(), cell.getRowLength())</span>
-<span class="source-line-no">5800</span><span id="line-5800">            ) {</span>
-<span class="source-line-no">5801</span><span id="line-5801">              LOG.warn("Row of {} is not within region boundary for region {}", cell, this);</span>
-<span class="source-line-no">5802</span><span id="line-5802">              skippedEdits++;</span>
-<span class="source-line-no">5803</span><span id="line-5803">              continue;</span>
-<span class="source-line-no">5804</span><span id="line-5804">            }</span>
-<span class="source-line-no">5805</span><span id="line-5805">            // Now, figure if we should skip this edit.</span>
+<span class="source-line-no">5755</span><span id="line-5755">          // Start coprocessor replay here. The coprocessor is for each WALEdit</span>
+<span class="source-line-no">5756</span><span id="line-5756">          // instead of a KeyValue.</span>
+<span class="source-line-no">5757</span><span id="line-5757">          if (coprocessorHost != null) {</span>
+<span class="source-line-no">5758</span><span id="line-5758">            status.setStatus("Running pre-WAL-restore hook in coprocessors");</span>
+<span class="source-line-no">5759</span><span id="line-5759">            if (coprocessorHost.preWALRestore(this.getRegionInfo(), key, val)) {</span>
+<span class="source-line-no">5760</span><span id="line-5760">              // if bypass this wal entry, ignore it ...</span>
+<span class="source-line-no">5761</span><span id="line-5761">              continue;</span>
+<span class="source-line-no">5762</span><span id="line-5762">            }</span>
+<span class="source-line-no">5763</span><span id="line-5763">          }</span>
+<span class="source-line-no">5764</span><span id="line-5764">          boolean checkRowWithinBoundary = false;</span>
+<span class="source-line-no">5765</span><span id="line-5765">          // Check this edit is for this region.</span>
+<span class="source-line-no">5766</span><span id="line-5766">          if (</span>
+<span class="source-line-no">5767</span><span id="line-5767">            !Bytes.equals(key.getEncodedRegionName(), this.getRegionInfo().getEncodedNameAsBytes())</span>
+<span class="source-line-no">5768</span><span id="line-5768">          ) {</span>
+<span class="source-line-no">5769</span><span id="line-5769">            checkRowWithinBoundary = true;</span>
+<span class="source-line-no">5770</span><span id="line-5770">          }</span>
+<span class="source-line-no">5771</span><span id="line-5771"></span>
+<span class="source-line-no">5772</span><span id="line-5772">          boolean flush = false;</span>
+<span class="source-line-no">5773</span><span id="line-5773">          MemStoreSizing memStoreSizing = new NonThreadSafeMemStoreSizing();</span>
+<span class="source-line-no">5774</span><span id="line-5774">          for (Cell c : val.getCells()) {</span>
+<span class="source-line-no">5775</span><span id="line-5775">            assert c instanceof ExtendedCell;</span>
+<span class="source-line-no">5776</span><span id="line-5776">            ExtendedCell cell = (ExtendedCell) c;</span>
+<span class="source-line-no">5777</span><span id="line-5777">            // Check this edit is for me. Also, guard against writing the special</span>
+<span class="source-line-no">5778</span><span id="line-5778">            // METACOLUMN info such as HBASE::CACHEFLUSH entries</span>
+<span class="source-line-no">5779</span><span id="line-5779">            if (WALEdit.isMetaEditFamily(cell)) {</span>
+<span class="source-line-no">5780</span><span id="line-5780">              // if region names don't match, skipp replaying compaction marker</span>
+<span class="source-line-no">5781</span><span id="line-5781">              if (!checkRowWithinBoundary) {</span>
+<span class="source-line-no">5782</span><span id="line-5782">                // this is a special edit, we should handle it</span>
+<span class="source-line-no">5783</span><span id="line-5783">                CompactionDescriptor compaction = WALEdit.getCompaction(cell);</span>
+<span class="source-line-no">5784</span><span id="line-5784">                if (compaction != null) {</span>
+<span class="source-line-no">5785</span><span id="line-5785">                  // replay the compaction</span>
+<span class="source-line-no">5786</span><span id="line-5786">                  replayWALCompactionMarker(compaction, false, true, Long.MAX_VALUE);</span>
+<span class="source-line-no">5787</span><span id="line-5787">                }</span>
+<span class="source-line-no">5788</span><span id="line-5788">              }</span>
+<span class="source-line-no">5789</span><span id="line-5789">              skippedEdits++;</span>
+<span class="source-line-no">5790</span><span id="line-5790">              continue;</span>
+<span class="source-line-no">5791</span><span id="line-5791">            }</span>
+<span class="source-line-no">5792</span><span id="line-5792">            // Figure which store the edit is meant for.</span>
+<span class="source-line-no">5793</span><span id="line-5793">            if (</span>
+<span class="source-line-no">5794</span><span id="line-5794">              store == null</span>
+<span class="source-line-no">5795</span><span id="line-5795">                || !CellUtil.matchingFamily(cell, store.getColumnFamilyDescriptor().getName())</span>
+<span class="source-line-no">5796</span><span id="line-5796">            ) {</span>
+<span class="source-line-no">5797</span><span id="line-5797">              store = getStore(cell);</span>
+<span class="source-line-no">5798</span><span id="line-5798">            }</span>
+<span class="source-line-no">5799</span><span id="line-5799">            if (store == null) {</span>
+<span class="source-line-no">5800</span><span id="line-5800">              // This should never happen. Perhaps schema was changed between</span>
+<span class="source-line-no">5801</span><span id="line-5801">              // crash and redeploy?</span>
+<span class="source-line-no">5802</span><span id="line-5802">              LOG.warn("No family for cell {} in region {}", cell, this);</span>
+<span class="source-line-no">5803</span><span id="line-5803">              skippedEdits++;</span>
+<span class="source-line-no">5804</span><span id="line-5804">              continue;</span>
+<span class="source-line-no">5805</span><span id="line-5805">            }</span>
 <span class="source-line-no">5806</span><span id="line-5806">            if (</span>
-<span class="source-line-no">5807</span><span id="line-5807">              key.getSequenceId()</span>
-<span class="source-line-no">5808</span><span id="line-5808">                  &lt;= maxSeqIdInStores.get(store.getColumnFamilyDescriptor().getName())</span>
+<span class="source-line-no">5807</span><span id="line-5807">              checkRowWithinBoundary &amp;&amp; !rowIsInRange(this.getRegionInfo(), cell.getRowArray(),</span>
+<span class="source-line-no">5808</span><span id="line-5808">                cell.getRowOffset(), cell.getRowLength())</span>
 <span class="source-line-no">5809</span><span id="line-5809">            ) {</span>
-<span class="source-line-no">5810</span><span id="line-5810">              skippedEdits++;</span>
-<span class="source-line-no">5811</span><span id="line-5811">              continue;</span>
-<span class="source-line-no">5812</span><span id="line-5812">            }</span>
-<span class="source-line-no">5813</span><span id="line-5813">            PrivateCellUtil.setSequenceId(cell, currentReplaySeqId);</span>
-<span class="source-line-no">5814</span><span id="line-5814"></span>
-<span class="source-line-no">5815</span><span id="line-5815">            restoreEdit(store, cell, memStoreSizing);</span>
-<span class="source-line-no">5816</span><span id="line-5816">            editsCount++;</span>
-<span class="source-line-no">5817</span><span id="line-5817">          }</span>
-<span class="source-line-no">5818</span><span id="line-5818">          MemStoreSize mss = memStoreSizing.getMemStoreSize();</span>
-<span class="source-line-no">5819</span><span id="line-5819">          incMemStoreSize(mss);</span>
-<span class="source-line-no">5820</span><span id="line-5820">          flush = isFlushSize(this.memStoreSizing.getMemStoreSize());</span>
-<span class="source-line-no">5821</span><span id="line-5821">          if (flush) {</span>
-<span class="source-line-no">5822</span><span id="line-5822">            internalFlushcache(null, currentEditSeqId, stores.values(), status, false,</span>
-<span class="source-line-no">5823</span><span id="line-5823">              FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">5824</span><span id="line-5824">          }</span>
-<span class="source-line-no">5825</span><span id="line-5825">        }</span>
-<span class="source-line-no">5826</span><span id="line-5826"></span>
-<span class="source-line-no">5827</span><span id="line-5827">        if (coprocessorHost != null) {</span>
-<span class="source-line-no">5828</span><span id="line-5828">          coprocessorHost.postReplayWALs(this.getRegionInfo(), edits);</span>
-<span class="source-line-no">5829</span><span id="line-5829">        }</span>
-<span class="source-line-no">5830</span><span id="line-5830">      } catch (EOFException eof) {</span>
-<span class="source-line-no">5831</span><span id="line-5831">        if (!conf.getBoolean(RECOVERED_EDITS_IGNORE_EOF, false)) {</span>
-<span class="source-line-no">5832</span><span id="line-5832">          Path p = WALSplitUtil.moveAsideBadEditsFile(fs, edits);</span>
-<span class="source-line-no">5833</span><span id="line-5833">          msg = "EnLongAddered EOF. Most likely due to Master failure during "</span>
-<span class="source-line-no">5834</span><span id="line-5834">            + "wal splitting, so we have this data in another edit. Continuing, but renaming "</span>
-<span class="source-line-no">5835</span><span id="line-5835">            + edits + " as " + p + " for region " + this;</span>
-<span class="source-line-no">5836</span><span id="line-5836">          LOG.warn(msg, eof);</span>
-<span class="source-line-no">5837</span><span id="line-5837">          status.abort(msg);</span>
-<span class="source-line-no">5838</span><span id="line-5838">        } else {</span>
-<span class="source-line-no">5839</span><span id="line-5839">          LOG.warn("EOF while replaying recover edits and config '{}' is true so "</span>
-<span class="source-line-no">5840</span><span id="line-5840">            + "we will ignore it and continue", RECOVERED_EDITS_IGNORE_EOF, eof);</span>
-<span class="source-line-no">5841</span><span id="line-5841">        }</span>
-<span class="source-line-no">5842</span><span id="line-5842">      } catch (IOException ioe) {</span>
-<span class="source-line-no">5843</span><span id="line-5843">        // If the IOE resulted from bad file format,</span>
-<span class="source-line-no">5844</span><span id="line-5844">        // then this problem is idempotent and retrying won't help</span>
-<span class="source-line-no">5845</span><span id="line-5845">        if (ioe.getCause() instanceof ParseException) {</span>
-<span class="source-line-no">5846</span><span id="line-5846">          Path p = WALSplitUtil.moveAsideBadEditsFile(fs, edits);</span>
-<span class="source-line-no">5847</span><span id="line-5847">          msg =</span>
-<span class="source-line-no">5848</span><span id="line-5848">            "File corruption enLongAddered!  " + "Continuing, but renaming " + edits + " as " + p;</span>
-<span class="source-line-no">5849</span><span id="line-5849">          LOG.warn(msg, ioe);</span>
-<span class="source-line-no">5850</span><span id="line-5850">          status.setStatus(msg);</span>
+<span class="source-line-no">5810</span><span id="line-5810">              LOG.warn("Row of {} is not within region boundary for region {}", cell, this);</span>
+<span class="source-line-no">5811</span><span id="line-5811">              skippedEdits++;</span>
+<span class="source-line-no">5812</span><span id="line-5812">              continue;</span>
+<span class="source-line-no">5813</span><span id="line-5813">            }</span>
+<span class="source-line-no">5814</span><span id="line-5814">            // Now, figure if we should skip this edit.</span>
+<span class="source-line-no">5815</span><span id="line-5815">            if (</span>
+<span class="source-line-no">5816</span><span id="line-5816">              key.getSequenceId()</span>
+<span class="source-line-no">5817</span><span id="line-5817">                  &lt;= maxSeqIdInStores.get(store.getColumnFamilyDescriptor().getName())</span>
+<span class="source-line-no">5818</span><span id="line-5818">            ) {</span>
+<span class="source-line-no">5819</span><span id="line-5819">              skippedEdits++;</span>
+<span class="source-line-no">5820</span><span id="line-5820">              continue;</span>
+<span class="source-line-no">5821</span><span id="line-5821">            }</span>
+<span class="source-line-no">5822</span><span id="line-5822">            PrivateCellUtil.setSequenceId(cell, currentReplaySeqId);</span>
+<span class="source-line-no">5823</span><span id="line-5823"></span>
+<span class="source-line-no">5824</span><span id="line-5824">            restoreEdit(store, cell, memStoreSizing);</span>
+<span class="source-line-no">5825</span><span id="line-5825">            editsCount++;</span>
+<span class="source-line-no">5826</span><span id="line-5826">          }</span>
+<span class="source-line-no">5827</span><span id="line-5827">          MemStoreSize mss = memStoreSizing.getMemStoreSize();</span>
+<span class="source-line-no">5828</span><span id="line-5828">          incMemStoreSize(mss);</span>
+<span class="source-line-no">5829</span><span id="line-5829">          flush = isFlushSize(this.memStoreSizing.getMemStoreSize());</span>
+<span class="source-line-no">5830</span><span id="line-5830">          if (flush) {</span>
+<span class="source-line-no">5831</span><span id="line-5831">            internalFlushcache(null, currentEditSeqId, stores.values(), status, false,</span>
+<span class="source-line-no">5832</span><span id="line-5832">              FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">5833</span><span id="line-5833">          }</span>
+<span class="source-line-no">5834</span><span id="line-5834"></span>
+<span class="source-line-no">5835</span><span id="line-5835">          if (coprocessorHost != null) {</span>
+<span class="source-line-no">5836</span><span id="line-5836">            coprocessorHost.postWALRestore(this.getRegionInfo(), key, val);</span>
+<span class="source-line-no">5837</span><span id="line-5837">          }</span>
+<span class="source-line-no">5838</span><span id="line-5838">        }</span>
+<span class="source-line-no">5839</span><span id="line-5839"></span>
+<span class="source-line-no">5840</span><span id="line-5840">        if (coprocessorHost != null) {</span>
+<span class="source-line-no">5841</span><span id="line-5841">          coprocessorHost.postReplayWALs(this.getRegionInfo(), edits);</span>
+<span class="source-line-no">5842</span><span id="line-5842">        }</span>
+<span class="source-line-no">5843</span><span id="line-5843">      } catch (EOFException eof) {</span>
+<span class="source-line-no">5844</span><span id="line-5844">        if (!conf.getBoolean(RECOVERED_EDITS_IGNORE_EOF, false)) {</span>
+<span class="source-line-no">5845</span><span id="line-5845">          Path p = WALSplitUtil.moveAsideBadEditsFile(fs, edits);</span>
+<span class="source-line-no">5846</span><span id="line-5846">          msg = "EnLongAddered EOF. Most likely due to Master failure during "</span>
+<span class="source-line-no">5847</span><span id="line-5847">            + "wal splitting, so we have this data in another edit. Continuing, but renaming "</span>
+<span class="source-line-no">5848</span><span id="line-5848">            + edits + " as " + p + " for region " + this;</span>
+<span class="source-line-no">5849</span><span id="line-5849">          LOG.warn(msg, eof);</span>
+<span class="source-line-no">5850</span><span id="line-5850">          status.abort(msg);</span>
 <span class="source-line-no">5851</span><span id="line-5851">        } else {</span>
-<span class="source-line-no">5852</span><span id="line-5852">          status.abort(StringUtils.stringifyException(ioe));</span>
-<span class="source-line-no">5853</span><span id="line-5853">          // other IO errors may be transient (bad network connection,</span>
-<span class="source-line-no">5854</span><span id="line-5854">          // checksum exception on one datanode, etc). throw &amp; retry</span>
-<span class="source-line-no">5855</span><span id="line-5855">          throw ioe;</span>
-<span class="source-line-no">5856</span><span id="line-5856">        }</span>
-<span class="source-line-no">5857</span><span id="line-5857">      }</span>
-<span class="source-line-no">5858</span><span id="line-5858">      if (reporter != null &amp;&amp; !reported_once) {</span>
-<span class="source-line-no">5859</span><span id="line-5859">        reporter.progress();</span>
-<span class="source-line-no">5860</span><span id="line-5860">      }</span>
-<span class="source-line-no">5861</span><span id="line-5861">      msg = "Applied " + editsCount + ", skipped " + skippedEdits + ", firstSequenceIdInLog="</span>
-<span class="source-line-no">5862</span><span id="line-5862">        + firstSeqIdInLog + ", maxSequenceIdInLog=" + currentEditSeqId + ", path=" + edits;</span>
-<span class="source-line-no">5863</span><span id="line-5863">      status.markComplete(msg);</span>
-<span class="source-line-no">5864</span><span id="line-5864">      LOG.debug(msg);</span>
-<span class="source-line-no">5865</span><span id="line-5865">      return currentEditSeqId;</span>
-<span class="source-line-no">5866</span><span id="line-5866">    } finally {</span>
-<span class="source-line-no">5867</span><span id="line-5867">      status.cleanup();</span>
-<span class="source-line-no">5868</span><span id="line-5868">    }</span>
-<span class="source-line-no">5869</span><span id="line-5869">  }</span>
-<span class="source-line-no">5870</span><span id="line-5870"></span>
-<span class="source-line-no">5871</span><span id="line-5871">  /**</span>
-<span class="source-line-no">5872</span><span id="line-5872">   * Call to complete a compaction. Its for the case where we find in the WAL a compaction that was</span>
-<span class="source-line-no">5873</span><span id="line-5873">   * not finished. We could find one recovering a WAL after a regionserver crash. See HBASE-2331.</span>
-<span class="source-line-no">5874</span><span id="line-5874">   */</span>
-<span class="source-line-no">5875</span><span id="line-5875">  void replayWALCompactionMarker(CompactionDescriptor compaction, boolean pickCompactionFiles,</span>
-<span class="source-line-no">5876</span><span id="line-5876">    boolean removeFiles, long replaySeqId) throws IOException {</span>
-<span class="source-line-no">5877</span><span id="line-5877">    try {</span>
-<span class="source-line-no">5878</span><span id="line-5878">      checkTargetRegion(compaction.getEncodedRegionName().toByteArray(),</span>
-<span class="source-line-no">5879</span><span id="line-5879">        "Compaction marker from WAL ", compaction);</span>
-<span class="source-line-no">5880</span><span id="line-5880">    } catch (WrongRegionException wre) {</span>
-<span class="source-line-no">5881</span><span id="line-5881">      if (RegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
-<span class="source-line-no">5882</span><span id="line-5882">        // skip the compaction marker since it is not for this region</span>
-<span class="source-line-no">5883</span><span id="line-5883">        return;</span>
-<span class="source-line-no">5884</span><span id="line-5884">      }</span>
-<span class="source-line-no">5885</span><span id="line-5885">      throw wre;</span>
-<span class="source-line-no">5886</span><span id="line-5886">    }</span>
-<span class="source-line-no">5887</span><span id="line-5887"></span>
-<span class="source-line-no">5888</span><span id="line-5888">    synchronized (writestate) {</span>
-<span class="source-line-no">5889</span><span id="line-5889">      if (replaySeqId &lt; lastReplayedOpenRegionSeqId) {</span>
-<span class="source-line-no">5890</span><span id="line-5890">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying compaction event :"</span>
-<span class="source-line-no">5891</span><span id="line-5891">          + TextFormat.shortDebugString(compaction) + " because its sequence id " + replaySeqId</span>
-<span class="source-line-no">5892</span><span id="line-5892">          + " is smaller than this regions " + "lastReplayedOpenRegionSeqId of "</span>
-<span class="source-line-no">5893</span><span id="line-5893">          + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">5894</span><span id="line-5894">        return;</span>
-<span class="source-line-no">5895</span><span id="line-5895">      }</span>
-<span class="source-line-no">5896</span><span id="line-5896">      if (replaySeqId &lt; lastReplayedCompactionSeqId) {</span>
-<span class="source-line-no">5897</span><span id="line-5897">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying compaction event :"</span>
-<span class="source-line-no">5898</span><span id="line-5898">          + TextFormat.shortDebugString(compaction) + " because its sequence id " + replaySeqId</span>
-<span class="source-line-no">5899</span><span id="line-5899">          + " is smaller than this regions " + "lastReplayedCompactionSeqId of "</span>
-<span class="source-line-no">5900</span><span id="line-5900">          + lastReplayedCompactionSeqId);</span>
-<span class="source-line-no">5901</span><span id="line-5901">        return;</span>
-<span class="source-line-no">5902</span><span id="line-5902">      } else {</span>
-<span class="source-line-no">5903</span><span id="line-5903">        lastReplayedCompactionSeqId = replaySeqId;</span>
-<span class="source-line-no">5904</span><span id="line-5904">      }</span>
-<span class="source-line-no">5905</span><span id="line-5905"></span>
-<span class="source-line-no">5906</span><span id="line-5906">      if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">5907</span><span id="line-5907">        LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying compaction marker "</span>
-<span class="source-line-no">5908</span><span id="line-5908">          + TextFormat.shortDebugString(compaction) + " with seqId=" + replaySeqId</span>
-<span class="source-line-no">5909</span><span id="line-5909">          + " and lastReplayedOpenRegionSeqId=" + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">5910</span><span id="line-5910">      }</span>
-<span class="source-line-no">5911</span><span id="line-5911"></span>
-<span class="source-line-no">5912</span><span id="line-5912">      startRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">5913</span><span id="line-5913">      try {</span>
-<span class="source-line-no">5914</span><span id="line-5914">        HStore store = this.getStore(compaction.getFamilyName().toByteArray());</span>
-<span class="source-line-no">5915</span><span id="line-5915">        if (store == null) {</span>
-<span class="source-line-no">5916</span><span id="line-5916">          LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">5917</span><span id="line-5917">            + "Found Compaction WAL edit for deleted family:"</span>
-<span class="source-line-no">5918</span><span id="line-5918">            + Bytes.toString(compaction.getFamilyName().toByteArray()));</span>
-<span class="source-line-no">5919</span><span id="line-5919">          return;</span>
-<span class="source-line-no">5920</span><span id="line-5920">        }</span>
-<span class="source-line-no">5921</span><span id="line-5921">        store.replayCompactionMarker(compaction, pickCompactionFiles, removeFiles);</span>
-<span class="source-line-no">5922</span><span id="line-5922">        logRegionFiles();</span>
-<span class="source-line-no">5923</span><span id="line-5923">      } catch (FileNotFoundException ex) {</span>
-<span class="source-line-no">5924</span><span id="line-5924">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">5925</span><span id="line-5925">          + "At least one of the store files in compaction: "</span>
-<span class="source-line-no">5926</span><span id="line-5926">          + TextFormat.shortDebugString(compaction)</span>
-<span class="source-line-no">5927</span><span id="line-5927">          + " doesn't exist any more. Skip loading the file(s)", ex);</span>
-<span class="source-line-no">5928</span><span id="line-5928">      } finally {</span>
-<span class="source-line-no">5929</span><span id="line-5929">        closeRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">5930</span><span id="line-5930">      }</span>
-<span class="source-line-no">5931</span><span id="line-5931">    }</span>
-<span class="source-line-no">5932</span><span id="line-5932">  }</span>
-<span class="source-line-no">5933</span><span id="line-5933"></span>
-<span class="source-line-no">5934</span><span id="line-5934">  /**</span>
-<span class="source-line-no">5935</span><span id="line-5935">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">5936</span><span id="line-5936">   *             replica implementation.</span>
-<span class="source-line-no">5937</span><span id="line-5937">   */</span>
-<span class="source-line-no">5938</span><span id="line-5938">  @Deprecated</span>
-<span class="source-line-no">5939</span><span id="line-5939">  void replayWALFlushMarker(FlushDescriptor flush, long replaySeqId) throws IOException {</span>
-<span class="source-line-no">5940</span><span id="line-5940">    checkTargetRegion(flush.getEncodedRegionName().toByteArray(), "Flush marker from WAL ", flush);</span>
-<span class="source-line-no">5941</span><span id="line-5941"></span>
-<span class="source-line-no">5942</span><span id="line-5942">    if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
-<span class="source-line-no">5943</span><span id="line-5943">      return; // if primary nothing to do</span>
+<span class="source-line-no">5852</span><span id="line-5852">          LOG.warn("EOF while replaying recover edits and config '{}' is true so "</span>
+<span class="source-line-no">5853</span><span id="line-5853">            + "we will ignore it and continue", RECOVERED_EDITS_IGNORE_EOF, eof);</span>
+<span class="source-line-no">5854</span><span id="line-5854">        }</span>
+<span class="source-line-no">5855</span><span id="line-5855">      } catch (IOException ioe) {</span>
+<span class="source-line-no">5856</span><span id="line-5856">        // If the IOE resulted from bad file format,</span>
+<span class="source-line-no">5857</span><span id="line-5857">        // then this problem is idempotent and retrying won't help</span>
+<span class="source-line-no">5858</span><span id="line-5858">        if (ioe.getCause() instanceof ParseException) {</span>
+<span class="source-line-no">5859</span><span id="line-5859">          Path p = WALSplitUtil.moveAsideBadEditsFile(fs, edits);</span>
+<span class="source-line-no">5860</span><span id="line-5860">          msg =</span>
+<span class="source-line-no">5861</span><span id="line-5861">            "File corruption enLongAddered!  " + "Continuing, but renaming " + edits + " as " + p;</span>
+<span class="source-line-no">5862</span><span id="line-5862">          LOG.warn(msg, ioe);</span>
+<span class="source-line-no">5863</span><span id="line-5863">          status.setStatus(msg);</span>
+<span class="source-line-no">5864</span><span id="line-5864">        } else {</span>
+<span class="source-line-no">5865</span><span id="line-5865">          status.abort(StringUtils.stringifyException(ioe));</span>
+<span class="source-line-no">5866</span><span id="line-5866">          // other IO errors may be transient (bad network connection,</span>
+<span class="source-line-no">5867</span><span id="line-5867">          // checksum exception on one datanode, etc). throw &amp; retry</span>
+<span class="source-line-no">5868</span><span id="line-5868">          throw ioe;</span>
+<span class="source-line-no">5869</span><span id="line-5869">        }</span>
+<span class="source-line-no">5870</span><span id="line-5870">      }</span>
+<span class="source-line-no">5871</span><span id="line-5871">      if (reporter != null &amp;&amp; !reported_once) {</span>
+<span class="source-line-no">5872</span><span id="line-5872">        reporter.progress();</span>
+<span class="source-line-no">5873</span><span id="line-5873">      }</span>
+<span class="source-line-no">5874</span><span id="line-5874">      msg = "Applied " + editsCount + ", skipped " + skippedEdits + ", firstSequenceIdInLog="</span>
+<span class="source-line-no">5875</span><span id="line-5875">        + firstSeqIdInLog + ", maxSequenceIdInLog=" + currentEditSeqId + ", path=" + edits;</span>
+<span class="source-line-no">5876</span><span id="line-5876">      status.markComplete(msg);</span>
+<span class="source-line-no">5877</span><span id="line-5877">      LOG.debug(msg);</span>
+<span class="source-line-no">5878</span><span id="line-5878">      return currentEditSeqId;</span>
+<span class="source-line-no">5879</span><span id="line-5879">    } finally {</span>
+<span class="source-line-no">5880</span><span id="line-5880">      status.cleanup();</span>
+<span class="source-line-no">5881</span><span id="line-5881">    }</span>
+<span class="source-line-no">5882</span><span id="line-5882">  }</span>
+<span class="source-line-no">5883</span><span id="line-5883"></span>
+<span class="source-line-no">5884</span><span id="line-5884">  /**</span>
+<span class="source-line-no">5885</span><span id="line-5885">   * Call to complete a compaction. Its for the case where we find in the WAL a compaction that was</span>
+<span class="source-line-no">5886</span><span id="line-5886">   * not finished. We could find one recovering a WAL after a regionserver crash. See HBASE-2331.</span>
+<span class="source-line-no">5887</span><span id="line-5887">   */</span>
+<span class="source-line-no">5888</span><span id="line-5888">  void replayWALCompactionMarker(CompactionDescriptor compaction, boolean pickCompactionFiles,</span>
+<span class="source-line-no">5889</span><span id="line-5889">    boolean removeFiles, long replaySeqId) throws IOException {</span>
+<span class="source-line-no">5890</span><span id="line-5890">    try {</span>
+<span class="source-line-no">5891</span><span id="line-5891">      checkTargetRegion(compaction.getEncodedRegionName().toByteArray(),</span>
+<span class="source-line-no">5892</span><span id="line-5892">        "Compaction marker from WAL ", compaction);</span>
+<span class="source-line-no">5893</span><span id="line-5893">    } catch (WrongRegionException wre) {</span>
+<span class="source-line-no">5894</span><span id="line-5894">      if (RegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
+<span class="source-line-no">5895</span><span id="line-5895">        // skip the compaction marker since it is not for this region</span>
+<span class="source-line-no">5896</span><span id="line-5896">        return;</span>
+<span class="source-line-no">5897</span><span id="line-5897">      }</span>
+<span class="source-line-no">5898</span><span id="line-5898">      throw wre;</span>
+<span class="source-line-no">5899</span><span id="line-5899">    }</span>
+<span class="source-line-no">5900</span><span id="line-5900"></span>
+<span class="source-line-no">5901</span><span id="line-5901">    synchronized (writestate) {</span>
+<span class="source-line-no">5902</span><span id="line-5902">      if (replaySeqId &lt; lastReplayedOpenRegionSeqId) {</span>
+<span class="source-line-no">5903</span><span id="line-5903">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying compaction event :"</span>
+<span class="source-line-no">5904</span><span id="line-5904">          + TextFormat.shortDebugString(compaction) + " because its sequence id " + replaySeqId</span>
+<span class="source-line-no">5905</span><span id="line-5905">          + " is smaller than this regions " + "lastReplayedOpenRegionSeqId of "</span>
+<span class="source-line-no">5906</span><span id="line-5906">          + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">5907</span><span id="line-5907">        return;</span>
+<span class="source-line-no">5908</span><span id="line-5908">      }</span>
+<span class="source-line-no">5909</span><span id="line-5909">      if (replaySeqId &lt; lastReplayedCompactionSeqId) {</span>
+<span class="source-line-no">5910</span><span id="line-5910">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying compaction event :"</span>
+<span class="source-line-no">5911</span><span id="line-5911">          + TextFormat.shortDebugString(compaction) + " because its sequence id " + replaySeqId</span>
+<span class="source-line-no">5912</span><span id="line-5912">          + " is smaller than this regions " + "lastReplayedCompactionSeqId of "</span>
+<span class="source-line-no">5913</span><span id="line-5913">          + lastReplayedCompactionSeqId);</span>
+<span class="source-line-no">5914</span><span id="line-5914">        return;</span>
+<span class="source-line-no">5915</span><span id="line-5915">      } else {</span>
+<span class="source-line-no">5916</span><span id="line-5916">        lastReplayedCompactionSeqId = replaySeqId;</span>
+<span class="source-line-no">5917</span><span id="line-5917">      }</span>
+<span class="source-line-no">5918</span><span id="line-5918"></span>
+<span class="source-line-no">5919</span><span id="line-5919">      if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">5920</span><span id="line-5920">        LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying compaction marker "</span>
+<span class="source-line-no">5921</span><span id="line-5921">          + TextFormat.shortDebugString(compaction) + " with seqId=" + replaySeqId</span>
+<span class="source-line-no">5922</span><span id="line-5922">          + " and lastReplayedOpenRegionSeqId=" + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">5923</span><span id="line-5923">      }</span>
+<span class="source-line-no">5924</span><span id="line-5924"></span>
+<span class="source-line-no">5925</span><span id="line-5925">      startRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">5926</span><span id="line-5926">      try {</span>
+<span class="source-line-no">5927</span><span id="line-5927">        HStore store = this.getStore(compaction.getFamilyName().toByteArray());</span>
+<span class="source-line-no">5928</span><span id="line-5928">        if (store == null) {</span>
+<span class="source-line-no">5929</span><span id="line-5929">          LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">5930</span><span id="line-5930">            + "Found Compaction WAL edit for deleted family:"</span>
+<span class="source-line-no">5931</span><span id="line-5931">            + Bytes.toString(compaction.getFamilyName().toByteArray()));</span>
+<span class="source-line-no">5932</span><span id="line-5932">          return;</span>
+<span class="source-line-no">5933</span><span id="line-5933">        }</span>
+<span class="source-line-no">5934</span><span id="line-5934">        store.replayCompactionMarker(compaction, pickCompactionFiles, removeFiles);</span>
+<span class="source-line-no">5935</span><span id="line-5935">        logRegionFiles();</span>
+<span class="source-line-no">5936</span><span id="line-5936">      } catch (FileNotFoundException ex) {</span>
+<span class="source-line-no">5937</span><span id="line-5937">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">5938</span><span id="line-5938">          + "At least one of the store files in compaction: "</span>
+<span class="source-line-no">5939</span><span id="line-5939">          + TextFormat.shortDebugString(compaction)</span>
+<span class="source-line-no">5940</span><span id="line-5940">          + " doesn't exist any more. Skip loading the file(s)", ex);</span>
+<span class="source-line-no">5941</span><span id="line-5941">      } finally {</span>
+<span class="source-line-no">5942</span><span id="line-5942">        closeRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">5943</span><span id="line-5943">      }</span>
 <span class="source-line-no">5944</span><span id="line-5944">    }</span>
-<span class="source-line-no">5945</span><span id="line-5945"></span>
-<span class="source-line-no">5946</span><span id="line-5946">    if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">5947</span><span id="line-5947">      LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying flush marker "</span>
-<span class="source-line-no">5948</span><span id="line-5948">        + TextFormat.shortDebugString(flush));</span>
-<span class="source-line-no">5949</span><span id="line-5949">    }</span>
-<span class="source-line-no">5950</span><span id="line-5950"></span>
-<span class="source-line-no">5951</span><span id="line-5951">    startRegionOperation(Operation.REPLAY_EVENT); // use region close lock to guard against close</span>
-<span class="source-line-no">5952</span><span id="line-5952">    try {</span>
-<span class="source-line-no">5953</span><span id="line-5953">      FlushAction action = flush.getAction();</span>
-<span class="source-line-no">5954</span><span id="line-5954">      switch (action) {</span>
-<span class="source-line-no">5955</span><span id="line-5955">        case START_FLUSH:</span>
-<span class="source-line-no">5956</span><span id="line-5956">          replayWALFlushStartMarker(flush);</span>
-<span class="source-line-no">5957</span><span id="line-5957">          break;</span>
-<span class="source-line-no">5958</span><span id="line-5958">        case COMMIT_FLUSH:</span>
-<span class="source-line-no">5959</span><span id="line-5959">          replayWALFlushCommitMarker(flush);</span>
-<span class="source-line-no">5960</span><span id="line-5960">          break;</span>
-<span class="source-line-no">5961</span><span id="line-5961">        case ABORT_FLUSH:</span>
-<span class="source-line-no">5962</span><span id="line-5962">          replayWALFlushAbortMarker(flush);</span>
-<span class="source-line-no">5963</span><span id="line-5963">          break;</span>
-<span class="source-line-no">5964</span><span id="line-5964">        case CANNOT_FLUSH:</span>
-<span class="source-line-no">5965</span><span id="line-5965">          replayWALFlushCannotFlushMarker(flush, replaySeqId);</span>
-<span class="source-line-no">5966</span><span id="line-5966">          break;</span>
-<span class="source-line-no">5967</span><span id="line-5967">        default:</span>
-<span class="source-line-no">5968</span><span id="line-5968">          LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">5969</span><span id="line-5969">            + "Received a flush event with unknown action, ignoring. "</span>
-<span class="source-line-no">5970</span><span id="line-5970">            + TextFormat.shortDebugString(flush));</span>
-<span class="source-line-no">5971</span><span id="line-5971">          break;</span>
-<span class="source-line-no">5972</span><span id="line-5972">      }</span>
-<span class="source-line-no">5973</span><span id="line-5973"></span>
-<span class="source-line-no">5974</span><span id="line-5974">      logRegionFiles();</span>
-<span class="source-line-no">5975</span><span id="line-5975">    } finally {</span>
-<span class="source-line-no">5976</span><span id="line-5976">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">5977</span><span id="line-5977">    }</span>
-<span class="source-line-no">5978</span><span id="line-5978">  }</span>
-<span class="source-line-no">5979</span><span id="line-5979"></span>
-<span class="source-line-no">5980</span><span id="line-5980">  private Collection&lt;HStore&gt; getStoresToFlush(FlushDescriptor flushDesc) {</span>
-<span class="source-line-no">5981</span><span id="line-5981">    List&lt;HStore&gt; storesToFlush = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">5982</span><span id="line-5982">    for (StoreFlushDescriptor storeFlush : flushDesc.getStoreFlushesList()) {</span>
-<span class="source-line-no">5983</span><span id="line-5983">      byte[] family = storeFlush.getFamilyName().toByteArray();</span>
-<span class="source-line-no">5984</span><span id="line-5984">      HStore store = getStore(family);</span>
-<span class="source-line-no">5985</span><span id="line-5985">      if (store == null) {</span>
-<span class="source-line-no">5986</span><span id="line-5986">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">5987</span><span id="line-5987">          + "Received a flush start marker from primary, but the family is not found. Ignoring"</span>
-<span class="source-line-no">5988</span><span id="line-5988">          + " StoreFlushDescriptor:" + TextFormat.shortDebugString(storeFlush));</span>
-<span class="source-line-no">5989</span><span id="line-5989">        continue;</span>
-<span class="source-line-no">5990</span><span id="line-5990">      }</span>
-<span class="source-line-no">5991</span><span id="line-5991">      storesToFlush.add(store);</span>
-<span class="source-line-no">5992</span><span id="line-5992">    }</span>
-<span class="source-line-no">5993</span><span id="line-5993">    return storesToFlush;</span>
-<span class="source-line-no">5994</span><span id="line-5994">  }</span>
-<span class="source-line-no">5995</span><span id="line-5995"></span>
-<span class="source-line-no">5996</span><span id="line-5996">  /**</span>
-<span class="source-line-no">5997</span><span id="line-5997">   * Replay the flush marker from primary region by creating a corresponding snapshot of the store</span>
-<span class="source-line-no">5998</span><span id="line-5998">   * memstores, only if the memstores do not have a higher seqId from an earlier wal edit (because</span>
-<span class="source-line-no">5999</span><span id="line-5999">   * the events may be coming out of order).</span>
-<span class="source-line-no">6000</span><span id="line-6000">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">6001</span><span id="line-6001">   *             replica implementation.</span>
-<span class="source-line-no">6002</span><span id="line-6002">   */</span>
-<span class="source-line-no">6003</span><span id="line-6003">  @Deprecated</span>
-<span class="source-line-no">6004</span><span id="line-6004">  PrepareFlushResult replayWALFlushStartMarker(FlushDescriptor flush) throws IOException {</span>
-<span class="source-line-no">6005</span><span id="line-6005">    long flushSeqId = flush.getFlushSequenceNumber();</span>
-<span class="source-line-no">6006</span><span id="line-6006"></span>
-<span class="source-line-no">6007</span><span id="line-6007">    Collection&lt;HStore&gt; storesToFlush = getStoresToFlush(flush);</span>
+<span class="source-line-no">5945</span><span id="line-5945">  }</span>
+<span class="source-line-no">5946</span><span id="line-5946"></span>
+<span class="source-line-no">5947</span><span id="line-5947">  /**</span>
+<span class="source-line-no">5948</span><span id="line-5948">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">5949</span><span id="line-5949">   *             replica implementation.</span>
+<span class="source-line-no">5950</span><span id="line-5950">   */</span>
+<span class="source-line-no">5951</span><span id="line-5951">  @Deprecated</span>
+<span class="source-line-no">5952</span><span id="line-5952">  void replayWALFlushMarker(FlushDescriptor flush, long replaySeqId) throws IOException {</span>
+<span class="source-line-no">5953</span><span id="line-5953">    checkTargetRegion(flush.getEncodedRegionName().toByteArray(), "Flush marker from WAL ", flush);</span>
+<span class="source-line-no">5954</span><span id="line-5954"></span>
+<span class="source-line-no">5955</span><span id="line-5955">    if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
+<span class="source-line-no">5956</span><span id="line-5956">      return; // if primary nothing to do</span>
+<span class="source-line-no">5957</span><span id="line-5957">    }</span>
+<span class="source-line-no">5958</span><span id="line-5958"></span>
+<span class="source-line-no">5959</span><span id="line-5959">    if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">5960</span><span id="line-5960">      LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying flush marker "</span>
+<span class="source-line-no">5961</span><span id="line-5961">        + TextFormat.shortDebugString(flush));</span>
+<span class="source-line-no">5962</span><span id="line-5962">    }</span>
+<span class="source-line-no">5963</span><span id="line-5963"></span>
+<span class="source-line-no">5964</span><span id="line-5964">    startRegionOperation(Operation.REPLAY_EVENT); // use region close lock to guard against close</span>
+<span class="source-line-no">5965</span><span id="line-5965">    try {</span>
+<span class="source-line-no">5966</span><span id="line-5966">      FlushAction action = flush.getAction();</span>
+<span class="source-line-no">5967</span><span id="line-5967">      switch (action) {</span>
+<span class="source-line-no">5968</span><span id="line-5968">        case START_FLUSH:</span>
+<span class="source-line-no">5969</span><span id="line-5969">          replayWALFlushStartMarker(flush);</span>
+<span class="source-line-no">5970</span><span id="line-5970">          break;</span>
+<span class="source-line-no">5971</span><span id="line-5971">        case COMMIT_FLUSH:</span>
+<span class="source-line-no">5972</span><span id="line-5972">          replayWALFlushCommitMarker(flush);</span>
+<span class="source-line-no">5973</span><span id="line-5973">          break;</span>
+<span class="source-line-no">5974</span><span id="line-5974">        case ABORT_FLUSH:</span>
+<span class="source-line-no">5975</span><span id="line-5975">          replayWALFlushAbortMarker(flush);</span>
+<span class="source-line-no">5976</span><span id="line-5976">          break;</span>
+<span class="source-line-no">5977</span><span id="line-5977">        case CANNOT_FLUSH:</span>
+<span class="source-line-no">5978</span><span id="line-5978">          replayWALFlushCannotFlushMarker(flush, replaySeqId);</span>
+<span class="source-line-no">5979</span><span id="line-5979">          break;</span>
+<span class="source-line-no">5980</span><span id="line-5980">        default:</span>
+<span class="source-line-no">5981</span><span id="line-5981">          LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">5982</span><span id="line-5982">            + "Received a flush event with unknown action, ignoring. "</span>
+<span class="source-line-no">5983</span><span id="line-5983">            + TextFormat.shortDebugString(flush));</span>
+<span class="source-line-no">5984</span><span id="line-5984">          break;</span>
+<span class="source-line-no">5985</span><span id="line-5985">      }</span>
+<span class="source-line-no">5986</span><span id="line-5986"></span>
+<span class="source-line-no">5987</span><span id="line-5987">      logRegionFiles();</span>
+<span class="source-line-no">5988</span><span id="line-5988">    } finally {</span>
+<span class="source-line-no">5989</span><span id="line-5989">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">5990</span><span id="line-5990">    }</span>
+<span class="source-line-no">5991</span><span id="line-5991">  }</span>
+<span class="source-line-no">5992</span><span id="line-5992"></span>
+<span class="source-line-no">5993</span><span id="line-5993">  private Collection&lt;HStore&gt; getStoresToFlush(FlushDescriptor flushDesc) {</span>
+<span class="source-line-no">5994</span><span id="line-5994">    List&lt;HStore&gt; storesToFlush = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">5995</span><span id="line-5995">    for (StoreFlushDescriptor storeFlush : flushDesc.getStoreFlushesList()) {</span>
+<span class="source-line-no">5996</span><span id="line-5996">      byte[] family = storeFlush.getFamilyName().toByteArray();</span>
+<span class="source-line-no">5997</span><span id="line-5997">      HStore store = getStore(family);</span>
+<span class="source-line-no">5998</span><span id="line-5998">      if (store == null) {</span>
+<span class="source-line-no">5999</span><span id="line-5999">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6000</span><span id="line-6000">          + "Received a flush start marker from primary, but the family is not found. Ignoring"</span>
+<span class="source-line-no">6001</span><span id="line-6001">          + " StoreFlushDescriptor:" + TextFormat.shortDebugString(storeFlush));</span>
+<span class="source-line-no">6002</span><span id="line-6002">        continue;</span>
+<span class="source-line-no">6003</span><span id="line-6003">      }</span>
+<span class="source-line-no">6004</span><span id="line-6004">      storesToFlush.add(store);</span>
+<span class="source-line-no">6005</span><span id="line-6005">    }</span>
+<span class="source-line-no">6006</span><span id="line-6006">    return storesToFlush;</span>
+<span class="source-line-no">6007</span><span id="line-6007">  }</span>
 <span class="source-line-no">6008</span><span id="line-6008"></span>
-<span class="source-line-no">6009</span><span id="line-6009">    MonitoredTask status = TaskMonitor.get().createStatus("Preparing flush " + this);</span>
-<span class="source-line-no">6010</span><span id="line-6010"></span>
-<span class="source-line-no">6011</span><span id="line-6011">    // we will use writestate as a coarse-grain lock for all the replay events</span>
-<span class="source-line-no">6012</span><span id="line-6012">    // (flush, compaction, region open etc)</span>
-<span class="source-line-no">6013</span><span id="line-6013">    synchronized (writestate) {</span>
-<span class="source-line-no">6014</span><span id="line-6014">      try {</span>
-<span class="source-line-no">6015</span><span id="line-6015">        if (flush.getFlushSequenceNumber() &lt; lastReplayedOpenRegionSeqId) {</span>
-<span class="source-line-no">6016</span><span id="line-6016">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
-<span class="source-line-no">6017</span><span id="line-6017">            + TextFormat.shortDebugString(flush)</span>
-<span class="source-line-no">6018</span><span id="line-6018">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
-<span class="source-line-no">6019</span><span id="line-6019">            + " of " + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">6020</span><span id="line-6020">          return null;</span>
-<span class="source-line-no">6021</span><span id="line-6021">        }</span>
-<span class="source-line-no">6022</span><span id="line-6022">        if (numMutationsWithoutWAL.sum() &gt; 0) {</span>
-<span class="source-line-no">6023</span><span id="line-6023">          numMutationsWithoutWAL.reset();</span>
-<span class="source-line-no">6024</span><span id="line-6024">          dataInMemoryWithoutWAL.reset();</span>
-<span class="source-line-no">6025</span><span id="line-6025">        }</span>
-<span class="source-line-no">6026</span><span id="line-6026"></span>
-<span class="source-line-no">6027</span><span id="line-6027">        if (!writestate.flushing) {</span>
-<span class="source-line-no">6028</span><span id="line-6028">          // we do not have an active snapshot and corresponding this.prepareResult. This means</span>
-<span class="source-line-no">6029</span><span id="line-6029">          // we can just snapshot our memstores and continue as normal.</span>
-<span class="source-line-no">6030</span><span id="line-6030"></span>
-<span class="source-line-no">6031</span><span id="line-6031">          // invoke prepareFlushCache. Send null as wal since we do not want the flush events in wal</span>
-<span class="source-line-no">6032</span><span id="line-6032">          PrepareFlushResult prepareResult = internalPrepareFlushCache(null, flushSeqId,</span>
-<span class="source-line-no">6033</span><span id="line-6033">            storesToFlush, status, false, FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">6034</span><span id="line-6034">          if (prepareResult.result == null) {</span>
-<span class="source-line-no">6035</span><span id="line-6035">            // save the PrepareFlushResult so that we can use it later from commit flush</span>
-<span class="source-line-no">6036</span><span id="line-6036">            this.writestate.flushing = true;</span>
-<span class="source-line-no">6037</span><span id="line-6037">            this.prepareFlushResult = prepareResult;</span>
-<span class="source-line-no">6038</span><span id="line-6038">            status.markComplete("Flush prepare successful");</span>
-<span class="source-line-no">6039</span><span id="line-6039">            if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6040</span><span id="line-6040">              LOG.debug(getRegionInfo().getEncodedName() + " : " + " Prepared flush with seqId:"</span>
-<span class="source-line-no">6041</span><span id="line-6041">                + flush.getFlushSequenceNumber());</span>
-<span class="source-line-no">6042</span><span id="line-6042">            }</span>
-<span class="source-line-no">6043</span><span id="line-6043">          } else {</span>
-<span class="source-line-no">6044</span><span id="line-6044">            // special case empty memstore. We will still save the flush result in this case, since</span>
-<span class="source-line-no">6045</span><span id="line-6045">            // our memstore ie empty, but the primary is still flushing</span>
-<span class="source-line-no">6046</span><span id="line-6046">            if (</span>
-<span class="source-line-no">6047</span><span id="line-6047">              prepareResult.getResult().getResult()</span>
-<span class="source-line-no">6048</span><span id="line-6048">                  == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY</span>
-<span class="source-line-no">6049</span><span id="line-6049">            ) {</span>
-<span class="source-line-no">6050</span><span id="line-6050">              this.writestate.flushing = true;</span>
-<span class="source-line-no">6051</span><span id="line-6051">              this.prepareFlushResult = prepareResult;</span>
-<span class="source-line-no">6052</span><span id="line-6052">              if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6053</span><span id="line-6053">                LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6054</span><span id="line-6054">                  + " Prepared empty flush with seqId:" + flush.getFlushSequenceNumber());</span>
-<span class="source-line-no">6055</span><span id="line-6055">              }</span>
-<span class="source-line-no">6056</span><span id="line-6056">            }</span>
-<span class="source-line-no">6057</span><span id="line-6057">            status.abort("Flush prepare failed with " + prepareResult.result);</span>
-<span class="source-line-no">6058</span><span id="line-6058">            // nothing much to do. prepare flush failed because of some reason.</span>
-<span class="source-line-no">6059</span><span id="line-6059">          }</span>
-<span class="source-line-no">6060</span><span id="line-6060">          return prepareResult;</span>
-<span class="source-line-no">6061</span><span id="line-6061">        } else {</span>
-<span class="source-line-no">6062</span><span id="line-6062">          // we already have an active snapshot.</span>
-<span class="source-line-no">6063</span><span id="line-6063">          if (flush.getFlushSequenceNumber() == this.prepareFlushResult.flushOpSeqId) {</span>
-<span class="source-line-no">6064</span><span id="line-6064">            // They define the same flush. Log and continue.</span>
-<span class="source-line-no">6065</span><span id="line-6065">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6066</span><span id="line-6066">              + "Received a flush prepare marker with the same seqId: "</span>
-<span class="source-line-no">6067</span><span id="line-6067">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
-<span class="source-line-no">6068</span><span id="line-6068">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
-<span class="source-line-no">6069</span><span id="line-6069">            // ignore</span>
-<span class="source-line-no">6070</span><span id="line-6070">          } else if (flush.getFlushSequenceNumber() &lt; this.prepareFlushResult.flushOpSeqId) {</span>
-<span class="source-line-no">6071</span><span id="line-6071">            // We received a flush with a smaller seqNum than what we have prepared. We can only</span>
-<span class="source-line-no">6072</span><span id="line-6072">            // ignore this prepare flush request.</span>
-<span class="source-line-no">6073</span><span id="line-6073">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6074</span><span id="line-6074">              + "Received a flush prepare marker with a smaller seqId: "</span>
-<span class="source-line-no">6075</span><span id="line-6075">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
-<span class="source-line-no">6076</span><span id="line-6076">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
-<span class="source-line-no">6077</span><span id="line-6077">            // ignore</span>
-<span class="source-line-no">6078</span><span id="line-6078">          } else {</span>
-<span class="source-line-no">6079</span><span id="line-6079">            // We received a flush with a larger seqNum than what we have prepared</span>
-<span class="source-line-no">6080</span><span id="line-6080">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6081</span><span id="line-6081">              + "Received a flush prepare marker with a larger seqId: "</span>
-<span class="source-line-no">6082</span><span id="line-6082">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
-<span class="source-line-no">6083</span><span id="line-6083">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
-<span class="source-line-no">6084</span><span id="line-6084">            // We do not have multiple active snapshots in the memstore or a way to merge current</span>
-<span class="source-line-no">6085</span><span id="line-6085">            // memstore snapshot with the contents and resnapshot for now. We cannot take</span>
-<span class="source-line-no">6086</span><span id="line-6086">            // another snapshot and drop the previous one because that will cause temporary</span>
-<span class="source-line-no">6087</span><span id="line-6087">            // data loss in the secondary. So we ignore this for now, deferring the resolution</span>
-<span class="source-line-no">6088</span><span id="line-6088">            // to happen when we see the corresponding flush commit marker. If we have a memstore</span>
-<span class="source-line-no">6089</span><span id="line-6089">            // snapshot with x, and later received another prepare snapshot with y (where x &lt; y),</span>
-<span class="source-line-no">6090</span><span id="line-6090">            // when we see flush commit for y, we will drop snapshot for x, and can also drop all</span>
-<span class="source-line-no">6091</span><span id="line-6091">            // the memstore edits if everything in memstore is &lt; y. This is the usual case for</span>
-<span class="source-line-no">6092</span><span id="line-6092">            // RS crash + recovery where we might see consequtive prepare flush wal markers.</span>
-<span class="source-line-no">6093</span><span id="line-6093">            // Otherwise, this will cause more memory to be used in secondary replica until a</span>
-<span class="source-line-no">6094</span><span id="line-6094">            // further prapare + commit flush is seen and replayed.</span>
-<span class="source-line-no">6095</span><span id="line-6095">          }</span>
-<span class="source-line-no">6096</span><span id="line-6096">        }</span>
-<span class="source-line-no">6097</span><span id="line-6097">      } finally {</span>
-<span class="source-line-no">6098</span><span id="line-6098">        status.cleanup();</span>
-<span class="source-line-no">6099</span><span id="line-6099">        writestate.notifyAll();</span>
-<span class="source-line-no">6100</span><span id="line-6100">      }</span>
-<span class="source-line-no">6101</span><span id="line-6101">    }</span>
-<span class="source-line-no">6102</span><span id="line-6102">    return null;</span>
-<span class="source-line-no">6103</span><span id="line-6103">  }</span>
-<span class="source-line-no">6104</span><span id="line-6104"></span>
-<span class="source-line-no">6105</span><span id="line-6105">  /**</span>
-<span class="source-line-no">6106</span><span id="line-6106">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">6107</span><span id="line-6107">   *             replica implementation.</span>
-<span class="source-line-no">6108</span><span id="line-6108">   */</span>
-<span class="source-line-no">6109</span><span id="line-6109">  @Deprecated</span>
-<span class="source-line-no">6110</span><span id="line-6110">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
-<span class="source-line-no">6111</span><span id="line-6111">      justification = "Intentional; post memstore flush")</span>
-<span class="source-line-no">6112</span><span id="line-6112">  void replayWALFlushCommitMarker(FlushDescriptor flush) throws IOException {</span>
-<span class="source-line-no">6113</span><span id="line-6113">    MonitoredTask status = TaskMonitor.get().createStatus("Committing flush " + this);</span>
-<span class="source-line-no">6114</span><span id="line-6114"></span>
-<span class="source-line-no">6115</span><span id="line-6115">    // check whether we have the memstore snapshot with the corresponding seqId. Replay to</span>
-<span class="source-line-no">6116</span><span id="line-6116">    // secondary region replicas are in order, except for when the region moves or then the</span>
-<span class="source-line-no">6117</span><span id="line-6117">    // region server crashes. In those cases, we may receive replay requests out of order from</span>
-<span class="source-line-no">6118</span><span id="line-6118">    // the original seqIds.</span>
-<span class="source-line-no">6119</span><span id="line-6119">    synchronized (writestate) {</span>
-<span class="source-line-no">6120</span><span id="line-6120">      try {</span>
-<span class="source-line-no">6121</span><span id="line-6121">        if (flush.getFlushSequenceNumber() &lt; lastReplayedOpenRegionSeqId) {</span>
-<span class="source-line-no">6122</span><span id="line-6122">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
-<span class="source-line-no">6123</span><span id="line-6123">            + TextFormat.shortDebugString(flush)</span>
-<span class="source-line-no">6124</span><span id="line-6124">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
-<span class="source-line-no">6125</span><span id="line-6125">            + " of " + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">6126</span><span id="line-6126">          return;</span>
-<span class="source-line-no">6127</span><span id="line-6127">        }</span>
-<span class="source-line-no">6128</span><span id="line-6128"></span>
-<span class="source-line-no">6129</span><span id="line-6129">        if (writestate.flushing) {</span>
-<span class="source-line-no">6130</span><span id="line-6130">          PrepareFlushResult prepareFlushResult = this.prepareFlushResult;</span>
-<span class="source-line-no">6131</span><span id="line-6131">          if (flush.getFlushSequenceNumber() == prepareFlushResult.flushOpSeqId) {</span>
-<span class="source-line-no">6132</span><span id="line-6132">            if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6133</span><span id="line-6133">              LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6134</span><span id="line-6134">                + "Received a flush commit marker with seqId:" + flush.getFlushSequenceNumber()</span>
-<span class="source-line-no">6135</span><span id="line-6135">                + " and a previous prepared snapshot was found");</span>
-<span class="source-line-no">6136</span><span id="line-6136">            }</span>
-<span class="source-line-no">6137</span><span id="line-6137">            // This is the regular case where we received commit flush after prepare flush</span>
-<span class="source-line-no">6138</span><span id="line-6138">            // corresponding to the same seqId.</span>
-<span class="source-line-no">6139</span><span id="line-6139">            replayFlushInStores(flush, prepareFlushResult, true);</span>
-<span class="source-line-no">6140</span><span id="line-6140"></span>
-<span class="source-line-no">6141</span><span id="line-6141">            // Set down the memstore size by amount of flush.</span>
-<span class="source-line-no">6142</span><span id="line-6142">            this.decrMemStoreSize(prepareFlushResult.totalFlushableSize.getMemStoreSize());</span>
-<span class="source-line-no">6143</span><span id="line-6143">            this.prepareFlushResult = null;</span>
-<span class="source-line-no">6144</span><span id="line-6144">            writestate.flushing = false;</span>
-<span class="source-line-no">6145</span><span id="line-6145">          } else if (flush.getFlushSequenceNumber() &lt; prepareFlushResult.flushOpSeqId) {</span>
-<span class="source-line-no">6146</span><span id="line-6146">            // This should not happen normally. However, lets be safe and guard against these cases</span>
-<span class="source-line-no">6147</span><span id="line-6147">            // we received a flush commit with a smaller seqId than what we have prepared</span>
-<span class="source-line-no">6148</span><span id="line-6148">            // we will pick the flush file up from this commit (if we have not seen it), but we</span>
-<span class="source-line-no">6149</span><span id="line-6149">            // will not drop the memstore</span>
-<span class="source-line-no">6150</span><span id="line-6150">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6151</span><span id="line-6151">              + "Received a flush commit marker with smaller seqId: "</span>
-<span class="source-line-no">6152</span><span id="line-6152">              + flush.getFlushSequenceNumber() + " than what we have prepared with seqId: "</span>
-<span class="source-line-no">6153</span><span id="line-6153">              + prepareFlushResult.flushOpSeqId + ". Picking up new file, but not dropping"</span>
-<span class="source-line-no">6154</span><span id="line-6154">              + "  prepared memstore snapshot");</span>
-<span class="source-line-no">6155</span><span id="line-6155">            replayFlushInStores(flush, prepareFlushResult, false);</span>
-<span class="source-line-no">6156</span><span id="line-6156"></span>
-<span class="source-line-no">6157</span><span id="line-6157">            // snapshot is not dropped, so memstore sizes should not be decremented</span>
-<span class="source-line-no">6158</span><span id="line-6158">            // we still have the prepared snapshot, flushing should still be true</span>
-<span class="source-line-no">6159</span><span id="line-6159">          } else {</span>
-<span class="source-line-no">6160</span><span id="line-6160">            // This should not happen normally. However, lets be safe and guard against these cases</span>
-<span class="source-line-no">6161</span><span id="line-6161">            // we received a flush commit with a larger seqId than what we have prepared</span>
-<span class="source-line-no">6162</span><span id="line-6162">            // we will pick the flush file for this. We will also obtain the updates lock and</span>
-<span class="source-line-no">6163</span><span id="line-6163">            // look for contents of the memstore to see whether we have edits after this seqId.</span>
-<span class="source-line-no">6164</span><span id="line-6164">            // If not, we will drop all the memstore edits and the snapshot as well.</span>
-<span class="source-line-no">6165</span><span id="line-6165">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6166</span><span id="line-6166">              + "Received a flush commit marker with larger seqId: "</span>
-<span class="source-line-no">6167</span><span id="line-6167">              + flush.getFlushSequenceNumber() + " than what we have prepared with seqId: "</span>
-<span class="source-line-no">6168</span><span id="line-6168">              + prepareFlushResult.flushOpSeqId + ". Picking up new file and dropping prepared"</span>
-<span class="source-line-no">6169</span><span id="line-6169">              + " memstore snapshot");</span>
-<span class="source-line-no">6170</span><span id="line-6170"></span>
-<span class="source-line-no">6171</span><span id="line-6171">            replayFlushInStores(flush, prepareFlushResult, true);</span>
-<span class="source-line-no">6172</span><span id="line-6172"></span>
-<span class="source-line-no">6173</span><span id="line-6173">            // Set down the memstore size by amount of flush.</span>
-<span class="source-line-no">6174</span><span id="line-6174">            this.decrMemStoreSize(prepareFlushResult.totalFlushableSize.getMemStoreSize());</span>
-<span class="source-line-no">6175</span><span id="line-6175"></span>
-<span class="source-line-no">6176</span><span id="line-6176">            // Inspect the memstore contents to see whether the memstore contains only edits</span>
-<span class="source-line-no">6177</span><span id="line-6177">            // with seqId smaller than the flush seqId. If so, we can discard those edits.</span>
-<span class="source-line-no">6178</span><span id="line-6178">            dropMemStoreContentsForSeqId(flush.getFlushSequenceNumber(), null);</span>
-<span class="source-line-no">6179</span><span id="line-6179"></span>
-<span class="source-line-no">6180</span><span id="line-6180">            this.prepareFlushResult = null;</span>
-<span class="source-line-no">6181</span><span id="line-6181">            writestate.flushing = false;</span>
-<span class="source-line-no">6182</span><span id="line-6182">          }</span>
-<span class="source-line-no">6183</span><span id="line-6183">          // If we were waiting for observing a flush or region opening event for not showing</span>
-<span class="source-line-no">6184</span><span id="line-6184">          // partial data after a secondary region crash, we can allow reads now. We can only make</span>
-<span class="source-line-no">6185</span><span id="line-6185">          // sure that we are not showing partial data (for example skipping some previous edits)</span>
-<span class="source-line-no">6186</span><span id="line-6186">          // until we observe a full flush start and flush commit. So if we were not able to find</span>
-<span class="source-line-no">6187</span><span id="line-6187">          // a previous flush we will not enable reads now.</span>
-<span class="source-line-no">6188</span><span id="line-6188">          this.setReadsEnabled(true);</span>
-<span class="source-line-no">6189</span><span id="line-6189">        } else {</span>
-<span class="source-line-no">6190</span><span id="line-6190">          LOG.warn(</span>
-<span class="source-line-no">6191</span><span id="line-6191">            getRegionInfo().getEncodedName() + " : " + "Received a flush commit marker with seqId:"</span>
-<span class="source-line-no">6192</span><span id="line-6192">              + flush.getFlushSequenceNumber() + ", but no previous prepared snapshot was found");</span>
-<span class="source-line-no">6193</span><span id="line-6193">          // There is no corresponding prepare snapshot from before.</span>
-<span class="source-line-no">6194</span><span id="line-6194">          // We will pick up the new flushed file</span>
-<span class="source-line-no">6195</span><span id="line-6195">          replayFlushInStores(flush, null, false);</span>
-<span class="source-line-no">6196</span><span id="line-6196"></span>
-<span class="source-line-no">6197</span><span id="line-6197">          // Inspect the memstore contents to see whether the memstore contains only edits</span>
-<span class="source-line-no">6198</span><span id="line-6198">          // with seqId smaller than the flush seqId. If so, we can discard those edits.</span>
-<span class="source-line-no">6199</span><span id="line-6199">          dropMemStoreContentsForSeqId(flush.getFlushSequenceNumber(), null);</span>
-<span class="source-line-no">6200</span><span id="line-6200">        }</span>
-<span class="source-line-no">6201</span><span id="line-6201"></span>
-<span class="source-line-no">6202</span><span id="line-6202">        status.markComplete("Flush commit successful");</span>
-<span class="source-line-no">6203</span><span id="line-6203"></span>
-<span class="source-line-no">6204</span><span id="line-6204">        // Update the last flushed sequence id for region.</span>
-<span class="source-line-no">6205</span><span id="line-6205">        this.maxFlushedSeqId = flush.getFlushSequenceNumber();</span>
-<span class="source-line-no">6206</span><span id="line-6206"></span>
-<span class="source-line-no">6207</span><span id="line-6207">        // advance the mvcc read point so that the new flushed file is visible.</span>
-<span class="source-line-no">6208</span><span id="line-6208">        mvcc.advanceTo(flush.getFlushSequenceNumber());</span>
+<span class="source-line-no">6009</span><span id="line-6009">  /**</span>
+<span class="source-line-no">6010</span><span id="line-6010">   * Replay the flush marker from primary region by creating a corresponding snapshot of the store</span>
+<span class="source-line-no">6011</span><span id="line-6011">   * memstores, only if the memstores do not have a higher seqId from an earlier wal edit (because</span>
+<span class="source-line-no">6012</span><span id="line-6012">   * the events may be coming out of order).</span>
+<span class="source-line-no">6013</span><span id="line-6013">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">6014</span><span id="line-6014">   *             replica implementation.</span>
+<span class="source-line-no">6015</span><span id="line-6015">   */</span>
+<span class="source-line-no">6016</span><span id="line-6016">  @Deprecated</span>
+<span class="source-line-no">6017</span><span id="line-6017">  PrepareFlushResult replayWALFlushStartMarker(FlushDescriptor flush) throws IOException {</span>
+<span class="source-line-no">6018</span><span id="line-6018">    long flushSeqId = flush.getFlushSequenceNumber();</span>
+<span class="source-line-no">6019</span><span id="line-6019"></span>
+<span class="source-line-no">6020</span><span id="line-6020">    Collection&lt;HStore&gt; storesToFlush = getStoresToFlush(flush);</span>
+<span class="source-line-no">6021</span><span id="line-6021"></span>
+<span class="source-line-no">6022</span><span id="line-6022">    MonitoredTask status = TaskMonitor.get().createStatus("Preparing flush " + this);</span>
+<span class="source-line-no">6023</span><span id="line-6023"></span>
+<span class="source-line-no">6024</span><span id="line-6024">    // we will use writestate as a coarse-grain lock for all the replay events</span>
+<span class="source-line-no">6025</span><span id="line-6025">    // (flush, compaction, region open etc)</span>
+<span class="source-line-no">6026</span><span id="line-6026">    synchronized (writestate) {</span>
+<span class="source-line-no">6027</span><span id="line-6027">      try {</span>
+<span class="source-line-no">6028</span><span id="line-6028">        if (flush.getFlushSequenceNumber() &lt; lastReplayedOpenRegionSeqId) {</span>
+<span class="source-line-no">6029</span><span id="line-6029">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
+<span class="source-line-no">6030</span><span id="line-6030">            + TextFormat.shortDebugString(flush)</span>
+<span class="source-line-no">6031</span><span id="line-6031">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
+<span class="source-line-no">6032</span><span id="line-6032">            + " of " + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">6033</span><span id="line-6033">          return null;</span>
+<span class="source-line-no">6034</span><span id="line-6034">        }</span>
+<span class="source-line-no">6035</span><span id="line-6035">        if (numMutationsWithoutWAL.sum() &gt; 0) {</span>
+<span class="source-line-no">6036</span><span id="line-6036">          numMutationsWithoutWAL.reset();</span>
+<span class="source-line-no">6037</span><span id="line-6037">          dataInMemoryWithoutWAL.reset();</span>
+<span class="source-line-no">6038</span><span id="line-6038">        }</span>
+<span class="source-line-no">6039</span><span id="line-6039"></span>
+<span class="source-line-no">6040</span><span id="line-6040">        if (!writestate.flushing) {</span>
+<span class="source-line-no">6041</span><span id="line-6041">          // we do not have an active snapshot and corresponding this.prepareResult. This means</span>
+<span class="source-line-no">6042</span><span id="line-6042">          // we can just snapshot our memstores and continue as normal.</span>
+<span class="source-line-no">6043</span><span id="line-6043"></span>
+<span class="source-line-no">6044</span><span id="line-6044">          // invoke prepareFlushCache. Send null as wal since we do not want the flush events in wal</span>
+<span class="source-line-no">6045</span><span id="line-6045">          PrepareFlushResult prepareResult = internalPrepareFlushCache(null, flushSeqId,</span>
+<span class="source-line-no">6046</span><span id="line-6046">            storesToFlush, status, false, FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">6047</span><span id="line-6047">          if (prepareResult.result == null) {</span>
+<span class="source-line-no">6048</span><span id="line-6048">            // save the PrepareFlushResult so that we can use it later from commit flush</span>
+<span class="source-line-no">6049</span><span id="line-6049">            this.writestate.flushing = true;</span>
+<span class="source-line-no">6050</span><span id="line-6050">            this.prepareFlushResult = prepareResult;</span>
+<span class="source-line-no">6051</span><span id="line-6051">            status.markComplete("Flush prepare successful");</span>
+<span class="source-line-no">6052</span><span id="line-6052">            if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6053</span><span id="line-6053">              LOG.debug(getRegionInfo().getEncodedName() + " : " + " Prepared flush with seqId:"</span>
+<span class="source-line-no">6054</span><span id="line-6054">                + flush.getFlushSequenceNumber());</span>
+<span class="source-line-no">6055</span><span id="line-6055">            }</span>
+<span class="source-line-no">6056</span><span id="line-6056">          } else {</span>
+<span class="source-line-no">6057</span><span id="line-6057">            // special case empty memstore. We will still save the flush result in this case, since</span>
+<span class="source-line-no">6058</span><span id="line-6058">            // our memstore ie empty, but the primary is still flushing</span>
+<span class="source-line-no">6059</span><span id="line-6059">            if (</span>
+<span class="source-line-no">6060</span><span id="line-6060">              prepareResult.getResult().getResult()</span>
+<span class="source-line-no">6061</span><span id="line-6061">                  == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY</span>
+<span class="source-line-no">6062</span><span id="line-6062">            ) {</span>
+<span class="source-line-no">6063</span><span id="line-6063">              this.writestate.flushing = true;</span>
+<span class="source-line-no">6064</span><span id="line-6064">              this.prepareFlushResult = prepareResult;</span>
+<span class="source-line-no">6065</span><span id="line-6065">              if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6066</span><span id="line-6066">                LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6067</span><span id="line-6067">                  + " Prepared empty flush with seqId:" + flush.getFlushSequenceNumber());</span>
+<span class="source-line-no">6068</span><span id="line-6068">              }</span>
+<span class="source-line-no">6069</span><span id="line-6069">            }</span>
+<span class="source-line-no">6070</span><span id="line-6070">            status.abort("Flush prepare failed with " + prepareResult.result);</span>
+<span class="source-line-no">6071</span><span id="line-6071">            // nothing much to do. prepare flush failed because of some reason.</span>
+<span class="source-line-no">6072</span><span id="line-6072">          }</span>
+<span class="source-line-no">6073</span><span id="line-6073">          return prepareResult;</span>
+<span class="source-line-no">6074</span><span id="line-6074">        } else {</span>
+<span class="source-line-no">6075</span><span id="line-6075">          // we already have an active snapshot.</span>
+<span class="source-line-no">6076</span><span id="line-6076">          if (flush.getFlushSequenceNumber() == this.prepareFlushResult.flushOpSeqId) {</span>
+<span class="source-line-no">6077</span><span id="line-6077">            // They define the same flush. Log and continue.</span>
+<span class="source-line-no">6078</span><span id="line-6078">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6079</span><span id="line-6079">              + "Received a flush prepare marker with the same seqId: "</span>
+<span class="source-line-no">6080</span><span id="line-6080">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
+<span class="source-line-no">6081</span><span id="line-6081">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
+<span class="source-line-no">6082</span><span id="line-6082">            // ignore</span>
+<span class="source-line-no">6083</span><span id="line-6083">          } else if (flush.getFlushSequenceNumber() &lt; this.prepareFlushResult.flushOpSeqId) {</span>
+<span class="source-line-no">6084</span><span id="line-6084">            // We received a flush with a smaller seqNum than what we have prepared. We can only</span>
+<span class="source-line-no">6085</span><span id="line-6085">            // ignore this prepare flush request.</span>
+<span class="source-line-no">6086</span><span id="line-6086">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6087</span><span id="line-6087">              + "Received a flush prepare marker with a smaller seqId: "</span>
+<span class="source-line-no">6088</span><span id="line-6088">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
+<span class="source-line-no">6089</span><span id="line-6089">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
+<span class="source-line-no">6090</span><span id="line-6090">            // ignore</span>
+<span class="source-line-no">6091</span><span id="line-6091">          } else {</span>
+<span class="source-line-no">6092</span><span id="line-6092">            // We received a flush with a larger seqNum than what we have prepared</span>
+<span class="source-line-no">6093</span><span id="line-6093">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6094</span><span id="line-6094">              + "Received a flush prepare marker with a larger seqId: "</span>
+<span class="source-line-no">6095</span><span id="line-6095">              + +flush.getFlushSequenceNumber() + " before clearing the previous one with seqId: "</span>
+<span class="source-line-no">6096</span><span id="line-6096">              + prepareFlushResult.flushOpSeqId + ". Ignoring");</span>
+<span class="source-line-no">6097</span><span id="line-6097">            // We do not have multiple active snapshots in the memstore or a way to merge current</span>
+<span class="source-line-no">6098</span><span id="line-6098">            // memstore snapshot with the contents and resnapshot for now. We cannot take</span>
+<span class="source-line-no">6099</span><span id="line-6099">            // another snapshot and drop the previous one because that will cause temporary</span>
+<span class="source-line-no">6100</span><span id="line-6100">            // data loss in the secondary. So we ignore this for now, deferring the resolution</span>
+<span class="source-line-no">6101</span><span id="line-6101">            // to happen when we see the corresponding flush commit marker. If we have a memstore</span>
+<span class="source-line-no">6102</span><span id="line-6102">            // snapshot with x, and later received another prepare snapshot with y (where x &lt; y),</span>
+<span class="source-line-no">6103</span><span id="line-6103">            // when we see flush commit for y, we will drop snapshot for x, and can also drop all</span>
+<span class="source-line-no">6104</span><span id="line-6104">            // the memstore edits if everything in memstore is &lt; y. This is the usual case for</span>
+<span class="source-line-no">6105</span><span id="line-6105">            // RS crash + recovery where we might see consequtive prepare flush wal markers.</span>
+<span class="source-line-no">6106</span><span id="line-6106">            // Otherwise, this will cause more memory to be used in secondary replica until a</span>
+<span class="source-line-no">6107</span><span id="line-6107">            // further prapare + commit flush is seen and replayed.</span>
+<span class="source-line-no">6108</span><span id="line-6108">          }</span>
+<span class="source-line-no">6109</span><span id="line-6109">        }</span>
+<span class="source-line-no">6110</span><span id="line-6110">      } finally {</span>
+<span class="source-line-no">6111</span><span id="line-6111">        status.cleanup();</span>
+<span class="source-line-no">6112</span><span id="line-6112">        writestate.notifyAll();</span>
+<span class="source-line-no">6113</span><span id="line-6113">      }</span>
+<span class="source-line-no">6114</span><span id="line-6114">    }</span>
+<span class="source-line-no">6115</span><span id="line-6115">    return null;</span>
+<span class="source-line-no">6116</span><span id="line-6116">  }</span>
+<span class="source-line-no">6117</span><span id="line-6117"></span>
+<span class="source-line-no">6118</span><span id="line-6118">  /**</span>
+<span class="source-line-no">6119</span><span id="line-6119">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">6120</span><span id="line-6120">   *             replica implementation.</span>
+<span class="source-line-no">6121</span><span id="line-6121">   */</span>
+<span class="source-line-no">6122</span><span id="line-6122">  @Deprecated</span>
+<span class="source-line-no">6123</span><span id="line-6123">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
+<span class="source-line-no">6124</span><span id="line-6124">      justification = "Intentional; post memstore flush")</span>
+<span class="source-line-no">6125</span><span id="line-6125">  void replayWALFlushCommitMarker(FlushDescriptor flush) throws IOException {</span>
+<span class="source-line-no">6126</span><span id="line-6126">    MonitoredTask status = TaskMonitor.get().createStatus("Committing flush " + this);</span>
+<span class="source-line-no">6127</span><span id="line-6127"></span>
+<span class="source-line-no">6128</span><span id="line-6128">    // check whether we have the memstore snapshot with the corresponding seqId. Replay to</span>
+<span class="source-line-no">6129</span><span id="line-6129">    // secondary region replicas are in order, except for when the region moves or then the</span>
+<span class="source-line-no">6130</span><span id="line-6130">    // region server crashes. In those cases, we may receive replay requests out of order from</span>
+<span class="source-line-no">6131</span><span id="line-6131">    // the original seqIds.</span>
+<span class="source-line-no">6132</span><span id="line-6132">    synchronized (writestate) {</span>
+<span class="source-line-no">6133</span><span id="line-6133">      try {</span>
+<span class="source-line-no">6134</span><span id="line-6134">        if (flush.getFlushSequenceNumber() &lt; lastReplayedOpenRegionSeqId) {</span>
+<span class="source-line-no">6135</span><span id="line-6135">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
+<span class="source-line-no">6136</span><span id="line-6136">            + TextFormat.shortDebugString(flush)</span>
+<span class="source-line-no">6137</span><span id="line-6137">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
+<span class="source-line-no">6138</span><span id="line-6138">            + " of " + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">6139</span><span id="line-6139">          return;</span>
+<span class="source-line-no">6140</span><span id="line-6140">        }</span>
+<span class="source-line-no">6141</span><span id="line-6141"></span>
+<span class="source-line-no">6142</span><span id="line-6142">        if (writestate.flushing) {</span>
+<span class="source-line-no">6143</span><span id="line-6143">          PrepareFlushResult prepareFlushResult = this.prepareFlushResult;</span>
+<span class="source-line-no">6144</span><span id="line-6144">          if (flush.getFlushSequenceNumber() == prepareFlushResult.flushOpSeqId) {</span>
+<span class="source-line-no">6145</span><span id="line-6145">            if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6146</span><span id="line-6146">              LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6147</span><span id="line-6147">                + "Received a flush commit marker with seqId:" + flush.getFlushSequenceNumber()</span>
+<span class="source-line-no">6148</span><span id="line-6148">                + " and a previous prepared snapshot was found");</span>
+<span class="source-line-no">6149</span><span id="line-6149">            }</span>
+<span class="source-line-no">6150</span><span id="line-6150">            // This is the regular case where we received commit flush after prepare flush</span>
+<span class="source-line-no">6151</span><span id="line-6151">            // corresponding to the same seqId.</span>
+<span class="source-line-no">6152</span><span id="line-6152">            replayFlushInStores(flush, prepareFlushResult, true);</span>
+<span class="source-line-no">6153</span><span id="line-6153"></span>
+<span class="source-line-no">6154</span><span id="line-6154">            // Set down the memstore size by amount of flush.</span>
+<span class="source-line-no">6155</span><span id="line-6155">            this.decrMemStoreSize(prepareFlushResult.totalFlushableSize.getMemStoreSize());</span>
+<span class="source-line-no">6156</span><span id="line-6156">            this.prepareFlushResult = null;</span>
+<span class="source-line-no">6157</span><span id="line-6157">            writestate.flushing = false;</span>
+<span class="source-line-no">6158</span><span id="line-6158">          } else if (flush.getFlushSequenceNumber() &lt; prepareFlushResult.flushOpSeqId) {</span>
+<span class="source-line-no">6159</span><span id="line-6159">            // This should not happen normally. However, lets be safe and guard against these cases</span>
+<span class="source-line-no">6160</span><span id="line-6160">            // we received a flush commit with a smaller seqId than what we have prepared</span>
+<span class="source-line-no">6161</span><span id="line-6161">            // we will pick the flush file up from this commit (if we have not seen it), but we</span>
+<span class="source-line-no">6162</span><span id="line-6162">            // will not drop the memstore</span>
+<span class="source-line-no">6163</span><span id="line-6163">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6164</span><span id="line-6164">              + "Received a flush commit marker with smaller seqId: "</span>
+<span class="source-line-no">6165</span><span id="line-6165">              + flush.getFlushSequenceNumber() + " than what we have prepared with seqId: "</span>
+<span class="source-line-no">6166</span><span id="line-6166">              + prepareFlushResult.flushOpSeqId + ". Picking up new file, but not dropping"</span>
+<span class="source-line-no">6167</span><span id="line-6167">              + "  prepared memstore snapshot");</span>
+<span class="source-line-no">6168</span><span id="line-6168">            replayFlushInStores(flush, prepareFlushResult, false);</span>
+<span class="source-line-no">6169</span><span id="line-6169"></span>
+<span class="source-line-no">6170</span><span id="line-6170">            // snapshot is not dropped, so memstore sizes should not be decremented</span>
+<span class="source-line-no">6171</span><span id="line-6171">            // we still have the prepared snapshot, flushing should still be true</span>
+<span class="source-line-no">6172</span><span id="line-6172">          } else {</span>
+<span class="source-line-no">6173</span><span id="line-6173">            // This should not happen normally. However, lets be safe and guard against these cases</span>
+<span class="source-line-no">6174</span><span id="line-6174">            // we received a flush commit with a larger seqId than what we have prepared</span>
+<span class="source-line-no">6175</span><span id="line-6175">            // we will pick the flush file for this. We will also obtain the updates lock and</span>
+<span class="source-line-no">6176</span><span id="line-6176">            // look for contents of the memstore to see whether we have edits after this seqId.</span>
+<span class="source-line-no">6177</span><span id="line-6177">            // If not, we will drop all the memstore edits and the snapshot as well.</span>
+<span class="source-line-no">6178</span><span id="line-6178">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6179</span><span id="line-6179">              + "Received a flush commit marker with larger seqId: "</span>
+<span class="source-line-no">6180</span><span id="line-6180">              + flush.getFlushSequenceNumber() + " than what we have prepared with seqId: "</span>
+<span class="source-line-no">6181</span><span id="line-6181">              + prepareFlushResult.flushOpSeqId + ". Picking up new file and dropping prepared"</span>
+<span class="source-line-no">6182</span><span id="line-6182">              + " memstore snapshot");</span>
+<span class="source-line-no">6183</span><span id="line-6183"></span>
+<span class="source-line-no">6184</span><span id="line-6184">            replayFlushInStores(flush, prepareFlushResult, true);</span>
+<span class="source-line-no">6185</span><span id="line-6185"></span>
+<span class="source-line-no">6186</span><span id="line-6186">            // Set down the memstore size by amount of flush.</span>
+<span class="source-line-no">6187</span><span id="line-6187">            this.decrMemStoreSize(prepareFlushResult.totalFlushableSize.getMemStoreSize());</span>
+<span class="source-line-no">6188</span><span id="line-6188"></span>
+<span class="source-line-no">6189</span><span id="line-6189">            // Inspect the memstore contents to see whether the memstore contains only edits</span>
+<span class="source-line-no">6190</span><span id="line-6190">            // with seqId smaller than the flush seqId. If so, we can discard those edits.</span>
+<span class="source-line-no">6191</span><span id="line-6191">            dropMemStoreContentsForSeqId(flush.getFlushSequenceNumber(), null);</span>
+<span class="source-line-no">6192</span><span id="line-6192"></span>
+<span class="source-line-no">6193</span><span id="line-6193">            this.prepareFlushResult = null;</span>
+<span class="source-line-no">6194</span><span id="line-6194">            writestate.flushing = false;</span>
+<span class="source-line-no">6195</span><span id="line-6195">          }</span>
+<span class="source-line-no">6196</span><span id="line-6196">          // If we were waiting for observing a flush or region opening event for not showing</span>
+<span class="source-line-no">6197</span><span id="line-6197">          // partial data after a secondary region crash, we can allow reads now. We can only make</span>
+<span class="source-line-no">6198</span><span id="line-6198">          // sure that we are not showing partial data (for example skipping some previous edits)</span>
+<span class="source-line-no">6199</span><span id="line-6199">          // until we observe a full flush start and flush commit. So if we were not able to find</span>
+<span class="source-line-no">6200</span><span id="line-6200">          // a previous flush we will not enable reads now.</span>
+<span class="source-line-no">6201</span><span id="line-6201">          this.setReadsEnabled(true);</span>
+<span class="source-line-no">6202</span><span id="line-6202">        } else {</span>
+<span class="source-line-no">6203</span><span id="line-6203">          LOG.warn(</span>
+<span class="source-line-no">6204</span><span id="line-6204">            getRegionInfo().getEncodedName() + " : " + "Received a flush commit marker with seqId:"</span>
+<span class="source-line-no">6205</span><span id="line-6205">              + flush.getFlushSequenceNumber() + ", but no previous prepared snapshot was found");</span>
+<span class="source-line-no">6206</span><span id="line-6206">          // There is no corresponding prepare snapshot from before.</span>
+<span class="source-line-no">6207</span><span id="line-6207">          // We will pick up the new flushed file</span>
+<span class="source-line-no">6208</span><span id="line-6208">          replayFlushInStores(flush, null, false);</span>
 <span class="source-line-no">6209</span><span id="line-6209"></span>
-<span class="source-line-no">6210</span><span id="line-6210">      } catch (FileNotFoundException ex) {</span>
-<span class="source-line-no">6211</span><span id="line-6211">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6212</span><span id="line-6212">          + "At least one of the store files in flush: " + TextFormat.shortDebugString(flush)</span>
-<span class="source-line-no">6213</span><span id="line-6213">          + " doesn't exist any more. Skip loading the file(s)", ex);</span>
-<span class="source-line-no">6214</span><span id="line-6214">      } finally {</span>
-<span class="source-line-no">6215</span><span id="line-6215">        status.cleanup();</span>
-<span class="source-line-no">6216</span><span id="line-6216">        writestate.notifyAll();</span>
-<span class="source-line-no">6217</span><span id="line-6217">      }</span>
-<span class="source-line-no">6218</span><span id="line-6218">    }</span>
+<span class="source-line-no">6210</span><span id="line-6210">          // Inspect the memstore contents to see whether the memstore contains only edits</span>
+<span class="source-line-no">6211</span><span id="line-6211">          // with seqId smaller than the flush seqId. If so, we can discard those edits.</span>
+<span class="source-line-no">6212</span><span id="line-6212">          dropMemStoreContentsForSeqId(flush.getFlushSequenceNumber(), null);</span>
+<span class="source-line-no">6213</span><span id="line-6213">        }</span>
+<span class="source-line-no">6214</span><span id="line-6214"></span>
+<span class="source-line-no">6215</span><span id="line-6215">        status.markComplete("Flush commit successful");</span>
+<span class="source-line-no">6216</span><span id="line-6216"></span>
+<span class="source-line-no">6217</span><span id="line-6217">        // Update the last flushed sequence id for region.</span>
+<span class="source-line-no">6218</span><span id="line-6218">        this.maxFlushedSeqId = flush.getFlushSequenceNumber();</span>
 <span class="source-line-no">6219</span><span id="line-6219"></span>
-<span class="source-line-no">6220</span><span id="line-6220">    // C. Finally notify anyone waiting on memstore to clear:</span>
-<span class="source-line-no">6221</span><span id="line-6221">    // e.g. checkResources().</span>
-<span class="source-line-no">6222</span><span id="line-6222">    synchronized (this) {</span>
-<span class="source-line-no">6223</span><span id="line-6223">      notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
-<span class="source-line-no">6224</span><span id="line-6224">    }</span>
-<span class="source-line-no">6225</span><span id="line-6225">  }</span>
-<span class="source-line-no">6226</span><span id="line-6226"></span>
-<span class="source-line-no">6227</span><span id="line-6227">  /**</span>
-<span class="source-line-no">6228</span><span id="line-6228">   * Replays the given flush descriptor by opening the flush files in stores and dropping the</span>
-<span class="source-line-no">6229</span><span id="line-6229">   * memstore snapshots if requested.</span>
-<span class="source-line-no">6230</span><span id="line-6230">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">6231</span><span id="line-6231">   *             replica implementation.</span>
-<span class="source-line-no">6232</span><span id="line-6232">   */</span>
-<span class="source-line-no">6233</span><span id="line-6233">  @Deprecated</span>
-<span class="source-line-no">6234</span><span id="line-6234">  private void replayFlushInStores(FlushDescriptor flush, PrepareFlushResult prepareFlushResult,</span>
-<span class="source-line-no">6235</span><span id="line-6235">    boolean dropMemstoreSnapshot) throws IOException {</span>
-<span class="source-line-no">6236</span><span id="line-6236">    for (StoreFlushDescriptor storeFlush : flush.getStoreFlushesList()) {</span>
-<span class="source-line-no">6237</span><span id="line-6237">      byte[] family = storeFlush.getFamilyName().toByteArray();</span>
-<span class="source-line-no">6238</span><span id="line-6238">      HStore store = getStore(family);</span>
-<span class="source-line-no">6239</span><span id="line-6239">      if (store == null) {</span>
-<span class="source-line-no">6240</span><span id="line-6240">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6241</span><span id="line-6241">          + "Received a flush commit marker from primary, but the family is not found."</span>
-<span class="source-line-no">6242</span><span id="line-6242">          + "Ignoring StoreFlushDescriptor:" + storeFlush);</span>
-<span class="source-line-no">6243</span><span id="line-6243">        continue;</span>
-<span class="source-line-no">6244</span><span id="line-6244">      }</span>
-<span class="source-line-no">6245</span><span id="line-6245">      List&lt;String&gt; flushFiles = storeFlush.getFlushOutputList();</span>
-<span class="source-line-no">6246</span><span id="line-6246">      StoreFlushContext ctx = null;</span>
-<span class="source-line-no">6247</span><span id="line-6247">      long startTime = EnvironmentEdgeManager.currentTime();</span>
-<span class="source-line-no">6248</span><span id="line-6248">      if (prepareFlushResult == null || prepareFlushResult.storeFlushCtxs == null) {</span>
-<span class="source-line-no">6249</span><span id="line-6249">        ctx = store.createFlushContext(flush.getFlushSequenceNumber(), FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">6250</span><span id="line-6250">      } else {</span>
-<span class="source-line-no">6251</span><span id="line-6251">        ctx = prepareFlushResult.storeFlushCtxs.get(family);</span>
-<span class="source-line-no">6252</span><span id="line-6252">        startTime = prepareFlushResult.startTime;</span>
-<span class="source-line-no">6253</span><span id="line-6253">      }</span>
-<span class="source-line-no">6254</span><span id="line-6254"></span>
-<span class="source-line-no">6255</span><span id="line-6255">      if (ctx == null) {</span>
-<span class="source-line-no">6256</span><span id="line-6256">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6257</span><span id="line-6257">          + "Unexpected: flush commit marker received from store " + Bytes.toString(family)</span>
-<span class="source-line-no">6258</span><span id="line-6258">          + " but no associated flush context. Ignoring");</span>
-<span class="source-line-no">6259</span><span id="line-6259">        continue;</span>
-<span class="source-line-no">6260</span><span id="line-6260">      }</span>
-<span class="source-line-no">6261</span><span id="line-6261"></span>
-<span class="source-line-no">6262</span><span id="line-6262">      ctx.replayFlush(flushFiles, dropMemstoreSnapshot); // replay the flush</span>
-<span class="source-line-no">6263</span><span id="line-6263"></span>
-<span class="source-line-no">6264</span><span id="line-6264">      // Record latest flush time</span>
-<span class="source-line-no">6265</span><span id="line-6265">      this.lastStoreFlushTimeMap.put(store, startTime);</span>
-<span class="source-line-no">6266</span><span id="line-6266">    }</span>
-<span class="source-line-no">6267</span><span id="line-6267">  }</span>
-<span class="source-line-no">6268</span><span id="line-6268"></span>
-<span class="source-line-no">6269</span><span id="line-6269">  private long loadRecoveredHFilesIfAny(Collection&lt;HStore&gt; stores) throws IOException {</span>
-<span class="source-line-no">6270</span><span id="line-6270">    Path regionDir = fs.getRegionDir();</span>
-<span class="source-line-no">6271</span><span id="line-6271">    long maxSeqId = -1;</span>
-<span class="source-line-no">6272</span><span id="line-6272">    for (HStore store : stores) {</span>
-<span class="source-line-no">6273</span><span id="line-6273">      String familyName = store.getColumnFamilyName();</span>
-<span class="source-line-no">6274</span><span id="line-6274">      FileStatus[] files =</span>
-<span class="source-line-no">6275</span><span id="line-6275">        WALSplitUtil.getRecoveredHFiles(fs.getFileSystem(), regionDir, familyName);</span>
-<span class="source-line-no">6276</span><span id="line-6276">      if (files != null &amp;&amp; files.length != 0) {</span>
-<span class="source-line-no">6277</span><span id="line-6277">        for (FileStatus file : files) {</span>
-<span class="source-line-no">6278</span><span id="line-6278">          Path filePath = file.getPath();</span>
-<span class="source-line-no">6279</span><span id="line-6279">          // If file length is zero then delete it</span>
-<span class="source-line-no">6280</span><span id="line-6280">          if (isZeroLengthThenDelete(fs.getFileSystem(), file, filePath)) {</span>
-<span class="source-line-no">6281</span><span id="line-6281">            continue;</span>
-<span class="source-line-no">6282</span><span id="line-6282">          }</span>
-<span class="source-line-no">6283</span><span id="line-6283">          try {</span>
-<span class="source-line-no">6284</span><span id="line-6284">            HStoreFile storefile = store.tryCommitRecoveredHFile(file.getPath());</span>
-<span class="source-line-no">6285</span><span id="line-6285">            maxSeqId = Math.max(maxSeqId, storefile.getReader().getSequenceID());</span>
-<span class="source-line-no">6286</span><span id="line-6286">          } catch (IOException e) {</span>
-<span class="source-line-no">6287</span><span id="line-6287">            handleException(fs.getFileSystem(), filePath, e);</span>
-<span class="source-line-no">6288</span><span id="line-6288">            continue;</span>
-<span class="source-line-no">6289</span><span id="line-6289">          }</span>
-<span class="source-line-no">6290</span><span id="line-6290">        }</span>
-<span class="source-line-no">6291</span><span id="line-6291">        if (this.rsServices != null &amp;&amp; store.needsCompaction()) {</span>
-<span class="source-line-no">6292</span><span id="line-6292">          this.rsServices.getCompactionRequestor().requestCompaction(this, store,</span>
-<span class="source-line-no">6293</span><span id="line-6293">            "load recovered hfiles request compaction", Store.PRIORITY_USER + 1,</span>
-<span class="source-line-no">6294</span><span id="line-6294">            CompactionLifeCycleTracker.DUMMY, null);</span>
-<span class="source-line-no">6295</span><span id="line-6295">        }</span>
-<span class="source-line-no">6296</span><span id="line-6296">      }</span>
-<span class="source-line-no">6297</span><span id="line-6297">    }</span>
-<span class="source-line-no">6298</span><span id="line-6298">    return maxSeqId;</span>
-<span class="source-line-no">6299</span><span id="line-6299">  }</span>
-<span class="source-line-no">6300</span><span id="line-6300"></span>
-<span class="source-line-no">6301</span><span id="line-6301">  /**</span>
-<span class="source-line-no">6302</span><span id="line-6302">   * Be careful, this method will drop all data in the memstore of this region. Currently, this</span>
-<span class="source-line-no">6303</span><span id="line-6303">   * method is used to drop memstore to prevent memory leak when replaying recovered.edits while</span>
-<span class="source-line-no">6304</span><span id="line-6304">   * opening region.</span>
-<span class="source-line-no">6305</span><span id="line-6305">   */</span>
-<span class="source-line-no">6306</span><span id="line-6306">  private MemStoreSize dropMemStoreContents() throws IOException {</span>
-<span class="source-line-no">6307</span><span id="line-6307">    MemStoreSizing totalFreedSize = new NonThreadSafeMemStoreSizing();</span>
-<span class="source-line-no">6308</span><span id="line-6308">    this.updatesLock.writeLock().lock();</span>
-<span class="source-line-no">6309</span><span id="line-6309">    try {</span>
-<span class="source-line-no">6310</span><span id="line-6310">      for (HStore s : stores.values()) {</span>
-<span class="source-line-no">6311</span><span id="line-6311">        MemStoreSize memStoreSize = doDropStoreMemStoreContentsForSeqId(s, HConstants.NO_SEQNUM);</span>
-<span class="source-line-no">6312</span><span id="line-6312">        LOG.info("Drop memstore for Store " + s.getColumnFamilyName() + " in region "</span>
-<span class="source-line-no">6313</span><span id="line-6313">          + this.getRegionInfo().getRegionNameAsString() + " , dropped memstoresize: ["</span>
-<span class="source-line-no">6314</span><span id="line-6314">          + memStoreSize + " }");</span>
-<span class="source-line-no">6315</span><span id="line-6315">        totalFreedSize.incMemStoreSize(memStoreSize);</span>
-<span class="source-line-no">6316</span><span id="line-6316">      }</span>
-<span class="source-line-no">6317</span><span id="line-6317">      return totalFreedSize.getMemStoreSize();</span>
-<span class="source-line-no">6318</span><span id="line-6318">    } finally {</span>
-<span class="source-line-no">6319</span><span id="line-6319">      this.updatesLock.writeLock().unlock();</span>
-<span class="source-line-no">6320</span><span id="line-6320">    }</span>
-<span class="source-line-no">6321</span><span id="line-6321">  }</span>
-<span class="source-line-no">6322</span><span id="line-6322"></span>
-<span class="source-line-no">6323</span><span id="line-6323">  /**</span>
-<span class="source-line-no">6324</span><span id="line-6324">   * Drops the memstore contents after replaying a flush descriptor or region open event replay if</span>
-<span class="source-line-no">6325</span><span id="line-6325">   * the memstore edits have seqNums smaller than the given seq id</span>
-<span class="source-line-no">6326</span><span id="line-6326">   */</span>
-<span class="source-line-no">6327</span><span id="line-6327">  private MemStoreSize dropMemStoreContentsForSeqId(long seqId, HStore store) throws IOException {</span>
-<span class="source-line-no">6328</span><span id="line-6328">    MemStoreSizing totalFreedSize = new NonThreadSafeMemStoreSizing();</span>
-<span class="source-line-no">6329</span><span id="line-6329">    this.updatesLock.writeLock().lock();</span>
-<span class="source-line-no">6330</span><span id="line-6330">    try {</span>
-<span class="source-line-no">6331</span><span id="line-6331"></span>
-<span class="source-line-no">6332</span><span id="line-6332">      long currentSeqId = mvcc.getReadPoint();</span>
-<span class="source-line-no">6333</span><span id="line-6333">      if (seqId &gt;= currentSeqId) {</span>
-<span class="source-line-no">6334</span><span id="line-6334">        // then we can drop the memstore contents since everything is below this seqId</span>
-<span class="source-line-no">6335</span><span id="line-6335">        LOG.info(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6336</span><span id="line-6336">          + "Dropping memstore contents as well since replayed flush seqId: " + seqId</span>
-<span class="source-line-no">6337</span><span id="line-6337">          + " is greater than current seqId:" + currentSeqId);</span>
-<span class="source-line-no">6338</span><span id="line-6338"></span>
-<span class="source-line-no">6339</span><span id="line-6339">        // Prepare flush (take a snapshot) and then abort (drop the snapshot)</span>
-<span class="source-line-no">6340</span><span id="line-6340">        if (store == null) {</span>
-<span class="source-line-no">6341</span><span id="line-6341">          for (HStore s : stores.values()) {</span>
-<span class="source-line-no">6342</span><span id="line-6342">            totalFreedSize.incMemStoreSize(doDropStoreMemStoreContentsForSeqId(s, currentSeqId));</span>
-<span class="source-line-no">6343</span><span id="line-6343">          }</span>
-<span class="source-line-no">6344</span><span id="line-6344">        } else {</span>
-<span class="source-line-no">6345</span><span id="line-6345">          totalFreedSize.incMemStoreSize(doDropStoreMemStoreContentsForSeqId(store, currentSeqId));</span>
-<span class="source-line-no">6346</span><span id="line-6346">        }</span>
-<span class="source-line-no">6347</span><span id="line-6347">      } else {</span>
+<span class="source-line-no">6220</span><span id="line-6220">        // advance the mvcc read point so that the new flushed file is visible.</span>
+<span class="source-line-no">6221</span><span id="line-6221">        mvcc.advanceTo(flush.getFlushSequenceNumber());</span>
+<span class="source-line-no">6222</span><span id="line-6222"></span>
+<span class="source-line-no">6223</span><span id="line-6223">      } catch (FileNotFoundException ex) {</span>
+<span class="source-line-no">6224</span><span id="line-6224">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6225</span><span id="line-6225">          + "At least one of the store files in flush: " + TextFormat.shortDebugString(flush)</span>
+<span class="source-line-no">6226</span><span id="line-6226">          + " doesn't exist any more. Skip loading the file(s)", ex);</span>
+<span class="source-line-no">6227</span><span id="line-6227">      } finally {</span>
+<span class="source-line-no">6228</span><span id="line-6228">        status.cleanup();</span>
+<span class="source-line-no">6229</span><span id="line-6229">        writestate.notifyAll();</span>
+<span class="source-line-no">6230</span><span id="line-6230">      }</span>
+<span class="source-line-no">6231</span><span id="line-6231">    }</span>
+<span class="source-line-no">6232</span><span id="line-6232"></span>
+<span class="source-line-no">6233</span><span id="line-6233">    // C. Finally notify anyone waiting on memstore to clear:</span>
+<span class="source-line-no">6234</span><span id="line-6234">    // e.g. checkResources().</span>
+<span class="source-line-no">6235</span><span id="line-6235">    synchronized (this) {</span>
+<span class="source-line-no">6236</span><span id="line-6236">      notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
+<span class="source-line-no">6237</span><span id="line-6237">    }</span>
+<span class="source-line-no">6238</span><span id="line-6238">  }</span>
+<span class="source-line-no">6239</span><span id="line-6239"></span>
+<span class="source-line-no">6240</span><span id="line-6240">  /**</span>
+<span class="source-line-no">6241</span><span id="line-6241">   * Replays the given flush descriptor by opening the flush files in stores and dropping the</span>
+<span class="source-line-no">6242</span><span id="line-6242">   * memstore snapshots if requested.</span>
+<span class="source-line-no">6243</span><span id="line-6243">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">6244</span><span id="line-6244">   *             replica implementation.</span>
+<span class="source-line-no">6245</span><span id="line-6245">   */</span>
+<span class="source-line-no">6246</span><span id="line-6246">  @Deprecated</span>
+<span class="source-line-no">6247</span><span id="line-6247">  private void replayFlushInStores(FlushDescriptor flush, PrepareFlushResult prepareFlushResult,</span>
+<span class="source-line-no">6248</span><span id="line-6248">    boolean dropMemstoreSnapshot) throws IOException {</span>
+<span class="source-line-no">6249</span><span id="line-6249">    for (StoreFlushDescriptor storeFlush : flush.getStoreFlushesList()) {</span>
+<span class="source-line-no">6250</span><span id="line-6250">      byte[] family = storeFlush.getFamilyName().toByteArray();</span>
+<span class="source-line-no">6251</span><span id="line-6251">      HStore store = getStore(family);</span>
+<span class="source-line-no">6252</span><span id="line-6252">      if (store == null) {</span>
+<span class="source-line-no">6253</span><span id="line-6253">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6254</span><span id="line-6254">          + "Received a flush commit marker from primary, but the family is not found."</span>
+<span class="source-line-no">6255</span><span id="line-6255">          + "Ignoring StoreFlushDescriptor:" + storeFlush);</span>
+<span class="source-line-no">6256</span><span id="line-6256">        continue;</span>
+<span class="source-line-no">6257</span><span id="line-6257">      }</span>
+<span class="source-line-no">6258</span><span id="line-6258">      List&lt;String&gt; flushFiles = storeFlush.getFlushOutputList();</span>
+<span class="source-line-no">6259</span><span id="line-6259">      StoreFlushContext ctx = null;</span>
+<span class="source-line-no">6260</span><span id="line-6260">      long startTime = EnvironmentEdgeManager.currentTime();</span>
+<span class="source-line-no">6261</span><span id="line-6261">      if (prepareFlushResult == null || prepareFlushResult.storeFlushCtxs == null) {</span>
+<span class="source-line-no">6262</span><span id="line-6262">        ctx = store.createFlushContext(flush.getFlushSequenceNumber(), FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">6263</span><span id="line-6263">      } else {</span>
+<span class="source-line-no">6264</span><span id="line-6264">        ctx = prepareFlushResult.storeFlushCtxs.get(family);</span>
+<span class="source-line-no">6265</span><span id="line-6265">        startTime = prepareFlushResult.startTime;</span>
+<span class="source-line-no">6266</span><span id="line-6266">      }</span>
+<span class="source-line-no">6267</span><span id="line-6267"></span>
+<span class="source-line-no">6268</span><span id="line-6268">      if (ctx == null) {</span>
+<span class="source-line-no">6269</span><span id="line-6269">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6270</span><span id="line-6270">          + "Unexpected: flush commit marker received from store " + Bytes.toString(family)</span>
+<span class="source-line-no">6271</span><span id="line-6271">          + " but no associated flush context. Ignoring");</span>
+<span class="source-line-no">6272</span><span id="line-6272">        continue;</span>
+<span class="source-line-no">6273</span><span id="line-6273">      }</span>
+<span class="source-line-no">6274</span><span id="line-6274"></span>
+<span class="source-line-no">6275</span><span id="line-6275">      ctx.replayFlush(flushFiles, dropMemstoreSnapshot); // replay the flush</span>
+<span class="source-line-no">6276</span><span id="line-6276"></span>
+<span class="source-line-no">6277</span><span id="line-6277">      // Record latest flush time</span>
+<span class="source-line-no">6278</span><span id="line-6278">      this.lastStoreFlushTimeMap.put(store, startTime);</span>
+<span class="source-line-no">6279</span><span id="line-6279">    }</span>
+<span class="source-line-no">6280</span><span id="line-6280">  }</span>
+<span class="source-line-no">6281</span><span id="line-6281"></span>
+<span class="source-line-no">6282</span><span id="line-6282">  private long loadRecoveredHFilesIfAny(Collection&lt;HStore&gt; stores) throws IOException {</span>
+<span class="source-line-no">6283</span><span id="line-6283">    Path regionDir = fs.getRegionDir();</span>
+<span class="source-line-no">6284</span><span id="line-6284">    long maxSeqId = -1;</span>
+<span class="source-line-no">6285</span><span id="line-6285">    for (HStore store : stores) {</span>
+<span class="source-line-no">6286</span><span id="line-6286">      String familyName = store.getColumnFamilyName();</span>
+<span class="source-line-no">6287</span><span id="line-6287">      FileStatus[] files =</span>
+<span class="source-line-no">6288</span><span id="line-6288">        WALSplitUtil.getRecoveredHFiles(fs.getFileSystem(), regionDir, familyName);</span>
+<span class="source-line-no">6289</span><span id="line-6289">      if (files != null &amp;&amp; files.length != 0) {</span>
+<span class="source-line-no">6290</span><span id="line-6290">        for (FileStatus file : files) {</span>
+<span class="source-line-no">6291</span><span id="line-6291">          Path filePath = file.getPath();</span>
+<span class="source-line-no">6292</span><span id="line-6292">          // If file length is zero then delete it</span>
+<span class="source-line-no">6293</span><span id="line-6293">          if (isZeroLengthThenDelete(fs.getFileSystem(), file, filePath)) {</span>
+<span class="source-line-no">6294</span><span id="line-6294">            continue;</span>
+<span class="source-line-no">6295</span><span id="line-6295">          }</span>
+<span class="source-line-no">6296</span><span id="line-6296">          try {</span>
+<span class="source-line-no">6297</span><span id="line-6297">            HStoreFile storefile = store.tryCommitRecoveredHFile(file.getPath());</span>
+<span class="source-line-no">6298</span><span id="line-6298">            maxSeqId = Math.max(maxSeqId, storefile.getReader().getSequenceID());</span>
+<span class="source-line-no">6299</span><span id="line-6299">          } catch (IOException e) {</span>
+<span class="source-line-no">6300</span><span id="line-6300">            handleException(fs.getFileSystem(), filePath, e);</span>
+<span class="source-line-no">6301</span><span id="line-6301">            continue;</span>
+<span class="source-line-no">6302</span><span id="line-6302">          }</span>
+<span class="source-line-no">6303</span><span id="line-6303">        }</span>
+<span class="source-line-no">6304</span><span id="line-6304">        if (this.rsServices != null &amp;&amp; store.needsCompaction()) {</span>
+<span class="source-line-no">6305</span><span id="line-6305">          this.rsServices.getCompactionRequestor().requestCompaction(this, store,</span>
+<span class="source-line-no">6306</span><span id="line-6306">            "load recovered hfiles request compaction", Store.PRIORITY_USER + 1,</span>
+<span class="source-line-no">6307</span><span id="line-6307">            CompactionLifeCycleTracker.DUMMY, null);</span>
+<span class="source-line-no">6308</span><span id="line-6308">        }</span>
+<span class="source-line-no">6309</span><span id="line-6309">      }</span>
+<span class="source-line-no">6310</span><span id="line-6310">    }</span>
+<span class="source-line-no">6311</span><span id="line-6311">    return maxSeqId;</span>
+<span class="source-line-no">6312</span><span id="line-6312">  }</span>
+<span class="source-line-no">6313</span><span id="line-6313"></span>
+<span class="source-line-no">6314</span><span id="line-6314">  /**</span>
+<span class="source-line-no">6315</span><span id="line-6315">   * Be careful, this method will drop all data in the memstore of this region. Currently, this</span>
+<span class="source-line-no">6316</span><span id="line-6316">   * method is used to drop memstore to prevent memory leak when replaying recovered.edits while</span>
+<span class="source-line-no">6317</span><span id="line-6317">   * opening region.</span>
+<span class="source-line-no">6318</span><span id="line-6318">   */</span>
+<span class="source-line-no">6319</span><span id="line-6319">  private MemStoreSize dropMemStoreContents() throws IOException {</span>
+<span class="source-line-no">6320</span><span id="line-6320">    MemStoreSizing totalFreedSize = new NonThreadSafeMemStoreSizing();</span>
+<span class="source-line-no">6321</span><span id="line-6321">    this.updatesLock.writeLock().lock();</span>
+<span class="source-line-no">6322</span><span id="line-6322">    try {</span>
+<span class="source-line-no">6323</span><span id="line-6323">      for (HStore s : stores.values()) {</span>
+<span class="source-line-no">6324</span><span id="line-6324">        MemStoreSize memStoreSize = doDropStoreMemStoreContentsForSeqId(s, HConstants.NO_SEQNUM);</span>
+<span class="source-line-no">6325</span><span id="line-6325">        LOG.info("Drop memstore for Store " + s.getColumnFamilyName() + " in region "</span>
+<span class="source-line-no">6326</span><span id="line-6326">          + this.getRegionInfo().getRegionNameAsString() + " , dropped memstoresize: ["</span>
+<span class="source-line-no">6327</span><span id="line-6327">          + memStoreSize + " }");</span>
+<span class="source-line-no">6328</span><span id="line-6328">        totalFreedSize.incMemStoreSize(memStoreSize);</span>
+<span class="source-line-no">6329</span><span id="line-6329">      }</span>
+<span class="source-line-no">6330</span><span id="line-6330">      return totalFreedSize.getMemStoreSize();</span>
+<span class="source-line-no">6331</span><span id="line-6331">    } finally {</span>
+<span class="source-line-no">6332</span><span id="line-6332">      this.updatesLock.writeLock().unlock();</span>
+<span class="source-line-no">6333</span><span id="line-6333">    }</span>
+<span class="source-line-no">6334</span><span id="line-6334">  }</span>
+<span class="source-line-no">6335</span><span id="line-6335"></span>
+<span class="source-line-no">6336</span><span id="line-6336">  /**</span>
+<span class="source-line-no">6337</span><span id="line-6337">   * Drops the memstore contents after replaying a flush descriptor or region open event replay if</span>
+<span class="source-line-no">6338</span><span id="line-6338">   * the memstore edits have seqNums smaller than the given seq id</span>
+<span class="source-line-no">6339</span><span id="line-6339">   */</span>
+<span class="source-line-no">6340</span><span id="line-6340">  private MemStoreSize dropMemStoreContentsForSeqId(long seqId, HStore store) throws IOException {</span>
+<span class="source-line-no">6341</span><span id="line-6341">    MemStoreSizing totalFreedSize = new NonThreadSafeMemStoreSizing();</span>
+<span class="source-line-no">6342</span><span id="line-6342">    this.updatesLock.writeLock().lock();</span>
+<span class="source-line-no">6343</span><span id="line-6343">    try {</span>
+<span class="source-line-no">6344</span><span id="line-6344"></span>
+<span class="source-line-no">6345</span><span id="line-6345">      long currentSeqId = mvcc.getReadPoint();</span>
+<span class="source-line-no">6346</span><span id="line-6346">      if (seqId &gt;= currentSeqId) {</span>
+<span class="source-line-no">6347</span><span id="line-6347">        // then we can drop the memstore contents since everything is below this seqId</span>
 <span class="source-line-no">6348</span><span id="line-6348">        LOG.info(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6349</span><span id="line-6349">          + "Not dropping memstore contents since replayed flush seqId: " + seqId</span>
-<span class="source-line-no">6350</span><span id="line-6350">          + " is smaller than current seqId:" + currentSeqId);</span>
-<span class="source-line-no">6351</span><span id="line-6351">      }</span>
-<span class="source-line-no">6352</span><span id="line-6352">    } finally {</span>
-<span class="source-line-no">6353</span><span id="line-6353">      this.updatesLock.writeLock().unlock();</span>
-<span class="source-line-no">6354</span><span id="line-6354">    }</span>
-<span class="source-line-no">6355</span><span id="line-6355">    return totalFreedSize.getMemStoreSize();</span>
-<span class="source-line-no">6356</span><span id="line-6356">  }</span>
-<span class="source-line-no">6357</span><span id="line-6357"></span>
-<span class="source-line-no">6358</span><span id="line-6358">  private MemStoreSize doDropStoreMemStoreContentsForSeqId(HStore s, long currentSeqId)</span>
-<span class="source-line-no">6359</span><span id="line-6359">    throws IOException {</span>
-<span class="source-line-no">6360</span><span id="line-6360">    MemStoreSize flushableSize = s.getFlushableSize();</span>
-<span class="source-line-no">6361</span><span id="line-6361">    this.decrMemStoreSize(flushableSize);</span>
-<span class="source-line-no">6362</span><span id="line-6362">    StoreFlushContext ctx = s.createFlushContext(currentSeqId, FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">6363</span><span id="line-6363">    ctx.prepare();</span>
-<span class="source-line-no">6364</span><span id="line-6364">    ctx.abort();</span>
-<span class="source-line-no">6365</span><span id="line-6365">    return flushableSize;</span>
-<span class="source-line-no">6366</span><span id="line-6366">  }</span>
-<span class="source-line-no">6367</span><span id="line-6367"></span>
-<span class="source-line-no">6368</span><span id="line-6368">  private void replayWALFlushAbortMarker(FlushDescriptor flush) {</span>
-<span class="source-line-no">6369</span><span id="line-6369">    // nothing to do for now. A flush abort will cause a RS abort which means that the region</span>
-<span class="source-line-no">6370</span><span id="line-6370">    // will be opened somewhere else later. We will see the region open event soon, and replaying</span>
-<span class="source-line-no">6371</span><span id="line-6371">    // that will drop the snapshot</span>
-<span class="source-line-no">6372</span><span id="line-6372">  }</span>
-<span class="source-line-no">6373</span><span id="line-6373"></span>
-<span class="source-line-no">6374</span><span id="line-6374">  private void replayWALFlushCannotFlushMarker(FlushDescriptor flush, long replaySeqId) {</span>
-<span class="source-line-no">6375</span><span id="line-6375">    synchronized (writestate) {</span>
-<span class="source-line-no">6376</span><span id="line-6376">      if (this.lastReplayedOpenRegionSeqId &gt; replaySeqId) {</span>
-<span class="source-line-no">6377</span><span id="line-6377">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
-<span class="source-line-no">6378</span><span id="line-6378">          + TextFormat.shortDebugString(flush) + " because its sequence id " + replaySeqId</span>
-<span class="source-line-no">6379</span><span id="line-6379">          + " is smaller than this regions " + "lastReplayedOpenRegionSeqId of "</span>
-<span class="source-line-no">6380</span><span id="line-6380">          + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">6381</span><span id="line-6381">        return;</span>
-<span class="source-line-no">6382</span><span id="line-6382">      }</span>
-<span class="source-line-no">6383</span><span id="line-6383"></span>
-<span class="source-line-no">6384</span><span id="line-6384">      // If we were waiting for observing a flush or region opening event for not showing partial</span>
-<span class="source-line-no">6385</span><span id="line-6385">      // data after a secondary region crash, we can allow reads now. This event means that the</span>
-<span class="source-line-no">6386</span><span id="line-6386">      // primary was not able to flush because memstore is empty when we requested flush. By the</span>
-<span class="source-line-no">6387</span><span id="line-6387">      // time we observe this, we are guaranteed to have up to date seqId with our previous</span>
-<span class="source-line-no">6388</span><span id="line-6388">      // assignment.</span>
-<span class="source-line-no">6389</span><span id="line-6389">      this.setReadsEnabled(true);</span>
-<span class="source-line-no">6390</span><span id="line-6390">    }</span>
-<span class="source-line-no">6391</span><span id="line-6391">  }</span>
-<span class="source-line-no">6392</span><span id="line-6392"></span>
-<span class="source-line-no">6393</span><span id="line-6393">  PrepareFlushResult getPrepareFlushResult() {</span>
-<span class="source-line-no">6394</span><span id="line-6394">    return prepareFlushResult;</span>
-<span class="source-line-no">6395</span><span id="line-6395">  }</span>
+<span class="source-line-no">6349</span><span id="line-6349">          + "Dropping memstore contents as well since replayed flush seqId: " + seqId</span>
+<span class="source-line-no">6350</span><span id="line-6350">          + " is greater than current seqId:" + currentSeqId);</span>
+<span class="source-line-no">6351</span><span id="line-6351"></span>
+<span class="source-line-no">6352</span><span id="line-6352">        // Prepare flush (take a snapshot) and then abort (drop the snapshot)</span>
+<span class="source-line-no">6353</span><span id="line-6353">        if (store == null) {</span>
+<span class="source-line-no">6354</span><span id="line-6354">          for (HStore s : stores.values()) {</span>
+<span class="source-line-no">6355</span><span id="line-6355">            totalFreedSize.incMemStoreSize(doDropStoreMemStoreContentsForSeqId(s, currentSeqId));</span>
+<span class="source-line-no">6356</span><span id="line-6356">          }</span>
+<span class="source-line-no">6357</span><span id="line-6357">        } else {</span>
+<span class="source-line-no">6358</span><span id="line-6358">          totalFreedSize.incMemStoreSize(doDropStoreMemStoreContentsForSeqId(store, currentSeqId));</span>
+<span class="source-line-no">6359</span><span id="line-6359">        }</span>
+<span class="source-line-no">6360</span><span id="line-6360">      } else {</span>
+<span class="source-line-no">6361</span><span id="line-6361">        LOG.info(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6362</span><span id="line-6362">          + "Not dropping memstore contents since replayed flush seqId: " + seqId</span>
+<span class="source-line-no">6363</span><span id="line-6363">          + " is smaller than current seqId:" + currentSeqId);</span>
+<span class="source-line-no">6364</span><span id="line-6364">      }</span>
+<span class="source-line-no">6365</span><span id="line-6365">    } finally {</span>
+<span class="source-line-no">6366</span><span id="line-6366">      this.updatesLock.writeLock().unlock();</span>
+<span class="source-line-no">6367</span><span id="line-6367">    }</span>
+<span class="source-line-no">6368</span><span id="line-6368">    return totalFreedSize.getMemStoreSize();</span>
+<span class="source-line-no">6369</span><span id="line-6369">  }</span>
+<span class="source-line-no">6370</span><span id="line-6370"></span>
+<span class="source-line-no">6371</span><span id="line-6371">  private MemStoreSize doDropStoreMemStoreContentsForSeqId(HStore s, long currentSeqId)</span>
+<span class="source-line-no">6372</span><span id="line-6372">    throws IOException {</span>
+<span class="source-line-no">6373</span><span id="line-6373">    MemStoreSize flushableSize = s.getFlushableSize();</span>
+<span class="source-line-no">6374</span><span id="line-6374">    this.decrMemStoreSize(flushableSize);</span>
+<span class="source-line-no">6375</span><span id="line-6375">    StoreFlushContext ctx = s.createFlushContext(currentSeqId, FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">6376</span><span id="line-6376">    ctx.prepare();</span>
+<span class="source-line-no">6377</span><span id="line-6377">    ctx.abort();</span>
+<span class="source-line-no">6378</span><span id="line-6378">    return flushableSize;</span>
+<span class="source-line-no">6379</span><span id="line-6379">  }</span>
+<span class="source-line-no">6380</span><span id="line-6380"></span>
+<span class="source-line-no">6381</span><span id="line-6381">  private void replayWALFlushAbortMarker(FlushDescriptor flush) {</span>
+<span class="source-line-no">6382</span><span id="line-6382">    // nothing to do for now. A flush abort will cause a RS abort which means that the region</span>
+<span class="source-line-no">6383</span><span id="line-6383">    // will be opened somewhere else later. We will see the region open event soon, and replaying</span>
+<span class="source-line-no">6384</span><span id="line-6384">    // that will drop the snapshot</span>
+<span class="source-line-no">6385</span><span id="line-6385">  }</span>
+<span class="source-line-no">6386</span><span id="line-6386"></span>
+<span class="source-line-no">6387</span><span id="line-6387">  private void replayWALFlushCannotFlushMarker(FlushDescriptor flush, long replaySeqId) {</span>
+<span class="source-line-no">6388</span><span id="line-6388">    synchronized (writestate) {</span>
+<span class="source-line-no">6389</span><span id="line-6389">      if (this.lastReplayedOpenRegionSeqId &gt; replaySeqId) {</span>
+<span class="source-line-no">6390</span><span id="line-6390">        LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying flush event :"</span>
+<span class="source-line-no">6391</span><span id="line-6391">          + TextFormat.shortDebugString(flush) + " because its sequence id " + replaySeqId</span>
+<span class="source-line-no">6392</span><span id="line-6392">          + " is smaller than this regions " + "lastReplayedOpenRegionSeqId of "</span>
+<span class="source-line-no">6393</span><span id="line-6393">          + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">6394</span><span id="line-6394">        return;</span>
+<span class="source-line-no">6395</span><span id="line-6395">      }</span>
 <span class="source-line-no">6396</span><span id="line-6396"></span>
-<span class="source-line-no">6397</span><span id="line-6397">  /**</span>
-<span class="source-line-no">6398</span><span id="line-6398">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">6399</span><span id="line-6399">   *             replica implementation.</span>
-<span class="source-line-no">6400</span><span id="line-6400">   */</span>
-<span class="source-line-no">6401</span><span id="line-6401">  @Deprecated</span>
-<span class="source-line-no">6402</span><span id="line-6402">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
-<span class="source-line-no">6403</span><span id="line-6403">      justification = "Intentional; cleared the memstore")</span>
-<span class="source-line-no">6404</span><span id="line-6404">  void replayWALRegionEventMarker(RegionEventDescriptor regionEvent) throws IOException {</span>
-<span class="source-line-no">6405</span><span id="line-6405">    checkTargetRegion(regionEvent.getEncodedRegionName().toByteArray(),</span>
-<span class="source-line-no">6406</span><span id="line-6406">      "RegionEvent marker from WAL ", regionEvent);</span>
-<span class="source-line-no">6407</span><span id="line-6407"></span>
-<span class="source-line-no">6408</span><span id="line-6408">    startRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">6409</span><span id="line-6409">    try {</span>
-<span class="source-line-no">6410</span><span id="line-6410">      if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
-<span class="source-line-no">6411</span><span id="line-6411">        return; // if primary nothing to do</span>
-<span class="source-line-no">6412</span><span id="line-6412">      }</span>
-<span class="source-line-no">6413</span><span id="line-6413"></span>
-<span class="source-line-no">6414</span><span id="line-6414">      if (regionEvent.getEventType() == EventType.REGION_CLOSE) {</span>
-<span class="source-line-no">6415</span><span id="line-6415">        // nothing to do on REGION_CLOSE for now.</span>
-<span class="source-line-no">6416</span><span id="line-6416">        return;</span>
-<span class="source-line-no">6417</span><span id="line-6417">      }</span>
-<span class="source-line-no">6418</span><span id="line-6418">      if (regionEvent.getEventType() != EventType.REGION_OPEN) {</span>
-<span class="source-line-no">6419</span><span id="line-6419">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6420</span><span id="line-6420">          + "Unknown region event received, ignoring :" + TextFormat.shortDebugString(regionEvent));</span>
-<span class="source-line-no">6421</span><span id="line-6421">        return;</span>
-<span class="source-line-no">6422</span><span id="line-6422">      }</span>
-<span class="source-line-no">6423</span><span id="line-6423"></span>
-<span class="source-line-no">6424</span><span id="line-6424">      if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6425</span><span id="line-6425">        LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying region open event marker "</span>
-<span class="source-line-no">6426</span><span id="line-6426">          + TextFormat.shortDebugString(regionEvent));</span>
-<span class="source-line-no">6427</span><span id="line-6427">      }</span>
-<span class="source-line-no">6428</span><span id="line-6428"></span>
-<span class="source-line-no">6429</span><span id="line-6429">      // we will use writestate as a coarse-grain lock for all the replay events</span>
-<span class="source-line-no">6430</span><span id="line-6430">      synchronized (writestate) {</span>
-<span class="source-line-no">6431</span><span id="line-6431">        // Replication can deliver events out of order when primary region moves or the region</span>
-<span class="source-line-no">6432</span><span id="line-6432">        // server crashes, since there is no coordination between replication of different wal files</span>
-<span class="source-line-no">6433</span><span id="line-6433">        // belonging to different region servers. We have to safe guard against this case by using</span>
-<span class="source-line-no">6434</span><span id="line-6434">        // region open event's seqid. Since this is the first event that the region puts (after</span>
-<span class="source-line-no">6435</span><span id="line-6435">        // possibly flushing recovered.edits), after seeing this event, we can ignore every edit</span>
-<span class="source-line-no">6436</span><span id="line-6436">        // smaller than this seqId</span>
-<span class="source-line-no">6437</span><span id="line-6437">        if (this.lastReplayedOpenRegionSeqId &lt;= regionEvent.getLogSequenceNumber()) {</span>
-<span class="source-line-no">6438</span><span id="line-6438">          this.lastReplayedOpenRegionSeqId = regionEvent.getLogSequenceNumber();</span>
-<span class="source-line-no">6439</span><span id="line-6439">        } else {</span>
-<span class="source-line-no">6440</span><span id="line-6440">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying region event :"</span>
-<span class="source-line-no">6441</span><span id="line-6441">            + TextFormat.shortDebugString(regionEvent)</span>
-<span class="source-line-no">6442</span><span id="line-6442">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
-<span class="source-line-no">6443</span><span id="line-6443">            + " of " + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">6444</span><span id="line-6444">          return;</span>
-<span class="source-line-no">6445</span><span id="line-6445">        }</span>
-<span class="source-line-no">6446</span><span id="line-6446"></span>
-<span class="source-line-no">6447</span><span id="line-6447">        // region open lists all the files that the region has at the time of the opening. Just pick</span>
-<span class="source-line-no">6448</span><span id="line-6448">        // all the files and drop prepared flushes and empty memstores</span>
-<span class="source-line-no">6449</span><span id="line-6449">        for (StoreDescriptor storeDescriptor : regionEvent.getStoresList()) {</span>
-<span class="source-line-no">6450</span><span id="line-6450">          // stores of primary may be different now</span>
-<span class="source-line-no">6451</span><span id="line-6451">          byte[] family = storeDescriptor.getFamilyName().toByteArray();</span>
-<span class="source-line-no">6452</span><span id="line-6452">          HStore store = getStore(family);</span>
-<span class="source-line-no">6453</span><span id="line-6453">          if (store == null) {</span>
-<span class="source-line-no">6454</span><span id="line-6454">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6455</span><span id="line-6455">              + "Received a region open marker from primary, but the family is not found. "</span>
-<span class="source-line-no">6456</span><span id="line-6456">              + "Ignoring. StoreDescriptor:" + storeDescriptor);</span>
-<span class="source-line-no">6457</span><span id="line-6457">            continue;</span>
-<span class="source-line-no">6458</span><span id="line-6458">          }</span>
+<span class="source-line-no">6397</span><span id="line-6397">      // If we were waiting for observing a flush or region opening event for not showing partial</span>
+<span class="source-line-no">6398</span><span id="line-6398">      // data after a secondary region crash, we can allow reads now. This event means that the</span>
+<span class="source-line-no">6399</span><span id="line-6399">      // primary was not able to flush because memstore is empty when we requested flush. By the</span>
+<span class="source-line-no">6400</span><span id="line-6400">      // time we observe this, we are guaranteed to have up to date seqId with our previous</span>
+<span class="source-line-no">6401</span><span id="line-6401">      // assignment.</span>
+<span class="source-line-no">6402</span><span id="line-6402">      this.setReadsEnabled(true);</span>
+<span class="source-line-no">6403</span><span id="line-6403">    }</span>
+<span class="source-line-no">6404</span><span id="line-6404">  }</span>
+<span class="source-line-no">6405</span><span id="line-6405"></span>
+<span class="source-line-no">6406</span><span id="line-6406">  PrepareFlushResult getPrepareFlushResult() {</span>
+<span class="source-line-no">6407</span><span id="line-6407">    return prepareFlushResult;</span>
+<span class="source-line-no">6408</span><span id="line-6408">  }</span>
+<span class="source-line-no">6409</span><span id="line-6409"></span>
+<span class="source-line-no">6410</span><span id="line-6410">  /**</span>
+<span class="source-line-no">6411</span><span id="line-6411">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">6412</span><span id="line-6412">   *             replica implementation.</span>
+<span class="source-line-no">6413</span><span id="line-6413">   */</span>
+<span class="source-line-no">6414</span><span id="line-6414">  @Deprecated</span>
+<span class="source-line-no">6415</span><span id="line-6415">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
+<span class="source-line-no">6416</span><span id="line-6416">      justification = "Intentional; cleared the memstore")</span>
+<span class="source-line-no">6417</span><span id="line-6417">  void replayWALRegionEventMarker(RegionEventDescriptor regionEvent) throws IOException {</span>
+<span class="source-line-no">6418</span><span id="line-6418">    checkTargetRegion(regionEvent.getEncodedRegionName().toByteArray(),</span>
+<span class="source-line-no">6419</span><span id="line-6419">      "RegionEvent marker from WAL ", regionEvent);</span>
+<span class="source-line-no">6420</span><span id="line-6420"></span>
+<span class="source-line-no">6421</span><span id="line-6421">    startRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">6422</span><span id="line-6422">    try {</span>
+<span class="source-line-no">6423</span><span id="line-6423">      if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
+<span class="source-line-no">6424</span><span id="line-6424">        return; // if primary nothing to do</span>
+<span class="source-line-no">6425</span><span id="line-6425">      }</span>
+<span class="source-line-no">6426</span><span id="line-6426"></span>
+<span class="source-line-no">6427</span><span id="line-6427">      if (regionEvent.getEventType() == EventType.REGION_CLOSE) {</span>
+<span class="source-line-no">6428</span><span id="line-6428">        // nothing to do on REGION_CLOSE for now.</span>
+<span class="source-line-no">6429</span><span id="line-6429">        return;</span>
+<span class="source-line-no">6430</span><span id="line-6430">      }</span>
+<span class="source-line-no">6431</span><span id="line-6431">      if (regionEvent.getEventType() != EventType.REGION_OPEN) {</span>
+<span class="source-line-no">6432</span><span id="line-6432">        LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6433</span><span id="line-6433">          + "Unknown region event received, ignoring :" + TextFormat.shortDebugString(regionEvent));</span>
+<span class="source-line-no">6434</span><span id="line-6434">        return;</span>
+<span class="source-line-no">6435</span><span id="line-6435">      }</span>
+<span class="source-line-no">6436</span><span id="line-6436"></span>
+<span class="source-line-no">6437</span><span id="line-6437">      if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6438</span><span id="line-6438">        LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying region open event marker "</span>
+<span class="source-line-no">6439</span><span id="line-6439">          + TextFormat.shortDebugString(regionEvent));</span>
+<span class="source-line-no">6440</span><span id="line-6440">      }</span>
+<span class="source-line-no">6441</span><span id="line-6441"></span>
+<span class="source-line-no">6442</span><span id="line-6442">      // we will use writestate as a coarse-grain lock for all the replay events</span>
+<span class="source-line-no">6443</span><span id="line-6443">      synchronized (writestate) {</span>
+<span class="source-line-no">6444</span><span id="line-6444">        // Replication can deliver events out of order when primary region moves or the region</span>
+<span class="source-line-no">6445</span><span id="line-6445">        // server crashes, since there is no coordination between replication of different wal files</span>
+<span class="source-line-no">6446</span><span id="line-6446">        // belonging to different region servers. We have to safe guard against this case by using</span>
+<span class="source-line-no">6447</span><span id="line-6447">        // region open event's seqid. Since this is the first event that the region puts (after</span>
+<span class="source-line-no">6448</span><span id="line-6448">        // possibly flushing recovered.edits), after seeing this event, we can ignore every edit</span>
+<span class="source-line-no">6449</span><span id="line-6449">        // smaller than this seqId</span>
+<span class="source-line-no">6450</span><span id="line-6450">        if (this.lastReplayedOpenRegionSeqId &lt;= regionEvent.getLogSequenceNumber()) {</span>
+<span class="source-line-no">6451</span><span id="line-6451">          this.lastReplayedOpenRegionSeqId = regionEvent.getLogSequenceNumber();</span>
+<span class="source-line-no">6452</span><span id="line-6452">        } else {</span>
+<span class="source-line-no">6453</span><span id="line-6453">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying region event :"</span>
+<span class="source-line-no">6454</span><span id="line-6454">            + TextFormat.shortDebugString(regionEvent)</span>
+<span class="source-line-no">6455</span><span id="line-6455">            + " because its sequence id is smaller than this regions lastReplayedOpenRegionSeqId "</span>
+<span class="source-line-no">6456</span><span id="line-6456">            + " of " + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">6457</span><span id="line-6457">          return;</span>
+<span class="source-line-no">6458</span><span id="line-6458">        }</span>
 <span class="source-line-no">6459</span><span id="line-6459"></span>
-<span class="source-line-no">6460</span><span id="line-6460">          long storeSeqId = store.getMaxSequenceId().orElse(0L);</span>
-<span class="source-line-no">6461</span><span id="line-6461">          List&lt;String&gt; storeFiles = storeDescriptor.getStoreFileList();</span>
-<span class="source-line-no">6462</span><span id="line-6462">          try {</span>
-<span class="source-line-no">6463</span><span id="line-6463">            store.refreshStoreFiles(storeFiles); // replace the files with the new ones</span>
-<span class="source-line-no">6464</span><span id="line-6464">          } catch (FileNotFoundException ex) {</span>
-<span class="source-line-no">6465</span><span id="line-6465">            LOG.warn(getRegionInfo().getEncodedName() + " : " + "At least one of the store files: "</span>
-<span class="source-line-no">6466</span><span id="line-6466">              + storeFiles + " doesn't exist any more. Skip loading the file(s)", ex);</span>
-<span class="source-line-no">6467</span><span id="line-6467">            continue;</span>
-<span class="source-line-no">6468</span><span id="line-6468">          }</span>
-<span class="source-line-no">6469</span><span id="line-6469">          if (store.getMaxSequenceId().orElse(0L) != storeSeqId) {</span>
-<span class="source-line-no">6470</span><span id="line-6470">            // Record latest flush time if we picked up new files</span>
-<span class="source-line-no">6471</span><span id="line-6471">            lastStoreFlushTimeMap.put(store, EnvironmentEdgeManager.currentTime());</span>
-<span class="source-line-no">6472</span><span id="line-6472">          }</span>
-<span class="source-line-no">6473</span><span id="line-6473"></span>
-<span class="source-line-no">6474</span><span id="line-6474">          if (writestate.flushing) {</span>
-<span class="source-line-no">6475</span><span id="line-6475">            // only drop memstore snapshots if they are smaller than last flush for the store</span>
-<span class="source-line-no">6476</span><span id="line-6476">            if (this.prepareFlushResult.flushOpSeqId &lt;= regionEvent.getLogSequenceNumber()) {</span>
-<span class="source-line-no">6477</span><span id="line-6477">              StoreFlushContext ctx = this.prepareFlushResult.storeFlushCtxs == null</span>
-<span class="source-line-no">6478</span><span id="line-6478">                ? null</span>
-<span class="source-line-no">6479</span><span id="line-6479">                : this.prepareFlushResult.storeFlushCtxs.get(family);</span>
-<span class="source-line-no">6480</span><span id="line-6480">              if (ctx != null) {</span>
-<span class="source-line-no">6481</span><span id="line-6481">                MemStoreSize mss = store.getFlushableSize();</span>
-<span class="source-line-no">6482</span><span id="line-6482">                ctx.abort();</span>
-<span class="source-line-no">6483</span><span id="line-6483">                this.decrMemStoreSize(mss);</span>
-<span class="source-line-no">6484</span><span id="line-6484">                this.prepareFlushResult.storeFlushCtxs.remove(family);</span>
-<span class="source-line-no">6485</span><span id="line-6485">              }</span>
-<span class="source-line-no">6486</span><span id="line-6486">            }</span>
-<span class="source-line-no">6487</span><span id="line-6487">          }</span>
-<span class="source-line-no">6488</span><span id="line-6488"></span>
-<span class="source-line-no">6489</span><span id="line-6489">          // Drop the memstore contents if they are now smaller than the latest seen flushed file</span>
-<span class="source-line-no">6490</span><span id="line-6490">          dropMemStoreContentsForSeqId(regionEvent.getLogSequenceNumber(), store);</span>
-<span class="source-line-no">6491</span><span id="line-6491">          if (storeSeqId &gt; this.maxFlushedSeqId) {</span>
-<span class="source-line-no">6492</span><span id="line-6492">            this.maxFlushedSeqId = storeSeqId;</span>
-<span class="source-line-no">6493</span><span id="line-6493">          }</span>
-<span class="source-line-no">6494</span><span id="line-6494">        }</span>
-<span class="source-line-no">6495</span><span id="line-6495"></span>
-<span class="source-line-no">6496</span><span id="line-6496">        // if all stores ended up dropping their snapshots, we can safely drop the</span>
-<span class="source-line-no">6497</span><span id="line-6497">        // prepareFlushResult</span>
-<span class="source-line-no">6498</span><span id="line-6498">        dropPrepareFlushIfPossible();</span>
-<span class="source-line-no">6499</span><span id="line-6499"></span>
-<span class="source-line-no">6500</span><span id="line-6500">        // advance the mvcc read point so that the new flushed file is visible.</span>
-<span class="source-line-no">6501</span><span id="line-6501">        mvcc.await();</span>
-<span class="source-line-no">6502</span><span id="line-6502"></span>
-<span class="source-line-no">6503</span><span id="line-6503">        // If we were waiting for observing a flush or region opening event for not showing partial</span>
-<span class="source-line-no">6504</span><span id="line-6504">        // data after a secondary region crash, we can allow reads now.</span>
-<span class="source-line-no">6505</span><span id="line-6505">        this.setReadsEnabled(true);</span>
-<span class="source-line-no">6506</span><span id="line-6506"></span>
-<span class="source-line-no">6507</span><span id="line-6507">        // C. Finally notify anyone waiting on memstore to clear:</span>
-<span class="source-line-no">6508</span><span id="line-6508">        // e.g. checkResources().</span>
-<span class="source-line-no">6509</span><span id="line-6509">        synchronized (this) {</span>
-<span class="source-line-no">6510</span><span id="line-6510">          notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
-<span class="source-line-no">6511</span><span id="line-6511">        }</span>
-<span class="source-line-no">6512</span><span id="line-6512">      }</span>
-<span class="source-line-no">6513</span><span id="line-6513">      logRegionFiles();</span>
-<span class="source-line-no">6514</span><span id="line-6514">    } finally {</span>
-<span class="source-line-no">6515</span><span id="line-6515">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">6516</span><span id="line-6516">    }</span>
-<span class="source-line-no">6517</span><span id="line-6517">  }</span>
-<span class="source-line-no">6518</span><span id="line-6518"></span>
-<span class="source-line-no">6519</span><span id="line-6519">  /**</span>
-<span class="source-line-no">6520</span><span id="line-6520">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
-<span class="source-line-no">6521</span><span id="line-6521">   *             replica implementation.</span>
-<span class="source-line-no">6522</span><span id="line-6522">   */</span>
-<span class="source-line-no">6523</span><span id="line-6523">  @Deprecated</span>
-<span class="source-line-no">6524</span><span id="line-6524">  void replayWALBulkLoadEventMarker(WALProtos.BulkLoadDescriptor bulkLoadEvent) throws IOException {</span>
-<span class="source-line-no">6525</span><span id="line-6525">    checkTargetRegion(bulkLoadEvent.getEncodedRegionName().toByteArray(),</span>
-<span class="source-line-no">6526</span><span id="line-6526">      "BulkLoad marker from WAL ", bulkLoadEvent);</span>
-<span class="source-line-no">6527</span><span id="line-6527"></span>
-<span class="source-line-no">6528</span><span id="line-6528">    if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
-<span class="source-line-no">6529</span><span id="line-6529">      return; // if primary nothing to do</span>
-<span class="source-line-no">6530</span><span id="line-6530">    }</span>
+<span class="source-line-no">6460</span><span id="line-6460">        // region open lists all the files that the region has at the time of the opening. Just pick</span>
+<span class="source-line-no">6461</span><span id="line-6461">        // all the files and drop prepared flushes and empty memstores</span>
+<span class="source-line-no">6462</span><span id="line-6462">        for (StoreDescriptor storeDescriptor : regionEvent.getStoresList()) {</span>
+<span class="source-line-no">6463</span><span id="line-6463">          // stores of primary may be different now</span>
+<span class="source-line-no">6464</span><span id="line-6464">          byte[] family = storeDescriptor.getFamilyName().toByteArray();</span>
+<span class="source-line-no">6465</span><span id="line-6465">          HStore store = getStore(family);</span>
+<span class="source-line-no">6466</span><span id="line-6466">          if (store == null) {</span>
+<span class="source-line-no">6467</span><span id="line-6467">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6468</span><span id="line-6468">              + "Received a region open marker from primary, but the family is not found. "</span>
+<span class="source-line-no">6469</span><span id="line-6469">              + "Ignoring. StoreDescriptor:" + storeDescriptor);</span>
+<span class="source-line-no">6470</span><span id="line-6470">            continue;</span>
+<span class="source-line-no">6471</span><span id="line-6471">          }</span>
+<span class="source-line-no">6472</span><span id="line-6472"></span>
+<span class="source-line-no">6473</span><span id="line-6473">          long storeSeqId = store.getMaxSequenceId().orElse(0L);</span>
+<span class="source-line-no">6474</span><span id="line-6474">          List&lt;String&gt; storeFiles = storeDescriptor.getStoreFileList();</span>
+<span class="source-line-no">6475</span><span id="line-6475">          try {</span>
+<span class="source-line-no">6476</span><span id="line-6476">            store.refreshStoreFiles(storeFiles); // replace the files with the new ones</span>
+<span class="source-line-no">6477</span><span id="line-6477">          } catch (FileNotFoundException ex) {</span>
+<span class="source-line-no">6478</span><span id="line-6478">            LOG.warn(getRegionInfo().getEncodedName() + " : " + "At least one of the store files: "</span>
+<span class="source-line-no">6479</span><span id="line-6479">              + storeFiles + " doesn't exist any more. Skip loading the file(s)", ex);</span>
+<span class="source-line-no">6480</span><span id="line-6480">            continue;</span>
+<span class="source-line-no">6481</span><span id="line-6481">          }</span>
+<span class="source-line-no">6482</span><span id="line-6482">          if (store.getMaxSequenceId().orElse(0L) != storeSeqId) {</span>
+<span class="source-line-no">6483</span><span id="line-6483">            // Record latest flush time if we picked up new files</span>
+<span class="source-line-no">6484</span><span id="line-6484">            lastStoreFlushTimeMap.put(store, EnvironmentEdgeManager.currentTime());</span>
+<span class="source-line-no">6485</span><span id="line-6485">          }</span>
+<span class="source-line-no">6486</span><span id="line-6486"></span>
+<span class="source-line-no">6487</span><span id="line-6487">          if (writestate.flushing) {</span>
+<span class="source-line-no">6488</span><span id="line-6488">            // only drop memstore snapshots if they are smaller than last flush for the store</span>
+<span class="source-line-no">6489</span><span id="line-6489">            if (this.prepareFlushResult.flushOpSeqId &lt;= regionEvent.getLogSequenceNumber()) {</span>
+<span class="source-line-no">6490</span><span id="line-6490">              StoreFlushContext ctx = this.prepareFlushResult.storeFlushCtxs == null</span>
+<span class="source-line-no">6491</span><span id="line-6491">                ? null</span>
+<span class="source-line-no">6492</span><span id="line-6492">                : this.prepareFlushResult.storeFlushCtxs.get(family);</span>
+<span class="source-line-no">6493</span><span id="line-6493">              if (ctx != null) {</span>
+<span class="source-line-no">6494</span><span id="line-6494">                MemStoreSize mss = store.getFlushableSize();</span>
+<span class="source-line-no">6495</span><span id="line-6495">                ctx.abort();</span>
+<span class="source-line-no">6496</span><span id="line-6496">                this.decrMemStoreSize(mss);</span>
+<span class="source-line-no">6497</span><span id="line-6497">                this.prepareFlushResult.storeFlushCtxs.remove(family);</span>
+<span class="source-line-no">6498</span><span id="line-6498">              }</span>
+<span class="source-line-no">6499</span><span id="line-6499">            }</span>
+<span class="source-line-no">6500</span><span id="line-6500">          }</span>
+<span class="source-line-no">6501</span><span id="line-6501"></span>
+<span class="source-line-no">6502</span><span id="line-6502">          // Drop the memstore contents if they are now smaller than the latest seen flushed file</span>
+<span class="source-line-no">6503</span><span id="line-6503">          dropMemStoreContentsForSeqId(regionEvent.getLogSequenceNumber(), store);</span>
+<span class="source-line-no">6504</span><span id="line-6504">          if (storeSeqId &gt; this.maxFlushedSeqId) {</span>
+<span class="source-line-no">6505</span><span id="line-6505">            this.maxFlushedSeqId = storeSeqId;</span>
+<span class="source-line-no">6506</span><span id="line-6506">          }</span>
+<span class="source-line-no">6507</span><span id="line-6507">        }</span>
+<span class="source-line-no">6508</span><span id="line-6508"></span>
+<span class="source-line-no">6509</span><span id="line-6509">        // if all stores ended up dropping their snapshots, we can safely drop the</span>
+<span class="source-line-no">6510</span><span id="line-6510">        // prepareFlushResult</span>
+<span class="source-line-no">6511</span><span id="line-6511">        dropPrepareFlushIfPossible();</span>
+<span class="source-line-no">6512</span><span id="line-6512"></span>
+<span class="source-line-no">6513</span><span id="line-6513">        // advance the mvcc read point so that the new flushed file is visible.</span>
+<span class="source-line-no">6514</span><span id="line-6514">        mvcc.await();</span>
+<span class="source-line-no">6515</span><span id="line-6515"></span>
+<span class="source-line-no">6516</span><span id="line-6516">        // If we were waiting for observing a flush or region opening event for not showing partial</span>
+<span class="source-line-no">6517</span><span id="line-6517">        // data after a secondary region crash, we can allow reads now.</span>
+<span class="source-line-no">6518</span><span id="line-6518">        this.setReadsEnabled(true);</span>
+<span class="source-line-no">6519</span><span id="line-6519"></span>
+<span class="source-line-no">6520</span><span id="line-6520">        // C. Finally notify anyone waiting on memstore to clear:</span>
+<span class="source-line-no">6521</span><span id="line-6521">        // e.g. checkResources().</span>
+<span class="source-line-no">6522</span><span id="line-6522">        synchronized (this) {</span>
+<span class="source-line-no">6523</span><span id="line-6523">          notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
+<span class="source-line-no">6524</span><span id="line-6524">        }</span>
+<span class="source-line-no">6525</span><span id="line-6525">      }</span>
+<span class="source-line-no">6526</span><span id="line-6526">      logRegionFiles();</span>
+<span class="source-line-no">6527</span><span id="line-6527">    } finally {</span>
+<span class="source-line-no">6528</span><span id="line-6528">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">6529</span><span id="line-6529">    }</span>
+<span class="source-line-no">6530</span><span id="line-6530">  }</span>
 <span class="source-line-no">6531</span><span id="line-6531"></span>
-<span class="source-line-no">6532</span><span id="line-6532">    if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6533</span><span id="line-6533">      LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying bulkload event marker "</span>
-<span class="source-line-no">6534</span><span id="line-6534">        + TextFormat.shortDebugString(bulkLoadEvent));</span>
-<span class="source-line-no">6535</span><span id="line-6535">    }</span>
-<span class="source-line-no">6536</span><span id="line-6536">    // check if multiple families involved</span>
-<span class="source-line-no">6537</span><span id="line-6537">    boolean multipleFamilies = false;</span>
-<span class="source-line-no">6538</span><span id="line-6538">    byte[] family = null;</span>
-<span class="source-line-no">6539</span><span id="line-6539">    for (StoreDescriptor storeDescriptor : bulkLoadEvent.getStoresList()) {</span>
-<span class="source-line-no">6540</span><span id="line-6540">      byte[] fam = storeDescriptor.getFamilyName().toByteArray();</span>
-<span class="source-line-no">6541</span><span id="line-6541">      if (family == null) {</span>
-<span class="source-line-no">6542</span><span id="line-6542">        family = fam;</span>
-<span class="source-line-no">6543</span><span id="line-6543">      } else if (!Bytes.equals(family, fam)) {</span>
-<span class="source-line-no">6544</span><span id="line-6544">        multipleFamilies = true;</span>
-<span class="source-line-no">6545</span><span id="line-6545">        break;</span>
-<span class="source-line-no">6546</span><span id="line-6546">      }</span>
-<span class="source-line-no">6547</span><span id="line-6547">    }</span>
-<span class="source-line-no">6548</span><span id="line-6548"></span>
-<span class="source-line-no">6549</span><span id="line-6549">    startBulkRegionOperation(multipleFamilies);</span>
-<span class="source-line-no">6550</span><span id="line-6550">    try {</span>
-<span class="source-line-no">6551</span><span id="line-6551">      // we will use writestate as a coarse-grain lock for all the replay events</span>
-<span class="source-line-no">6552</span><span id="line-6552">      synchronized (writestate) {</span>
-<span class="source-line-no">6553</span><span id="line-6553">        // Replication can deliver events out of order when primary region moves or the region</span>
-<span class="source-line-no">6554</span><span id="line-6554">        // server crashes, since there is no coordination between replication of different wal files</span>
-<span class="source-line-no">6555</span><span id="line-6555">        // belonging to different region servers. We have to safe guard against this case by using</span>
-<span class="source-line-no">6556</span><span id="line-6556">        // region open event's seqid. Since this is the first event that the region puts (after</span>
-<span class="source-line-no">6557</span><span id="line-6557">        // possibly flushing recovered.edits), after seeing this event, we can ignore every edit</span>
-<span class="source-line-no">6558</span><span id="line-6558">        // smaller than this seqId</span>
-<span class="source-line-no">6559</span><span id="line-6559">        if (</span>
-<span class="source-line-no">6560</span><span id="line-6560">          bulkLoadEvent.getBulkloadSeqNum() &gt;= 0</span>
-<span class="source-line-no">6561</span><span id="line-6561">            &amp;&amp; this.lastReplayedOpenRegionSeqId &gt;= bulkLoadEvent.getBulkloadSeqNum()</span>
-<span class="source-line-no">6562</span><span id="line-6562">        ) {</span>
-<span class="source-line-no">6563</span><span id="line-6563">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying bulkload event :"</span>
-<span class="source-line-no">6564</span><span id="line-6564">            + TextFormat.shortDebugString(bulkLoadEvent)</span>
-<span class="source-line-no">6565</span><span id="line-6565">            + " because its sequence id is smaller than this region's lastReplayedOpenRegionSeqId"</span>
-<span class="source-line-no">6566</span><span id="line-6566">            + " =" + lastReplayedOpenRegionSeqId);</span>
-<span class="source-line-no">6567</span><span id="line-6567"></span>
-<span class="source-line-no">6568</span><span id="line-6568">          return;</span>
-<span class="source-line-no">6569</span><span id="line-6569">        }</span>
-<span class="source-line-no">6570</span><span id="line-6570"></span>
-<span class="source-line-no">6571</span><span id="line-6571">        for (StoreDescriptor storeDescriptor : bulkLoadEvent.getStoresList()) {</span>
-<span class="source-line-no">6572</span><span id="line-6572">          // stores of primary may be different now</span>
-<span class="source-line-no">6573</span><span id="line-6573">          family = storeDescriptor.getFamilyName().toByteArray();</span>
-<span class="source-line-no">6574</span><span id="line-6574">          HStore store = getStore(family);</span>
-<span class="source-line-no">6575</span><span id="line-6575">          if (store == null) {</span>
-<span class="source-line-no">6576</span><span id="line-6576">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6577</span><span id="line-6577">              + "Received a bulk load marker from primary, but the family is not found. "</span>
-<span class="source-line-no">6578</span><span id="line-6578">              + "Ignoring. StoreDescriptor:" + storeDescriptor);</span>
-<span class="source-line-no">6579</span><span id="line-6579">            continue;</span>
-<span class="source-line-no">6580</span><span id="line-6580">          }</span>
-<span class="source-line-no">6581</span><span id="line-6581"></span>
-<span class="source-line-no">6582</span><span id="line-6582">          StoreContext storeContext = store.getStoreContext();</span>
-<span class="source-line-no">6583</span><span id="line-6583">          StoreFileTracker sft = StoreFileTrackerFactory.create(conf, false, storeContext);</span>
-<span class="source-line-no">6584</span><span id="line-6584"></span>
-<span class="source-line-no">6585</span><span id="line-6585">          List&lt;StoreFileInfo&gt; storeFiles = sft.load();</span>
-<span class="source-line-no">6586</span><span id="line-6586">          for (StoreFileInfo storeFileInfo : storeFiles) {</span>
-<span class="source-line-no">6587</span><span id="line-6587">            try {</span>
-<span class="source-line-no">6588</span><span id="line-6588">              store.bulkLoadHFile(storeFileInfo);</span>
-<span class="source-line-no">6589</span><span id="line-6589">            } catch (FileNotFoundException ex) {</span>
-<span class="source-line-no">6590</span><span id="line-6590">              LOG.warn(getRegionInfo().getEncodedName() + " : " + storeFileInfo.toString()</span>
-<span class="source-line-no">6591</span><span id="line-6591">                + " doesn't exist any more. Skip loading the file");</span>
-<span class="source-line-no">6592</span><span id="line-6592">            }</span>
+<span class="source-line-no">6532</span><span id="line-6532">  /**</span>
+<span class="source-line-no">6533</span><span id="line-6533">   * @deprecated Since 3.0.0, will be removed in 4.0.0. Only for keep compatibility for old region</span>
+<span class="source-line-no">6534</span><span id="line-6534">   *             replica implementation.</span>
+<span class="source-line-no">6535</span><span id="line-6535">   */</span>
+<span class="source-line-no">6536</span><span id="line-6536">  @Deprecated</span>
+<span class="source-line-no">6537</span><span id="line-6537">  void replayWALBulkLoadEventMarker(WALProtos.BulkLoadDescriptor bulkLoadEvent) throws IOException {</span>
+<span class="source-line-no">6538</span><span id="line-6538">    checkTargetRegion(bulkLoadEvent.getEncodedRegionName().toByteArray(),</span>
+<span class="source-line-no">6539</span><span id="line-6539">      "BulkLoad marker from WAL ", bulkLoadEvent);</span>
+<span class="source-line-no">6540</span><span id="line-6540"></span>
+<span class="source-line-no">6541</span><span id="line-6541">    if (ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
+<span class="source-line-no">6542</span><span id="line-6542">      return; // if primary nothing to do</span>
+<span class="source-line-no">6543</span><span id="line-6543">    }</span>
+<span class="source-line-no">6544</span><span id="line-6544"></span>
+<span class="source-line-no">6545</span><span id="line-6545">    if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6546</span><span id="line-6546">      LOG.debug(getRegionInfo().getEncodedName() + " : " + "Replaying bulkload event marker "</span>
+<span class="source-line-no">6547</span><span id="line-6547">        + TextFormat.shortDebugString(bulkLoadEvent));</span>
+<span class="source-line-no">6548</span><span id="line-6548">    }</span>
+<span class="source-line-no">6549</span><span id="line-6549">    // check if multiple families involved</span>
+<span class="source-line-no">6550</span><span id="line-6550">    boolean multipleFamilies = false;</span>
+<span class="source-line-no">6551</span><span id="line-6551">    byte[] family = null;</span>
+<span class="source-line-no">6552</span><span id="line-6552">    for (StoreDescriptor storeDescriptor : bulkLoadEvent.getStoresList()) {</span>
+<span class="source-line-no">6553</span><span id="line-6553">      byte[] fam = storeDescriptor.getFamilyName().toByteArray();</span>
+<span class="source-line-no">6554</span><span id="line-6554">      if (family == null) {</span>
+<span class="source-line-no">6555</span><span id="line-6555">        family = fam;</span>
+<span class="source-line-no">6556</span><span id="line-6556">      } else if (!Bytes.equals(family, fam)) {</span>
+<span class="source-line-no">6557</span><span id="line-6557">        multipleFamilies = true;</span>
+<span class="source-line-no">6558</span><span id="line-6558">        break;</span>
+<span class="source-line-no">6559</span><span id="line-6559">      }</span>
+<span class="source-line-no">6560</span><span id="line-6560">    }</span>
+<span class="source-line-no">6561</span><span id="line-6561"></span>
+<span class="source-line-no">6562</span><span id="line-6562">    startBulkRegionOperation(multipleFamilies);</span>
+<span class="source-line-no">6563</span><span id="line-6563">    try {</span>
+<span class="source-line-no">6564</span><span id="line-6564">      // we will use writestate as a coarse-grain lock for all the replay events</span>
+<span class="source-line-no">6565</span><span id="line-6565">      synchronized (writestate) {</span>
+<span class="source-line-no">6566</span><span id="line-6566">        // Replication can deliver events out of order when primary region moves or the region</span>
+<span class="source-line-no">6567</span><span id="line-6567">        // server crashes, since there is no coordination between replication of different wal files</span>
+<span class="source-line-no">6568</span><span id="line-6568">        // belonging to different region servers. We have to safe guard against this case by using</span>
+<span class="source-line-no">6569</span><span id="line-6569">        // region open event's seqid. Since this is the first event that the region puts (after</span>
+<span class="source-line-no">6570</span><span id="line-6570">        // possibly flushing recovered.edits), after seeing this event, we can ignore every edit</span>
+<span class="source-line-no">6571</span><span id="line-6571">        // smaller than this seqId</span>
+<span class="source-line-no">6572</span><span id="line-6572">        if (</span>
+<span class="source-line-no">6573</span><span id="line-6573">          bulkLoadEvent.getBulkloadSeqNum() &gt;= 0</span>
+<span class="source-line-no">6574</span><span id="line-6574">            &amp;&amp; this.lastReplayedOpenRegionSeqId &gt;= bulkLoadEvent.getBulkloadSeqNum()</span>
+<span class="source-line-no">6575</span><span id="line-6575">        ) {</span>
+<span class="source-line-no">6576</span><span id="line-6576">          LOG.warn(getRegionInfo().getEncodedName() + " : " + "Skipping replaying bulkload event :"</span>
+<span class="source-line-no">6577</span><span id="line-6577">            + TextFormat.shortDebugString(bulkLoadEvent)</span>
+<span class="source-line-no">6578</span><span id="line-6578">            + " because its sequence id is smaller than this region's lastReplayedOpenRegionSeqId"</span>
+<span class="source-line-no">6579</span><span id="line-6579">            + " =" + lastReplayedOpenRegionSeqId);</span>
+<span class="source-line-no">6580</span><span id="line-6580"></span>
+<span class="source-line-no">6581</span><span id="line-6581">          return;</span>
+<span class="source-line-no">6582</span><span id="line-6582">        }</span>
+<span class="source-line-no">6583</span><span id="line-6583"></span>
+<span class="source-line-no">6584</span><span id="line-6584">        for (StoreDescriptor storeDescriptor : bulkLoadEvent.getStoresList()) {</span>
+<span class="source-line-no">6585</span><span id="line-6585">          // stores of primary may be different now</span>
+<span class="source-line-no">6586</span><span id="line-6586">          family = storeDescriptor.getFamilyName().toByteArray();</span>
+<span class="source-line-no">6587</span><span id="line-6587">          HStore store = getStore(family);</span>
+<span class="source-line-no">6588</span><span id="line-6588">          if (store == null) {</span>
+<span class="source-line-no">6589</span><span id="line-6589">            LOG.warn(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6590</span><span id="line-6590">              + "Received a bulk load marker from primary, but the family is not found. "</span>
+<span class="source-line-no">6591</span><span id="line-6591">              + "Ignoring. StoreDescriptor:" + storeDescriptor);</span>
+<span class="source-line-no">6592</span><span id="line-6592">            continue;</span>
 <span class="source-line-no">6593</span><span id="line-6593">          }</span>
-<span class="source-line-no">6594</span><span id="line-6594">        }</span>
-<span class="source-line-no">6595</span><span id="line-6595">      }</span>
-<span class="source-line-no">6596</span><span id="line-6596">      if (bulkLoadEvent.getBulkloadSeqNum() &gt; 0) {</span>
-<span class="source-line-no">6597</span><span id="line-6597">        mvcc.advanceTo(bulkLoadEvent.getBulkloadSeqNum());</span>
-<span class="source-line-no">6598</span><span id="line-6598">      }</span>
-<span class="source-line-no">6599</span><span id="line-6599">    } finally {</span>
-<span class="source-line-no">6600</span><span id="line-6600">      closeBulkRegionOperation();</span>
-<span class="source-line-no">6601</span><span id="line-6601">    }</span>
-<span class="source-line-no">6602</span><span id="line-6602">  }</span>
-<span class="source-line-no">6603</span><span id="line-6603"></span>
-<span class="source-line-no">6604</span><span id="line-6604">  /**</span>
-<span class="source-line-no">6605</span><span id="line-6605">   * Replay the batch mutate for secondary replica.</span>
-<span class="source-line-no">6606</span><span id="line-6606">   * &lt;p/&gt;</span>
-<span class="source-line-no">6607</span><span id="line-6607">   * We will directly apply the cells to the memstore. This is because:</span>
-<span class="source-line-no">6608</span><span id="line-6608">   * &lt;ol&gt;</span>
-<span class="source-line-no">6609</span><span id="line-6609">   * &lt;li&gt;All the cells are gotten from {@link WALEdit}, so we only have {@link Put} and</span>
-<span class="source-line-no">6610</span><span id="line-6610">   * {@link Delete} here&lt;/li&gt;</span>
-<span class="source-line-no">6611</span><span id="line-6611">   * &lt;li&gt;The replay is single threaded, we do not need to acquire row lock, as the region is read</span>
-<span class="source-line-no">6612</span><span id="line-6612">   * only so no one else can write it.&lt;/li&gt;</span>
-<span class="source-line-no">6613</span><span id="line-6613">   * &lt;li&gt;We do not need to write WAL.&lt;/li&gt;</span>
-<span class="source-line-no">6614</span><span id="line-6614">   * &lt;li&gt;We will advance MVCC in the caller directly.&lt;/li&gt;</span>
-<span class="source-line-no">6615</span><span id="line-6615">   * &lt;/ol&gt;</span>
-<span class="source-line-no">6616</span><span id="line-6616">   */</span>
-<span class="source-line-no">6617</span><span id="line-6617">  private void replayWALBatchMutate(Map&lt;byte[], List&lt;ExtendedCell&gt;&gt; family2Cells)</span>
-<span class="source-line-no">6618</span><span id="line-6618">    throws IOException {</span>
-<span class="source-line-no">6619</span><span id="line-6619">    startRegionOperation(Operation.REPLAY_BATCH_MUTATE);</span>
-<span class="source-line-no">6620</span><span id="line-6620">    try {</span>
-<span class="source-line-no">6621</span><span id="line-6621">      for (Map.Entry&lt;byte[], List&lt;ExtendedCell&gt;&gt; entry : family2Cells.entrySet()) {</span>
-<span class="source-line-no">6622</span><span id="line-6622">        applyToMemStore(getStore(entry.getKey()), entry.getValue(), false, memStoreSizing);</span>
-<span class="source-line-no">6623</span><span id="line-6623">      }</span>
-<span class="source-line-no">6624</span><span id="line-6624">    } finally {</span>
-<span class="source-line-no">6625</span><span id="line-6625">      closeRegionOperation(Operation.REPLAY_BATCH_MUTATE);</span>
-<span class="source-line-no">6626</span><span id="line-6626">    }</span>
-<span class="source-line-no">6627</span><span id="line-6627">  }</span>
-<span class="source-line-no">6628</span><span id="line-6628"></span>
-<span class="source-line-no">6629</span><span id="line-6629">  /**</span>
-<span class="source-line-no">6630</span><span id="line-6630">   * Replay the meta edits, i.e, flush marker, compaction marker, bulk load marker, region event</span>
-<span class="source-line-no">6631</span><span id="line-6631">   * marker, etc.</span>
-<span class="source-line-no">6632</span><span id="line-6632">   * &lt;p/&gt;</span>
-<span class="source-line-no">6633</span><span id="line-6633">   * For all events other than start flush, we will just call {@link #refreshStoreFiles()} as the</span>
-<span class="source-line-no">6634</span><span id="line-6634">   * logic is straight-forward and robust. For start flush, we need to snapshot the memstore, so</span>
-<span class="source-line-no">6635</span><span id="line-6635">   * later {@link #refreshStoreFiles()} call could drop the snapshot, otherwise we may run out of</span>
-<span class="source-line-no">6636</span><span id="line-6636">   * memory.</span>
-<span class="source-line-no">6637</span><span id="line-6637">   */</span>
-<span class="source-line-no">6638</span><span id="line-6638">  private void replayWALMetaEdit(Cell cell) throws IOException {</span>
-<span class="source-line-no">6639</span><span id="line-6639">    startRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">6640</span><span id="line-6640">    try {</span>
-<span class="source-line-no">6641</span><span id="line-6641">      FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);</span>
-<span class="source-line-no">6642</span><span id="line-6642">      if (flushDesc != null) {</span>
-<span class="source-line-no">6643</span><span id="line-6643">        switch (flushDesc.getAction()) {</span>
-<span class="source-line-no">6644</span><span id="line-6644">          case START_FLUSH:</span>
-<span class="source-line-no">6645</span><span id="line-6645">            // for start flush, we need to take a snapshot of the current memstore</span>
-<span class="source-line-no">6646</span><span id="line-6646">            synchronized (writestate) {</span>
-<span class="source-line-no">6647</span><span id="line-6647">              if (!writestate.flushing) {</span>
-<span class="source-line-no">6648</span><span id="line-6648">                this.writestate.flushing = true;</span>
-<span class="source-line-no">6649</span><span id="line-6649">              } else {</span>
-<span class="source-line-no">6650</span><span id="line-6650">                // usually this should not happen but let's make the code more robust, it is not a</span>
-<span class="source-line-no">6651</span><span id="line-6651">                // big deal to just ignore it, the refreshStoreFiles call should have the ability to</span>
-<span class="source-line-no">6652</span><span id="line-6652">                // clean up the inconsistent state.</span>
-<span class="source-line-no">6653</span><span id="line-6653">                LOG.debug("NOT flushing {} as already flushing", getRegionInfo());</span>
-<span class="source-line-no">6654</span><span id="line-6654">                break;</span>
-<span class="source-line-no">6655</span><span id="line-6655">              }</span>
-<span class="source-line-no">6656</span><span id="line-6656">            }</span>
-<span class="source-line-no">6657</span><span id="line-6657">            MonitoredTask status =</span>
-<span class="source-line-no">6658</span><span id="line-6658">              TaskMonitor.get().createStatus("Preparing flush " + getRegionInfo());</span>
-<span class="source-line-no">6659</span><span id="line-6659">            Collection&lt;HStore&gt; storesToFlush = getStoresToFlush(flushDesc);</span>
-<span class="source-line-no">6660</span><span id="line-6660">            try {</span>
-<span class="source-line-no">6661</span><span id="line-6661">              PrepareFlushResult prepareResult =</span>
-<span class="source-line-no">6662</span><span id="line-6662">                internalPrepareFlushCache(null, flushDesc.getFlushSequenceNumber(), storesToFlush,</span>
-<span class="source-line-no">6663</span><span id="line-6663">                  status, false, FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">6664</span><span id="line-6664">              if (prepareResult.result == null) {</span>
-<span class="source-line-no">6665</span><span id="line-6665">                // save the PrepareFlushResult so that we can use it later from commit flush</span>
-<span class="source-line-no">6666</span><span id="line-6666">                this.prepareFlushResult = prepareResult;</span>
-<span class="source-line-no">6667</span><span id="line-6667">                status.markComplete("Flush prepare successful");</span>
-<span class="source-line-no">6668</span><span id="line-6668">                if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6669</span><span id="line-6669">                  LOG.debug("{} prepared flush with seqId: {}", getRegionInfo(),</span>
-<span class="source-line-no">6670</span><span id="line-6670">                    flushDesc.getFlushSequenceNumber());</span>
-<span class="source-line-no">6671</span><span id="line-6671">                }</span>
-<span class="source-line-no">6672</span><span id="line-6672">              } else {</span>
-<span class="source-line-no">6673</span><span id="line-6673">                // special case empty memstore. We will still save the flush result in this case,</span>
-<span class="source-line-no">6674</span><span id="line-6674">                // since our memstore is empty, but the primary is still flushing</span>
-<span class="source-line-no">6675</span><span id="line-6675">                if (</span>
-<span class="source-line-no">6676</span><span id="line-6676">                  prepareResult.getResult().getResult()</span>
-<span class="source-line-no">6677</span><span id="line-6677">                      == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY</span>
-<span class="source-line-no">6678</span><span id="line-6678">                ) {</span>
-<span class="source-line-no">6679</span><span id="line-6679">                  this.prepareFlushResult = prepareResult;</span>
-<span class="source-line-no">6680</span><span id="line-6680">                  if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6681</span><span id="line-6681">                    LOG.debug("{} prepared empty flush with seqId: {}", getRegionInfo(),</span>
-<span class="source-line-no">6682</span><span id="line-6682">                      flushDesc.getFlushSequenceNumber());</span>
-<span class="source-line-no">6683</span><span id="line-6683">                  }</span>
+<span class="source-line-no">6594</span><span id="line-6594"></span>
+<span class="source-line-no">6595</span><span id="line-6595">          StoreContext storeContext = store.getStoreContext();</span>
+<span class="source-line-no">6596</span><span id="line-6596">          StoreFileTracker sft = StoreFileTrackerFactory.create(conf, false, storeContext);</span>
+<span class="source-line-no">6597</span><span id="line-6597"></span>
+<span class="source-line-no">6598</span><span id="line-6598">          List&lt;StoreFileInfo&gt; storeFiles = sft.load();</span>
+<span class="source-line-no">6599</span><span id="line-6599">          for (StoreFileInfo storeFileInfo : storeFiles) {</span>
+<span class="source-line-no">6600</span><span id="line-6600">            try {</span>
+<span class="source-line-no">6601</span><span id="line-6601">              store.bulkLoadHFile(storeFileInfo);</span>
+<span class="source-line-no">6602</span><span id="line-6602">            } catch (FileNotFoundException ex) {</span>
+<span class="source-line-no">6603</span><span id="line-6603">              LOG.warn(getRegionInfo().getEncodedName() + " : " + storeFileInfo.toString()</span>
+<span class="source-line-no">6604</span><span id="line-6604">                + " doesn't exist any more. Skip loading the file");</span>
+<span class="source-line-no">6605</span><span id="line-6605">            }</span>
+<span class="source-line-no">6606</span><span id="line-6606">          }</span>
+<span class="source-line-no">6607</span><span id="line-6607">        }</span>
+<span class="source-line-no">6608</span><span id="line-6608">      }</span>
+<span class="source-line-no">6609</span><span id="line-6609">      if (bulkLoadEvent.getBulkloadSeqNum() &gt; 0) {</span>
+<span class="source-line-no">6610</span><span id="line-6610">        mvcc.advanceTo(bulkLoadEvent.getBulkloadSeqNum());</span>
+<span class="source-line-no">6611</span><span id="line-6611">      }</span>
+<span class="source-line-no">6612</span><span id="line-6612">    } finally {</span>
+<span class="source-line-no">6613</span><span id="line-6613">      closeBulkRegionOperation();</span>
+<span class="source-line-no">6614</span><span id="line-6614">    }</span>
+<span class="source-line-no">6615</span><span id="line-6615">  }</span>
+<span class="source-line-no">6616</span><span id="line-6616"></span>
+<span class="source-line-no">6617</span><span id="line-6617">  /**</span>
+<span class="source-line-no">6618</span><span id="line-6618">   * Replay the batch mutate for secondary replica.</span>
+<span class="source-line-no">6619</span><span id="line-6619">   * &lt;p/&gt;</span>
+<span class="source-line-no">6620</span><span id="line-6620">   * We will directly apply the cells to the memstore. This is because:</span>
+<span class="source-line-no">6621</span><span id="line-6621">   * &lt;ol&gt;</span>
+<span class="source-line-no">6622</span><span id="line-6622">   * &lt;li&gt;All the cells are gotten from {@link WALEdit}, so we only have {@link Put} and</span>
+<span class="source-line-no">6623</span><span id="line-6623">   * {@link Delete} here&lt;/li&gt;</span>
+<span class="source-line-no">6624</span><span id="line-6624">   * &lt;li&gt;The replay is single threaded, we do not need to acquire row lock, as the region is read</span>
+<span class="source-line-no">6625</span><span id="line-6625">   * only so no one else can write it.&lt;/li&gt;</span>
+<span class="source-line-no">6626</span><span id="line-6626">   * &lt;li&gt;We do not need to write WAL.&lt;/li&gt;</span>
+<span class="source-line-no">6627</span><span id="line-6627">   * &lt;li&gt;We will advance MVCC in the caller directly.&lt;/li&gt;</span>
+<span class="source-line-no">6628</span><span id="line-6628">   * &lt;/ol&gt;</span>
+<span class="source-line-no">6629</span><span id="line-6629">   */</span>
+<span class="source-line-no">6630</span><span id="line-6630">  private void replayWALBatchMutate(Map&lt;byte[], List&lt;ExtendedCell&gt;&gt; family2Cells)</span>
+<span class="source-line-no">6631</span><span id="line-6631">    throws IOException {</span>
+<span class="source-line-no">6632</span><span id="line-6632">    startRegionOperation(Operation.REPLAY_BATCH_MUTATE);</span>
+<span class="source-line-no">6633</span><span id="line-6633">    try {</span>
+<span class="source-line-no">6634</span><span id="line-6634">      for (Map.Entry&lt;byte[], List&lt;ExtendedCell&gt;&gt; entry : family2Cells.entrySet()) {</span>
+<span class="source-line-no">6635</span><span id="line-6635">        applyToMemStore(getStore(entry.getKey()), entry.getValue(), false, memStoreSizing);</span>
+<span class="source-line-no">6636</span><span id="line-6636">      }</span>
+<span class="source-line-no">6637</span><span id="line-6637">    } finally {</span>
+<span class="source-line-no">6638</span><span id="line-6638">      closeRegionOperation(Operation.REPLAY_BATCH_MUTATE);</span>
+<span class="source-line-no">6639</span><span id="line-6639">    }</span>
+<span class="source-line-no">6640</span><span id="line-6640">  }</span>
+<span class="source-line-no">6641</span><span id="line-6641"></span>
+<span class="source-line-no">6642</span><span id="line-6642">  /**</span>
+<span class="source-line-no">6643</span><span id="line-6643">   * Replay the meta edits, i.e, flush marker, compaction marker, bulk load marker, region event</span>
+<span class="source-line-no">6644</span><span id="line-6644">   * marker, etc.</span>
+<span class="source-line-no">6645</span><span id="line-6645">   * &lt;p/&gt;</span>
+<span class="source-line-no">6646</span><span id="line-6646">   * For all events other than start flush, we will just call {@link #refreshStoreFiles()} as the</span>
+<span class="source-line-no">6647</span><span id="line-6647">   * logic is straight-forward and robust. For start flush, we need to snapshot the memstore, so</span>
+<span class="source-line-no">6648</span><span id="line-6648">   * later {@link #refreshStoreFiles()} call could drop the snapshot, otherwise we may run out of</span>
+<span class="source-line-no">6649</span><span id="line-6649">   * memory.</span>
+<span class="source-line-no">6650</span><span id="line-6650">   */</span>
+<span class="source-line-no">6651</span><span id="line-6651">  private void replayWALMetaEdit(Cell cell) throws IOException {</span>
+<span class="source-line-no">6652</span><span id="line-6652">    startRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">6653</span><span id="line-6653">    try {</span>
+<span class="source-line-no">6654</span><span id="line-6654">      FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);</span>
+<span class="source-line-no">6655</span><span id="line-6655">      if (flushDesc != null) {</span>
+<span class="source-line-no">6656</span><span id="line-6656">        switch (flushDesc.getAction()) {</span>
+<span class="source-line-no">6657</span><span id="line-6657">          case START_FLUSH:</span>
+<span class="source-line-no">6658</span><span id="line-6658">            // for start flush, we need to take a snapshot of the current memstore</span>
+<span class="source-line-no">6659</span><span id="line-6659">            synchronized (writestate) {</span>
+<span class="source-line-no">6660</span><span id="line-6660">              if (!writestate.flushing) {</span>
+<span class="source-line-no">6661</span><span id="line-6661">                this.writestate.flushing = true;</span>
+<span class="source-line-no">6662</span><span id="line-6662">              } else {</span>
+<span class="source-line-no">6663</span><span id="line-6663">                // usually this should not happen but let's make the code more robust, it is not a</span>
+<span class="source-line-no">6664</span><span id="line-6664">                // big deal to just ignore it, the refreshStoreFiles call should have the ability to</span>
+<span class="source-line-no">6665</span><span id="line-6665">                // clean up the inconsistent state.</span>
+<span class="source-line-no">6666</span><span id="line-6666">                LOG.debug("NOT flushing {} as already flushing", getRegionInfo());</span>
+<span class="source-line-no">6667</span><span id="line-6667">                break;</span>
+<span class="source-line-no">6668</span><span id="line-6668">              }</span>
+<span class="source-line-no">6669</span><span id="line-6669">            }</span>
+<span class="source-line-no">6670</span><span id="line-6670">            MonitoredTask status =</span>
+<span class="source-line-no">6671</span><span id="line-6671">              TaskMonitor.get().createStatus("Preparing flush " + getRegionInfo());</span>
+<span class="source-line-no">6672</span><span id="line-6672">            Collection&lt;HStore&gt; storesToFlush = getStoresToFlush(flushDesc);</span>
+<span class="source-line-no">6673</span><span id="line-6673">            try {</span>
+<span class="source-line-no">6674</span><span id="line-6674">              PrepareFlushResult prepareResult =</span>
+<span class="source-line-no">6675</span><span id="line-6675">                internalPrepareFlushCache(null, flushDesc.getFlushSequenceNumber(), storesToFlush,</span>
+<span class="source-line-no">6676</span><span id="line-6676">                  status, false, FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">6677</span><span id="line-6677">              if (prepareResult.result == null) {</span>
+<span class="source-line-no">6678</span><span id="line-6678">                // save the PrepareFlushResult so that we can use it later from commit flush</span>
+<span class="source-line-no">6679</span><span id="line-6679">                this.prepareFlushResult = prepareResult;</span>
+<span class="source-line-no">6680</span><span id="line-6680">                status.markComplete("Flush prepare successful");</span>
+<span class="source-line-no">6681</span><span id="line-6681">                if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6682</span><span id="line-6682">                  LOG.debug("{} prepared flush with seqId: {}", getRegionInfo(),</span>
+<span class="source-line-no">6683</span><span id="line-6683">                    flushDesc.getFlushSequenceNumber());</span>
 <span class="source-line-no">6684</span><span id="line-6684">                }</span>
-<span class="source-line-no">6685</span><span id="line-6685">                status.abort("Flush prepare failed with " + prepareResult.result);</span>
-<span class="source-line-no">6686</span><span id="line-6686">                // nothing much to do. prepare flush failed because of some reason.</span>
-<span class="source-line-no">6687</span><span id="line-6687">              }</span>
-<span class="source-line-no">6688</span><span id="line-6688">            } finally {</span>
-<span class="source-line-no">6689</span><span id="line-6689">              status.cleanup();</span>
-<span class="source-line-no">6690</span><span id="line-6690">            }</span>
-<span class="source-line-no">6691</span><span id="line-6691">            break;</span>
-<span class="source-line-no">6692</span><span id="line-6692">          case ABORT_FLUSH:</span>
-<span class="source-line-no">6693</span><span id="line-6693">            // do nothing, an abort flush means the source region server will crash itself, after</span>
-<span class="source-line-no">6694</span><span id="line-6694">            // the primary region online, it will send us an open region marker, then we can clean</span>
-<span class="source-line-no">6695</span><span id="line-6695">            // up the memstore.</span>
-<span class="source-line-no">6696</span><span id="line-6696">            synchronized (writestate) {</span>
-<span class="source-line-no">6697</span><span id="line-6697">              writestate.flushing = false;</span>
-<span class="source-line-no">6698</span><span id="line-6698">            }</span>
-<span class="source-line-no">6699</span><span id="line-6699">            break;</span>
-<span class="source-line-no">6700</span><span id="line-6700">          case COMMIT_FLUSH:</span>
-<span class="source-line-no">6701</span><span id="line-6701">          case CANNOT_FLUSH:</span>
-<span class="source-line-no">6702</span><span id="line-6702">            // just call refreshStoreFiles</span>
-<span class="source-line-no">6703</span><span id="line-6703">            refreshStoreFiles();</span>
-<span class="source-line-no">6704</span><span id="line-6704">            logRegionFiles();</span>
-<span class="source-line-no">6705</span><span id="line-6705">            synchronized (writestate) {</span>
-<span class="source-line-no">6706</span><span id="line-6706">              writestate.flushing = false;</span>
-<span class="source-line-no">6707</span><span id="line-6707">            }</span>
-<span class="source-line-no">6708</span><span id="line-6708">            break;</span>
-<span class="source-line-no">6709</span><span id="line-6709">          default:</span>
-<span class="source-line-no">6710</span><span id="line-6710">            LOG.warn("{} received a flush event with unknown action: {}", getRegionInfo(),</span>
-<span class="source-line-no">6711</span><span id="line-6711">              TextFormat.shortDebugString(flushDesc));</span>
-<span class="source-line-no">6712</span><span id="line-6712">        }</span>
-<span class="source-line-no">6713</span><span id="line-6713">      } else {</span>
-<span class="source-line-no">6714</span><span id="line-6714">        // for all other region events, we will do a refreshStoreFiles</span>
-<span class="source-line-no">6715</span><span id="line-6715">        refreshStoreFiles();</span>
-<span class="source-line-no">6716</span><span id="line-6716">        logRegionFiles();</span>
-<span class="source-line-no">6717</span><span id="line-6717">      }</span>
-<span class="source-line-no">6718</span><span id="line-6718">    } finally {</span>
-<span class="source-line-no">6719</span><span id="line-6719">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
-<span class="source-line-no">6720</span><span id="line-6720">    }</span>
-<span class="source-line-no">6721</span><span id="line-6721">  }</span>
-<span class="source-line-no">6722</span><span id="line-6722"></span>
-<span class="source-line-no">6723</span><span id="line-6723">  /**</span>
-<span class="source-line-no">6724</span><span id="line-6724">   * Replay remote wal entry sent by primary replica.</span>
-<span class="source-line-no">6725</span><span id="line-6725">   * &lt;p/&gt;</span>
-<span class="source-line-no">6726</span><span id="line-6726">   * Should only call this method on secondary replicas.</span>
-<span class="source-line-no">6727</span><span id="line-6727">   */</span>
-<span class="source-line-no">6728</span><span id="line-6728">  void replayWALEntry(WALEntry entry, CellScanner cells) throws IOException {</span>
-<span class="source-line-no">6729</span><span id="line-6729">    long timeout = -1L;</span>
-<span class="source-line-no">6730</span><span id="line-6730">    Optional&lt;RpcCall&gt; call = RpcServer.getCurrentCall();</span>
-<span class="source-line-no">6731</span><span id="line-6731">    if (call.isPresent()) {</span>
-<span class="source-line-no">6732</span><span id="line-6732">      long deadline = call.get().getDeadline();</span>
-<span class="source-line-no">6733</span><span id="line-6733">      if (deadline &lt; Long.MAX_VALUE) {</span>
-<span class="source-line-no">6734</span><span id="line-6734">        timeout = deadline - EnvironmentEdgeManager.currentTime();</span>
-<span class="source-line-no">6735</span><span id="line-6735">        if (timeout &lt;= 0) {</span>
-<span class="source-line-no">6736</span><span id="line-6736">          throw new TimeoutIOException("Timeout while replaying edits for " + getRegionInfo());</span>
-<span class="source-line-no">6737</span><span id="line-6737">        }</span>
-<span class="source-line-no">6738</span><span id="line-6738">      }</span>
-<span class="source-line-no">6739</span><span id="line-6739">    }</span>
-<span class="source-line-no">6740</span><span id="line-6740">    if (timeout &gt; 0) {</span>
-<span class="source-line-no">6741</span><span id="line-6741">      try {</span>
-<span class="source-line-no">6742</span><span id="line-6742">        if (!replayLock.tryLock(timeout, TimeUnit.MILLISECONDS)) {</span>
-<span class="source-line-no">6743</span><span id="line-6743">          throw new TimeoutIOException(</span>
-<span class="source-line-no">6744</span><span id="line-6744">            "Timeout while waiting for lock when replaying edits for " + getRegionInfo());</span>
-<span class="source-line-no">6745</span><span id="line-6745">        }</span>
-<span class="source-line-no">6746</span><span id="line-6746">      } catch (InterruptedException e) {</span>
-<span class="source-line-no">6747</span><span id="line-6747">        throw throwOnInterrupt(e);</span>
-<span class="source-line-no">6748</span><span id="line-6748">      }</span>
-<span class="source-line-no">6749</span><span id="line-6749">    } else {</span>
-<span class="source-line-no">6750</span><span id="line-6750">      replayLock.lock();</span>
-<span class="source-line-no">6751</span><span id="line-6751">    }</span>
-<span class="source-line-no">6752</span><span id="line-6752">    try {</span>
-<span class="source-line-no">6753</span><span id="line-6753">      int count = entry.getAssociatedCellCount();</span>
-<span class="source-line-no">6754</span><span id="line-6754">      long sequenceId = entry.getKey().getLogSequenceNumber();</span>
-<span class="source-line-no">6755</span><span id="line-6755">      if (lastReplayedSequenceId &gt;= sequenceId) {</span>
-<span class="source-line-no">6756</span><span id="line-6756">        // we have already replayed this edit, skip</span>
-<span class="source-line-no">6757</span><span id="line-6757">        // remember to advance the CellScanner, as we may have multiple WALEntries, we may still</span>
-<span class="source-line-no">6758</span><span id="line-6758">        // need apply later WALEntries</span>
-<span class="source-line-no">6759</span><span id="line-6759">        for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">6760</span><span id="line-6760">          // Throw index out of bounds if our cell count is off</span>
-<span class="source-line-no">6761</span><span id="line-6761">          if (!cells.advance()) {</span>
-<span class="source-line-no">6762</span><span id="line-6762">            throw new ArrayIndexOutOfBoundsException("Expected=" + count + ", index=" + i);</span>
-<span class="source-line-no">6763</span><span id="line-6763">          }</span>
-<span class="source-line-no">6764</span><span id="line-6764">        }</span>
-<span class="source-line-no">6765</span><span id="line-6765">        return;</span>
-<span class="source-line-no">6766</span><span id="line-6766">      }</span>
-<span class="source-line-no">6767</span><span id="line-6767">      Map&lt;byte[], List&lt;ExtendedCell&gt;&gt; family2Cells = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">6768</span><span id="line-6768">      for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">6769</span><span id="line-6769">        // Throw index out of bounds if our cell count is off</span>
-<span class="source-line-no">6770</span><span id="line-6770">        if (!cells.advance()) {</span>
-<span class="source-line-no">6771</span><span id="line-6771">          throw new ArrayIndexOutOfBoundsException("Expected=" + count + ", index=" + i);</span>
-<span class="source-line-no">6772</span><span id="line-6772">        }</span>
-<span class="source-line-no">6773</span><span id="line-6773">        Cell c = cells.current();</span>
-<span class="source-line-no">6774</span><span id="line-6774">        assert c instanceof ExtendedCell;</span>
-<span class="source-line-no">6775</span><span id="line-6775">        ExtendedCell cell = (ExtendedCell) c;</span>
-<span class="source-line-no">6776</span><span id="line-6776">        if (WALEdit.isMetaEditFamily(cell)) {</span>
-<span class="source-line-no">6777</span><span id="line-6777">          // If there is meta edit, i.e, we have done flush/compaction/open, then we need to apply</span>
-<span class="source-line-no">6778</span><span id="line-6778">          // the previous cells first, and then replay the special meta edit. The meta edit is like</span>
-<span class="source-line-no">6779</span><span id="line-6779">          // a barrier, We need to keep the order. For example, the flush marker will contain a</span>
-<span class="source-line-no">6780</span><span id="line-6780">          // flush sequence number, which makes us possible to drop memstore content, but if we</span>
-<span class="source-line-no">6781</span><span id="line-6781">          // apply some edits which have greater sequence id first, then we can not drop the</span>
-<span class="source-line-no">6782</span><span id="line-6782">          // memstore content when replaying the flush marker, which is not good as we could run out</span>
-<span class="source-line-no">6783</span><span id="line-6783">          // of memory.</span>
-<span class="source-line-no">6784</span><span id="line-6784">          // And usually, a meta edit will have a special WALEntry for it, so this is just a safe</span>
-<span class="source-line-no">6785</span><span id="line-6785">          // guard logic to make sure we do not break things in the worst case.</span>
-<span class="source-line-no">6786</span><span id="line-6786">          if (!family2Cells.isEmpty()) {</span>
-<span class="source-line-no">6787</span><span id="line-6787">            replayWALBatchMutate(family2Cells);</span>
-<span class="source-line-no">6788</span><span id="line-6788">            family2Cells.clear();</span>
-<span class="source-line-no">6789</span><span id="line-6789">          }</span>
-<span class="source-line-no">6790</span><span id="line-6790">          replayWALMetaEdit(cell);</span>
-<span class="source-line-no">6791</span><span id="line-6791">        } else {</span>
-<span class="source-line-no">6792</span><span id="line-6792">          family2Cells.computeIfAbsent(CellUtil.cloneFamily(cell), k -&gt; new ArrayList&lt;&gt;())</span>
-<span class="source-line-no">6793</span><span id="line-6793">            .add(cell);</span>
-<span class="source-line-no">6794</span><span id="line-6794">        }</span>
-<span class="source-line-no">6795</span><span id="line-6795">      }</span>
-<span class="source-line-no">6796</span><span id="line-6796">      // do not forget to apply the remaining cells</span>
-<span class="source-line-no">6797</span><span id="line-6797">      if (!family2Cells.isEmpty()) {</span>
-<span class="source-line-no">6798</span><span id="line-6798">        replayWALBatchMutate(family2Cells);</span>
-<span class="source-line-no">6799</span><span id="line-6799">      }</span>
-<span class="source-line-no">6800</span><span id="line-6800">      mvcc.advanceTo(sequenceId);</span>
-<span class="source-line-no">6801</span><span id="line-6801">      lastReplayedSequenceId = sequenceId;</span>
-<span class="source-line-no">6802</span><span id="line-6802">    } finally {</span>
-<span class="source-line-no">6803</span><span id="line-6803">      replayLock.unlock();</span>
-<span class="source-line-no">6804</span><span id="line-6804">    }</span>
-<span class="source-line-no">6805</span><span id="line-6805">  }</span>
-<span class="source-line-no">6806</span><span id="line-6806"></span>
-<span class="source-line-no">6807</span><span id="line-6807">  /**</span>
-<span class="source-line-no">6808</span><span id="line-6808">   * If all stores ended up dropping their snapshots, we can safely drop the prepareFlushResult</span>
-<span class="source-line-no">6809</span><span id="line-6809">   */</span>
-<span class="source-line-no">6810</span><span id="line-6810">  private void dropPrepareFlushIfPossible() {</span>
-<span class="source-line-no">6811</span><span id="line-6811">    if (writestate.flushing) {</span>
-<span class="source-line-no">6812</span><span id="line-6812">      boolean canDrop = true;</span>
-<span class="source-line-no">6813</span><span id="line-6813">      if (prepareFlushResult.storeFlushCtxs != null) {</span>
-<span class="source-line-no">6814</span><span id="line-6814">        for (Entry&lt;byte[], StoreFlushContext&gt; entry : prepareFlushResult.storeFlushCtxs</span>
-<span class="source-line-no">6815</span><span id="line-6815">          .entrySet()) {</span>
-<span class="source-line-no">6816</span><span id="line-6816">          HStore store = getStore(entry.getKey());</span>
-<span class="source-line-no">6817</span><span id="line-6817">          if (store == null) {</span>
-<span class="source-line-no">6818</span><span id="line-6818">            continue;</span>
-<span class="source-line-no">6819</span><span id="line-6819">          }</span>
-<span class="source-line-no">6820</span><span id="line-6820">          if (store.getSnapshotSize().getDataSize() &gt; 0) {</span>
-<span class="source-line-no">6821</span><span id="line-6821">            canDrop = false;</span>
-<span class="source-line-no">6822</span><span id="line-6822">            break;</span>
-<span class="source-line-no">6823</span><span id="line-6823">          }</span>
-<span class="source-line-no">6824</span><span id="line-6824">        }</span>
-<span class="source-line-no">6825</span><span id="line-6825">      }</span>
-<span class="source-line-no">6826</span><span id="line-6826"></span>
-<span class="source-line-no">6827</span><span id="line-6827">      // this means that all the stores in the region has finished flushing, but the WAL marker</span>
-<span class="source-line-no">6828</span><span id="line-6828">      // may not have been written or we did not receive it yet.</span>
-<span class="source-line-no">6829</span><span id="line-6829">      if (canDrop) {</span>
-<span class="source-line-no">6830</span><span id="line-6830">        writestate.flushing = false;</span>
-<span class="source-line-no">6831</span><span id="line-6831">        this.prepareFlushResult = null;</span>
-<span class="source-line-no">6832</span><span id="line-6832">      }</span>
-<span class="source-line-no">6833</span><span id="line-6833">    }</span>
-<span class="source-line-no">6834</span><span id="line-6834">  }</span>
-<span class="source-line-no">6835</span><span id="line-6835"></span>
-<span class="source-line-no">6836</span><span id="line-6836">  @Override</span>
-<span class="source-line-no">6837</span><span id="line-6837">  public boolean refreshStoreFiles() throws IOException {</span>
-<span class="source-line-no">6838</span><span id="line-6838">    return refreshStoreFiles(false);</span>
-<span class="source-line-no">6839</span><span id="line-6839">  }</span>
-<span class="source-line-no">6840</span><span id="line-6840"></span>
-<span class="source-line-no">6841</span><span id="line-6841">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
-<span class="source-line-no">6842</span><span id="line-6842">      justification = "Notify is about post replay. Intentional")</span>
-<span class="source-line-no">6843</span><span id="line-6843">  protected boolean refreshStoreFiles(boolean force) throws IOException {</span>
-<span class="source-line-no">6844</span><span id="line-6844">    if (!force &amp;&amp; ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
-<span class="source-line-no">6845</span><span id="line-6845">      return false; // if primary nothing to do</span>
+<span class="source-line-no">6685</span><span id="line-6685">              } else {</span>
+<span class="source-line-no">6686</span><span id="line-6686">                // special case empty memstore. We will still save the flush result in this case,</span>
+<span class="source-line-no">6687</span><span id="line-6687">                // since our memstore is empty, but the primary is still flushing</span>
+<span class="source-line-no">6688</span><span id="line-6688">                if (</span>
+<span class="source-line-no">6689</span><span id="line-6689">                  prepareResult.getResult().getResult()</span>
+<span class="source-line-no">6690</span><span id="line-6690">                      == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY</span>
+<span class="source-line-no">6691</span><span id="line-6691">                ) {</span>
+<span class="source-line-no">6692</span><span id="line-6692">                  this.prepareFlushResult = prepareResult;</span>
+<span class="source-line-no">6693</span><span id="line-6693">                  if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6694</span><span id="line-6694">                    LOG.debug("{} prepared empty flush with seqId: {}", getRegionInfo(),</span>
+<span class="source-line-no">6695</span><span id="line-6695">                      flushDesc.getFlushSequenceNumber());</span>
+<span class="source-line-no">6696</span><span id="line-6696">                  }</span>
+<span class="source-line-no">6697</span><span id="line-6697">                }</span>
+<span class="source-line-no">6698</span><span id="line-6698">                status.abort("Flush prepare failed with " + prepareResult.result);</span>
+<span class="source-line-no">6699</span><span id="line-6699">                // nothing much to do. prepare flush failed because of some reason.</span>
+<span class="source-line-no">6700</span><span id="line-6700">              }</span>
+<span class="source-line-no">6701</span><span id="line-6701">            } finally {</span>
+<span class="source-line-no">6702</span><span id="line-6702">              status.cleanup();</span>
+<span class="source-line-no">6703</span><span id="line-6703">            }</span>
+<span class="source-line-no">6704</span><span id="line-6704">            break;</span>
+<span class="source-line-no">6705</span><span id="line-6705">          case ABORT_FLUSH:</span>
+<span class="source-line-no">6706</span><span id="line-6706">            // do nothing, an abort flush means the source region server will crash itself, after</span>
+<span class="source-line-no">6707</span><span id="line-6707">            // the primary region online, it will send us an open region marker, then we can clean</span>
+<span class="source-line-no">6708</span><span id="line-6708">            // up the memstore.</span>
+<span class="source-line-no">6709</span><span id="line-6709">            synchronized (writestate) {</span>
+<span class="source-line-no">6710</span><span id="line-6710">              writestate.flushing = false;</span>
+<span class="source-line-no">6711</span><span id="line-6711">            }</span>
+<span class="source-line-no">6712</span><span id="line-6712">            break;</span>
+<span class="source-line-no">6713</span><span id="line-6713">          case COMMIT_FLUSH:</span>
+<span class="source-line-no">6714</span><span id="line-6714">          case CANNOT_FLUSH:</span>
+<span class="source-line-no">6715</span><span id="line-6715">            // just call refreshStoreFiles</span>
+<span class="source-line-no">6716</span><span id="line-6716">            refreshStoreFiles();</span>
+<span class="source-line-no">6717</span><span id="line-6717">            logRegionFiles();</span>
+<span class="source-line-no">6718</span><span id="line-6718">            synchronized (writestate) {</span>
+<span class="source-line-no">6719</span><span id="line-6719">              writestate.flushing = false;</span>
+<span class="source-line-no">6720</span><span id="line-6720">            }</span>
+<span class="source-line-no">6721</span><span id="line-6721">            break;</span>
+<span class="source-line-no">6722</span><span id="line-6722">          default:</span>
+<span class="source-line-no">6723</span><span id="line-6723">            LOG.warn("{} received a flush event with unknown action: {}", getRegionInfo(),</span>
+<span class="source-line-no">6724</span><span id="line-6724">              TextFormat.shortDebugString(flushDesc));</span>
+<span class="source-line-no">6725</span><span id="line-6725">        }</span>
+<span class="source-line-no">6726</span><span id="line-6726">      } else {</span>
+<span class="source-line-no">6727</span><span id="line-6727">        // for all other region events, we will do a refreshStoreFiles</span>
+<span class="source-line-no">6728</span><span id="line-6728">        refreshStoreFiles();</span>
+<span class="source-line-no">6729</span><span id="line-6729">        logRegionFiles();</span>
+<span class="source-line-no">6730</span><span id="line-6730">      }</span>
+<span class="source-line-no">6731</span><span id="line-6731">    } finally {</span>
+<span class="source-line-no">6732</span><span id="line-6732">      closeRegionOperation(Operation.REPLAY_EVENT);</span>
+<span class="source-line-no">6733</span><span id="line-6733">    }</span>
+<span class="source-line-no">6734</span><span id="line-6734">  }</span>
+<span class="source-line-no">6735</span><span id="line-6735"></span>
+<span class="source-line-no">6736</span><span id="line-6736">  /**</span>
+<span class="source-line-no">6737</span><span id="line-6737">   * Replay remote wal entry sent by primary replica.</span>
+<span class="source-line-no">6738</span><span id="line-6738">   * &lt;p/&gt;</span>
+<span class="source-line-no">6739</span><span id="line-6739">   * Should only call this method on secondary replicas.</span>
+<span class="source-line-no">6740</span><span id="line-6740">   */</span>
+<span class="source-line-no">6741</span><span id="line-6741">  void replayWALEntry(WALEntry entry, CellScanner cells) throws IOException {</span>
+<span class="source-line-no">6742</span><span id="line-6742">    long timeout = -1L;</span>
+<span class="source-line-no">6743</span><span id="line-6743">    Optional&lt;RpcCall&gt; call = RpcServer.getCurrentCall();</span>
+<span class="source-line-no">6744</span><span id="line-6744">    if (call.isPresent()) {</span>
+<span class="source-line-no">6745</span><span id="line-6745">      long deadline = call.get().getDeadline();</span>
+<span class="source-line-no">6746</span><span id="line-6746">      if (deadline &lt; Long.MAX_VALUE) {</span>
+<span class="source-line-no">6747</span><span id="line-6747">        timeout = deadline - EnvironmentEdgeManager.currentTime();</span>
+<span class="source-line-no">6748</span><span id="line-6748">        if (timeout &lt;= 0) {</span>
+<span class="source-line-no">6749</span><span id="line-6749">          throw new TimeoutIOException("Timeout while replaying edits for " + getRegionInfo());</span>
+<span class="source-line-no">6750</span><span id="line-6750">        }</span>
+<span class="source-line-no">6751</span><span id="line-6751">      }</span>
+<span class="source-line-no">6752</span><span id="line-6752">    }</span>
+<span class="source-line-no">6753</span><span id="line-6753">    if (timeout &gt; 0) {</span>
+<span class="source-line-no">6754</span><span id="line-6754">      try {</span>
+<span class="source-line-no">6755</span><span id="line-6755">        if (!replayLock.tryLock(timeout, TimeUnit.MILLISECONDS)) {</span>
+<span class="source-line-no">6756</span><span id="line-6756">          throw new TimeoutIOException(</span>
+<span class="source-line-no">6757</span><span id="line-6757">            "Timeout while waiting for lock when replaying edits for " + getRegionInfo());</span>
+<span class="source-line-no">6758</span><span id="line-6758">        }</span>
+<span class="source-line-no">6759</span><span id="line-6759">      } catch (InterruptedException e) {</span>
+<span class="source-line-no">6760</span><span id="line-6760">        throw throwOnInterrupt(e);</span>
+<span class="source-line-no">6761</span><span id="line-6761">      }</span>
+<span class="source-line-no">6762</span><span id="line-6762">    } else {</span>
+<span class="source-line-no">6763</span><span id="line-6763">      replayLock.lock();</span>
+<span class="source-line-no">6764</span><span id="line-6764">    }</span>
+<span class="source-line-no">6765</span><span id="line-6765">    try {</span>
+<span class="source-line-no">6766</span><span id="line-6766">      int count = entry.getAssociatedCellCount();</span>
+<span class="source-line-no">6767</span><span id="line-6767">      long sequenceId = entry.getKey().getLogSequenceNumber();</span>
+<span class="source-line-no">6768</span><span id="line-6768">      if (lastReplayedSequenceId &gt;= sequenceId) {</span>
+<span class="source-line-no">6769</span><span id="line-6769">        // we have already replayed this edit, skip</span>
+<span class="source-line-no">6770</span><span id="line-6770">        // remember to advance the CellScanner, as we may have multiple WALEntries, we may still</span>
+<span class="source-line-no">6771</span><span id="line-6771">        // need apply later WALEntries</span>
+<span class="source-line-no">6772</span><span id="line-6772">        for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">6773</span><span id="line-6773">          // Throw index out of bounds if our cell count is off</span>
+<span class="source-line-no">6774</span><span id="line-6774">          if (!cells.advance()) {</span>
+<span class="source-line-no">6775</span><span id="line-6775">            throw new ArrayIndexOutOfBoundsException("Expected=" + count + ", index=" + i);</span>
+<span class="source-line-no">6776</span><span id="line-6776">          }</span>
+<span class="source-line-no">6777</span><span id="line-6777">        }</span>
+<span class="source-line-no">6778</span><span id="line-6778">        return;</span>
+<span class="source-line-no">6779</span><span id="line-6779">      }</span>
+<span class="source-line-no">6780</span><span id="line-6780">      Map&lt;byte[], List&lt;ExtendedCell&gt;&gt; family2Cells = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">6781</span><span id="line-6781">      for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">6782</span><span id="line-6782">        // Throw index out of bounds if our cell count is off</span>
+<span class="source-line-no">6783</span><span id="line-6783">        if (!cells.advance()) {</span>
+<span class="source-line-no">6784</span><span id="line-6784">          throw new ArrayIndexOutOfBoundsException("Expected=" + count + ", index=" + i);</span>
+<span class="source-line-no">6785</span><span id="line-6785">        }</span>
+<span class="source-line-no">6786</span><span id="line-6786">        Cell c = cells.current();</span>
+<span class="source-line-no">6787</span><span id="line-6787">        assert c instanceof ExtendedCell;</span>
+<span class="source-line-no">6788</span><span id="line-6788">        ExtendedCell cell = (ExtendedCell) c;</span>
+<span class="source-line-no">6789</span><span id="line-6789">        if (WALEdit.isMetaEditFamily(cell)) {</span>
+<span class="source-line-no">6790</span><span id="line-6790">          // If there is meta edit, i.e, we have done flush/compaction/open, then we need to apply</span>
+<span class="source-line-no">6791</span><span id="line-6791">          // the previous cells first, and then replay the special meta edit. The meta edit is like</span>
+<span class="source-line-no">6792</span><span id="line-6792">          // a barrier, We need to keep the order. For example, the flush marker will contain a</span>
+<span class="source-line-no">6793</span><span id="line-6793">          // flush sequence number, which makes us possible to drop memstore content, but if we</span>
+<span class="source-line-no">6794</span><span id="line-6794">          // apply some edits which have greater sequence id first, then we can not drop the</span>
+<span class="source-line-no">6795</span><span id="line-6795">          // memstore content when replaying the flush marker, which is not good as we could run out</span>
+<span class="source-line-no">6796</span><span id="line-6796">          // of memory.</span>
+<span class="source-line-no">6797</span><span id="line-6797">          // And usually, a meta edit will have a special WALEntry for it, so this is just a safe</span>
+<span class="source-line-no">6798</span><span id="line-6798">          // guard logic to make sure we do not break things in the worst case.</span>
+<span class="source-line-no">6799</span><span id="line-6799">          if (!family2Cells.isEmpty()) {</span>
+<span class="source-line-no">6800</span><span id="line-6800">            replayWALBatchMutate(family2Cells);</span>
+<span class="source-line-no">6801</span><span id="line-6801">            family2Cells.clear();</span>
+<span class="source-line-no">6802</span><span id="line-6802">          }</span>
+<span class="source-line-no">6803</span><span id="line-6803">          replayWALMetaEdit(cell);</span>
+<span class="source-line-no">6804</span><span id="line-6804">        } else {</span>
+<span class="source-line-no">6805</span><span id="line-6805">          family2Cells.computeIfAbsent(CellUtil.cloneFamily(cell), k -&gt; new ArrayList&lt;&gt;())</span>
+<span class="source-line-no">6806</span><span id="line-6806">            .add(cell);</span>
+<span class="source-line-no">6807</span><span id="line-6807">        }</span>
+<span class="source-line-no">6808</span><span id="line-6808">      }</span>
+<span class="source-line-no">6809</span><span id="line-6809">      // do not forget to apply the remaining cells</span>
+<span class="source-line-no">6810</span><span id="line-6810">      if (!family2Cells.isEmpty()) {</span>
+<span class="source-line-no">6811</span><span id="line-6811">        replayWALBatchMutate(family2Cells);</span>
+<span class="source-line-no">6812</span><span id="line-6812">      }</span>
+<span class="source-line-no">6813</span><span id="line-6813">      mvcc.advanceTo(sequenceId);</span>
+<span class="source-line-no">6814</span><span id="line-6814">      lastReplayedSequenceId = sequenceId;</span>
+<span class="source-line-no">6815</span><span id="line-6815">    } finally {</span>
+<span class="source-line-no">6816</span><span id="line-6816">      replayLock.unlock();</span>
+<span class="source-line-no">6817</span><span id="line-6817">    }</span>
+<span class="source-line-no">6818</span><span id="line-6818">  }</span>
+<span class="source-line-no">6819</span><span id="line-6819"></span>
+<span class="source-line-no">6820</span><span id="line-6820">  /**</span>
+<span class="source-line-no">6821</span><span id="line-6821">   * If all stores ended up dropping their snapshots, we can safely drop the prepareFlushResult</span>
+<span class="source-line-no">6822</span><span id="line-6822">   */</span>
+<span class="source-line-no">6823</span><span id="line-6823">  private void dropPrepareFlushIfPossible() {</span>
+<span class="source-line-no">6824</span><span id="line-6824">    if (writestate.flushing) {</span>
+<span class="source-line-no">6825</span><span id="line-6825">      boolean canDrop = true;</span>
+<span class="source-line-no">6826</span><span id="line-6826">      if (prepareFlushResult.storeFlushCtxs != null) {</span>
+<span class="source-line-no">6827</span><span id="line-6827">        for (Entry&lt;byte[], StoreFlushContext&gt; entry : prepareFlushResult.storeFlushCtxs</span>
+<span class="source-line-no">6828</span><span id="line-6828">          .entrySet()) {</span>
+<span class="source-line-no">6829</span><span id="line-6829">          HStore store = getStore(entry.getKey());</span>
+<span class="source-line-no">6830</span><span id="line-6830">          if (store == null) {</span>
+<span class="source-line-no">6831</span><span id="line-6831">            continue;</span>
+<span class="source-line-no">6832</span><span id="line-6832">          }</span>
+<span class="source-line-no">6833</span><span id="line-6833">          if (store.getSnapshotSize().getDataSize() &gt; 0) {</span>
+<span class="source-line-no">6834</span><span id="line-6834">            canDrop = false;</span>
+<span class="source-line-no">6835</span><span id="line-6835">            break;</span>
+<span class="source-line-no">6836</span><span id="line-6836">          }</span>
+<span class="source-line-no">6837</span><span id="line-6837">        }</span>
+<span class="source-line-no">6838</span><span id="line-6838">      }</span>
+<span class="source-line-no">6839</span><span id="line-6839"></span>
+<span class="source-line-no">6840</span><span id="line-6840">      // this means that all the stores in the region has finished flushing, but the WAL marker</span>
+<span class="source-line-no">6841</span><span id="line-6841">      // may not have been written or we did not receive it yet.</span>
+<span class="source-line-no">6842</span><span id="line-6842">      if (canDrop) {</span>
+<span class="source-line-no">6843</span><span id="line-6843">        writestate.flushing = false;</span>
+<span class="source-line-no">6844</span><span id="line-6844">        this.prepareFlushResult = null;</span>
+<span class="source-line-no">6845</span><span id="line-6845">      }</span>
 <span class="source-line-no">6846</span><span id="line-6846">    }</span>
-<span class="source-line-no">6847</span><span id="line-6847"></span>
-<span class="source-line-no">6848</span><span id="line-6848">    if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">6849</span><span id="line-6849">      LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
-<span class="source-line-no">6850</span><span id="line-6850">        + "Refreshing store files to see whether we can free up memstore");</span>
-<span class="source-line-no">6851</span><span id="line-6851">    }</span>
-<span class="source-line-no">6852</span><span id="line-6852"></span>
-<span class="source-line-no">6853</span><span id="line-6853">    long totalFreedDataSize = 0;</span>
-<span class="source-line-no">6854</span><span id="line-6854"></span>
-<span class="source-line-no">6855</span><span id="line-6855">    long smallestSeqIdInStores = Long.MAX_VALUE;</span>
-<span class="source-line-no">6856</span><span id="line-6856"></span>
-<span class="source-line-no">6857</span><span id="line-6857">    startRegionOperation(); // obtain region close lock</span>
-<span class="source-line-no">6858</span><span id="line-6858">    try {</span>
-<span class="source-line-no">6859</span><span id="line-6859">      Map&lt;HStore, Long&gt; map = new HashMap&lt;&gt;();</span>
-<span class="source-line-no">6860</span><span id="line-6860">      synchronized (writestate) {</span>
-<span class="source-line-no">6861</span><span id="line-6861">        for (HStore store : stores.values()) {</span>
-<span class="source-line-no">6862</span><span id="line-6862">          // TODO: some stores might see new data from flush, while others do not which</span>
-<span class="source-line-no">6863</span><span id="line-6863">          // MIGHT break atomic edits across column families.</span>
-<span class="source-line-no">6864</span><span id="line-6864">          long maxSeqIdBefore = store.getMaxSequenceId().orElse(0L);</span>
+<span class="source-line-no">6847</span><span id="line-6847">  }</span>
+<span class="source-line-no">6848</span><span id="line-6848"></span>
+<span class="source-line-no">6849</span><span id="line-6849">  @Override</span>
+<span class="source-line-no">6850</span><span id="line-6850">  public boolean refreshStoreFiles() throws IOException {</span>
+<span class="source-line-no">6851</span><span id="line-6851">    return refreshStoreFiles(false);</span>
+<span class="source-line-no">6852</span><span id="line-6852">  }</span>
+<span class="source-line-no">6853</span><span id="line-6853"></span>
+<span class="source-line-no">6854</span><span id="line-6854">  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NN_NAKED_NOTIFY",</span>
+<span class="source-line-no">6855</span><span id="line-6855">      justification = "Notify is about post replay. Intentional")</span>
+<span class="source-line-no">6856</span><span id="line-6856">  protected boolean refreshStoreFiles(boolean force) throws IOException {</span>
+<span class="source-line-no">6857</span><span id="line-6857">    if (!force &amp;&amp; ServerRegionReplicaUtil.isDefaultReplica(this.getRegionInfo())) {</span>
+<span class="source-line-no">6858</span><span id="line-6858">      return false; // if primary nothing to do</span>
+<span class="source-line-no">6859</span><span id="line-6859">    }</span>
+<span class="source-line-no">6860</span><span id="line-6860"></span>
+<span class="source-line-no">6861</span><span id="line-6861">    if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">6862</span><span id="line-6862">      LOG.debug(getRegionInfo().getEncodedName() + " : "</span>
+<span class="source-line-no">6863</span><span id="line-6863">        + "Refreshing store files to see whether we can free up memstore");</span>
+<span class="source-line-no">6864</span><span id="line-6864">    }</span>
 <span class="source-line-no">6865</span><span id="line-6865"></span>
-<span class="source-line-no">6866</span><span id="line-6866">          // refresh the store files. This is similar to observing a region open wal marker.</span>
-<span class="source-line-no">6867</span><span id="line-6867">          store.refreshStoreFiles();</span>
-<span class="source-line-no">6868</span><span id="line-6868"></span>
-<span class="source-line-no">6869</span><span id="line-6869">          long storeSeqId = store.getMaxSequenceId().orElse(0L);</span>
-<span class="source-line-no">6870</span><span id="line-6870">          if (storeSeqId &lt; smallestSeqIdInStores) {</span>
-<span class="source-line-no">6871</span><span id="line-6871">            smallestSeqIdInStores = storeSeqId;</span>
-<span class="source-line-no">6872</span><span id="line-6872">          }</span>
-<span class="source-line-no">6873</span><span id="line-6873"></span>
-<span class="source-line-no">6874</span><span id="line-6874">          // see whether we can drop the memstore or the snapshot</span>
-<span class="source-line-no">6875</span><span id="line-6875">          if (storeSeqId &gt; maxSeqIdBefore) {</span>
-<span class="source-line-no">6876</span><span id="line-6876">            if (writestate.flushing) {</span>
-<span class="source-line-no">6877</span><span id="line-6877">              // only drop memstore snapshots if they are smaller than last flush for the store</span>
-<span class="source-line-no">6878</span><span id="line-6878">              if (this.prepareFlushResult.flushOpSeqId &lt;= storeSeqId) {</span>
-<span class="source-line-no">6879</span><span id="line-6879">                StoreFlushContext ctx = this.prepareFlushResult.storeFlushCtxs == null</span>
-<span class="source-line-no">6880</span><span id="line-6880">                  ? null</span>
-<span class="source-line-no">6881</span><span id="line-6881">                  : this.prepareFlushResult.storeFlushCtxs</span>
-<span class="source-line-no">6882</span><span id="line-6882">                    .get(store.getColumnFamilyDescriptor().getName());</span>
-<span class="source-line-no">6883</span><span id="line-6883">                if (ctx != null) {</span>
-<span class="source-line-no">6884</span><span id="line-6884">                  MemStoreSize mss = store.getFlushableSize();</span>
-<span class="source-line-no">6885</span><span id="line-6885">                  ctx.abort();</span>
-<span class="source-line-no">6886</span><span id="line-6886">                  this.decrMemStoreSize(mss);</span>
-<span class="source-line-no">6887</span><span id="line-6887">                  this.prepareFlushResult.storeFlushCtxs</span>
-<span class="source-line-no">6888</span><span id="line-6888">                    .remove(store.getColumnFamilyDescriptor().getName());</span>
-<span class="source-line-no">6889</span><span id="line-6889">                  totalFreedDataSize += mss.getDataSize();</span>
-<span class="source-line-no">6890</span><span id="line-6890">                }</span>
-<span class="source-line-no">6891</span><span id="line-6891">              }</span>
-<span class="source-line-no">6892</span><span id="line-6892">            }</span>
-<span class="source-line-no">6893</span><span id="line-6893"></span>
-<span class="source-line-no">6894</span><span id="line-6894">            map.put(store, storeSeqId);</span>
-<span class="source-line-no">6895</span><span id="line-6895">          }</span>
-<span class="source-line-no">6896</span><span id="line-6896">        }</span>
-<span class="source-line-no">6897</span><span id="line-6897"></span>
-<span class="source-line-no">6898</span><span id="line-6898">        // if all stores ended up dropping their snapshots, we can safely drop the</span>
-<span class="source-line-no">6899</span><span id="line-6899">        // prepareFlushResult</span>
-<span class="source-line-no">6900</span><span id="line-6900">        dropPrepareFlushIfPossible();</span>
-<span class="source-line-no">6901</span><span id="line-6901"></span>
-<span class="source-line-no">6902</span><span id="line-6902">        // advance the mvcc read point so that the new flushed files are visible.</span>
-<span class="source-line-no">6903</span><span id="line-6903">        // either greater than flush seq number or they were already picked up via flush.</span>
-<span class="source-line-no">6904</span><span id="line-6904">        for (HStore s : stores.values()) {</span>
-<span class="source-line-no">6905</span><span id="line-6905">          mvcc.advanceTo(s.getMaxMemStoreTS().orElse(0L));</span>
-<span class="source-line-no">6906</span><span id="line-6906">        }</span>
-<span class="source-line-no">6907</span><span id="line-6907"></span>
-<span class="source-line-no">6908</span><span id="line-6908">        // smallestSeqIdInStores is the seqId that we have a corresponding hfile for. We can safely</span>
-<span class="source-line-no">6909</span><span id="line-6909">        // skip all edits that are to be replayed in the future with that has a smaller seqId</span>
-<span class="source-line-no">6910</span><span id="line-6910">        // than this. We are updating lastReplayedOpenRegionSeqId so that we can skip all edits</span>
-<span class="source-line-no">6911</span><span id="line-6911">        // that we have picked the flush files for</span>
-<span class="source-line-no">6912</span><span id="line-6912">        if (this.lastReplayedOpenRegionSeqId &lt; smallestSeqIdInStores) {</span>
-<span class="source-line-no">6913</span><span id="line-6913">          this.lastReplayedOpenRegionSeqId = smallestSeqIdInStores;</span>
-<span class="source-line-no">6914</span><span id="line-6914">        }</span>
-<span class="source-line-no">6915</span><span id="line-6915">      }</span>
-<span class="source-line-no">6916</span><span id="line-6916">      if (!map.isEmpty()) {</span>
-<span class="source-line-no">6917</span><span id="line-6917">        for (Map.Entry&lt;HStore, Long&gt; entry : map.entrySet()) {</span>
-<span class="source-line-no">6918</span><span id="line-6918">          // Drop the memstore contents if they are now smaller than the latest seen flushed file</span>
-<span class="source-line-no">6919</span><span id="line-6919">          totalFreedDataSize +=</span>
-<span class="source-line-no">6920</span><span id="line-6920">            dropMemStoreContentsForSeqId(entry.getValue(), entry.getKey()).getDataSize();</span>
-<span class="source-line-no">6921</span><span id="line-6921">        }</span>
-<span class="source-line-no">6922</span><span id="line-6922">      }</span>
-<span class="source-line-no">6923</span><span id="line-6923">      // C. Finally notify anyone waiting on memstore to clear:</span>
-<span class="source-line-no">6924</span><span id="line-6924">      // e.g. checkResources().</span>
-<span class="source-line-no">6925</span><span id="line-6925">      synchronized (this) {</span>
-<span class="source-line-no">6926</span><span id="line-6926">        notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
-<span class="source-line-no">6927</span><span id="line-6927">      }</span>
-<span class="source-line-no">6928</span><span id="line-6928">      return totalFreedDataSize &gt; 0;</span>
-<span class="source-line-no">6929</span><span id="line-6929">    } finally {</span>
-<span class="source-line-no">6930</span><span id="line-6930">      closeRegionOperation();</span>
-<span class="source-line-no">6931</span><span id="line-6931">    }</span>
-<span class="source-line-no">6932</span><span id="line-6932">  }</span>
-<span class="source-line-no">6933</span><span id="line-6933"></span>
-<span class="source-line-no">6934</span><span id="line-6934">  private void logRegionFiles() {</span>
-<span class="source-line-no">6935</span><span id="line-6935">    if (LOG.isTraceEnabled()) {</span>
-<span class="source-line-no">6936</span><span id="line-6936">      LOG.trace(getRegionInfo().getEncodedName() + " : Store files for region: ");</span>
-<span class="source-line-no">6937</span><span id="line-6937">      stores.values().stream().filter(s -&gt; s.getStorefiles() != null)</span>
-<span class="source-line-no">6938</span><span id="line-6938">        .flatMap(s -&gt; s.getStorefiles().stream())</span>
-<span class="source-line-no">6939</span><span id="line-6939">        .forEachOrdered(sf -&gt; LOG.trace(getRegionInfo().getEncodedName() + " : " + sf));</span>
-<span class="source-line-no">6940</span><span id="line-6940">    }</span>
-<span class="source-line-no">6941</span><span id="line-6941">  }</span>
-<span class="source-line-no">6942</span><span id="line-6942"></span>
-<span class="source-line-no">6943</span><span id="line-6943">  /**</span>
-<span class="source-line-no">6944</span><span id="line-6944">   * Checks whether the given regionName is either equal to our region, or that the regionName is</span>
-<span class="source-line-no">6945</span><span id="line-6945">   * the primary region to our corresponding range for the secondary replica.</span>
-<span class="source-line-no">6946</span><span id="line-6946">   */</span>
-<span class="source-line-no">6947</span><span id="line-6947">  private void checkTargetRegion(byte[] encodedRegionName, String exceptionMsg, Object payload)</span>
-<span class="source-line-no">6948</span><span id="line-6948">    throws WrongRegionException {</span>
-<span class="source-line-no">6949</span><span id="line-6949">    if (Bytes.equals(this.getRegionInfo().getEncodedNameAsBytes(), encodedRegionName)) {</span>
-<span class="source-line-no">6950</span><span id="line-6950">      return;</span>
-<span class="source-line-no">6951</span><span id="line-6951">    }</span>
-<span class="source-line-no">6952</span><span id="line-6952"></span>
-<span class="source-line-no">6953</span><span id="line-6953">    if (</span>
-<span class="source-line-no">6954</span><span id="line-6954">      !RegionReplicaUtil.isDefaultReplica(this.getRegionInfo())</span>
-<span class="source-line-no">6955</span><span id="line-6955">        &amp;&amp; Bytes.equals(encodedRegionName, this.fs.getRegionInfoForFS().getEncodedNameAsBytes())</span>
-<span class="source-line-no">6956</span><span id="line-6956">    ) {</span>
-<span class="source-line-no">6957</span><span id="line-6957">      return;</span>
-<span class="source-line-no">6958</span><span id="line-6958">    }</span>
-<span class="source-line-no">6959</span><span id="line-6959"></span>
-<span class="source-line-no">6960</span><span id="line-6960">    throw new WrongRegionException(</span>
-<span class="source-line-no">6961</span><span id="line-6961">      exceptionMsg + payload + " targetted for region " + Bytes.toStringBinary(encodedRegionName)</span>
-<span class="source-line-no">6962</span><span id="line-6962">        + " does not match this region: " + this.getRegionInfo());</span>
-<span class="source-line-no">6963</span><span id="line-6963">  }</span>
-<span class="source-line-no">6964</span><span id="line-6964"></span>
-<span class="source-line-no">6965</span><span id="line-6965">  /**</span>
-<span class="source-line-no">6966</span><span id="line-6966">   * Used by tests</span>
-<span class="source-line-no">6967</span><span id="line-6967">   * @param s    Store to add edit too.</span>
-<span class="source-line-no">6968</span><span id="line-6968">   * @param cell Cell to add.</span>
-<span class="source-line-no">6969</span><span id="line-6969">   */</span>
-<span class="source-line-no">6970</span><span id="line-6970">  protected void restoreEdit(HStore s, ExtendedCell cell, MemStoreSizing memstoreAccounting) {</span>
-<span class="source-line-no">6971</span><span id="line-6971">    s.add(cell, memstoreAccounting);</span>
-<span class="source-line-no">6972</span><span id="line-6972">  }</span>
-<span class="source-line-no">6973</span><span id="line-6973"></span>
-<span class="source-line-no">6974</span><span id="line-6974">  /**</span>
-<span class="source-line-no">6975</span><span id="line-6975">   * make sure have been through lease recovery before get file status, so the file length can be</span>
-<span class="source-line-no">6976</span><span id="line-6976">   * trusted.</span>
-<span class="source-line-no">6977</span><span id="line-6977">   * @param p File to check.</span>
-<span class="source-line-no">6978</span><span id="line-6978">   * @return True if file was zero-length (and if so, we'll delete it in here).</span>
-<span class="source-line-no">6979</span><span id="line-6979">   */</span>
-<span class="source-line-no">6980</span><span id="line-6980">  private static boolean isZeroLengthThenDelete(final FileSystem fs, final FileStatus stat,</span>
-<span class="source-line-no">6981</span><span id="line-6981">    final Path p) throws IOException {</span>
-<span class="source-line-no">6982</span><span id="line-6982">    if (stat.getLen() &gt; 0) {</span>
-<span class="source-line-no">6983</span><span id="line-6983">      return false;</span>
-<span class="source-line-no">6984</span><span id="line-6984">    }</span>
-<span class="source-line-no">6985</span><span id="line-6985">    LOG.warn("File " + p + " is zero-length, deleting.");</span>
-<span class="source-line-no">6986</span><span id="line-6986">    fs.delete(p, false);</span>
-<span class="source-line-no">6987</span><span id="line-6987">    return true;</span>
-<span class="source-line-no">6988</span><span id="line-6988">  }</span>
-<span class="source-line-no">6989</span><span id="line-6989"></span>
-<span class="source-line-no">6990</span><span id="line-6990">  protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)</span>
-<span class="source-line-no">6991</span><span id="line-6991">    throws IOException {</span>
-<span class="source-line-no">6992</span><span id="line-6992">    if (family.isMobEnabled()) {</span>
-<span class="source-line-no">6993</span><span id="line-6993">      if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {</span>
-<span class="source-line-no">6994</span><span id="line-6994">        throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS</span>
-<span class="source-line-no">6995</span><span id="line-6995">          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY</span>
-<span class="source-line-no">6996</span><span id="line-6996">          + " accordingly.");</span>
-<span class="source-line-no">6997</span><span id="line-6997">      }</span>
-<span class="source-line-no">6998</span><span id="line-6998">      return new HMobStore(this, family, this.conf, warmup);</span>
-<span class="source-line-no">6999</span><span id="line-6999">    }</span>
-<span class="source-line-no">7000</span><span id="line-7000">    return new HStore(this, family, this.conf, warmup);</span>
+<span class="source-line-no">6866</span><span id="line-6866">    long totalFreedDataSize = 0;</span>
+<span class="source-line-no">6867</span><span id="line-6867"></span>
+<span class="source-line-no">6868</span><span id="line-6868">    long smallestSeqIdInStores = Long.MAX_VALUE;</span>
+<span class="source-line-no">6869</span><span id="line-6869"></span>
+<span class="source-line-no">6870</span><span id="line-6870">    startRegionOperation(); // obtain region close lock</span>
+<span class="source-line-no">6871</span><span id="line-6871">    try {</span>
+<span class="source-line-no">6872</span><span id="line-6872">      Map&lt;HStore, Long&gt; map = new HashMap&lt;&gt;();</span>
+<span class="source-line-no">6873</span><span id="line-6873">      synchronized (writestate) {</span>
+<span class="source-line-no">6874</span><span id="line-6874">        for (HStore store : stores.values()) {</span>
+<span class="source-line-no">6875</span><span id="line-6875">          // TODO: some stores might see new data from flush, while others do not which</span>
+<span class="source-line-no">6876</span><span id="line-6876">          // MIGHT break atomic edits across column families.</span>
+<span class="source-line-no">6877</span><span id="line-6877">          long maxSeqIdBefore = store.getMaxSequenceId().orElse(0L);</span>
+<span class="source-line-no">6878</span><span id="line-6878"></span>
+<span class="source-line-no">6879</span><span id="line-6879">          // refresh the store files. This is similar to observing a region open wal marker.</span>
+<span class="source-line-no">6880</span><span id="line-6880">          store.refreshStoreFiles();</span>
+<span class="source-line-no">6881</span><span id="line-6881"></span>
+<span class="source-line-no">6882</span><span id="line-6882">          long storeSeqId = store.getMaxSequenceId().orElse(0L);</span>
+<span class="source-line-no">6883</span><span id="line-6883">          if (storeSeqId &lt; smallestSeqIdInStores) {</span>
+<span class="source-line-no">6884</span><span id="line-6884">            smallestSeqIdInStores = storeSeqId;</span>
+<span class="source-line-no">6885</span><span id="line-6885">          }</span>
+<span class="source-line-no">6886</span><span id="line-6886"></span>
+<span class="source-line-no">6887</span><span id="line-6887">          // see whether we can drop the memstore or the snapshot</span>
+<span class="source-line-no">6888</span><span id="line-6888">          if (storeSeqId &gt; maxSeqIdBefore) {</span>
+<span class="source-line-no">6889</span><span id="line-6889">            if (writestate.flushing) {</span>
+<span class="source-line-no">6890</span><span id="line-6890">              // only drop memstore snapshots if they are smaller than last flush for the store</span>
+<span class="source-line-no">6891</span><span id="line-6891">              if (this.prepareFlushResult.flushOpSeqId &lt;= storeSeqId) {</span>
+<span class="source-line-no">6892</span><span id="line-6892">                StoreFlushContext ctx = this.prepareFlushResult.storeFlushCtxs == null</span>
+<span class="source-line-no">6893</span><span id="line-6893">                  ? null</span>
+<span class="source-line-no">6894</span><span id="line-6894">                  : this.prepareFlushResult.storeFlushCtxs</span>
+<span class="source-line-no">6895</span><span id="line-6895">                    .get(store.getColumnFamilyDescriptor().getName());</span>
+<span class="source-line-no">6896</span><span id="line-6896">                if (ctx != null) {</span>
+<span class="source-line-no">6897</span><span id="line-6897">                  MemStoreSize mss = store.getFlushableSize();</span>
+<span class="source-line-no">6898</span><span id="line-6898">                  ctx.abort();</span>
+<span class="source-line-no">6899</span><span id="line-6899">                  this.decrMemStoreSize(mss);</span>
+<span class="source-line-no">6900</span><span id="line-6900">                  this.prepareFlushResult.storeFlushCtxs</span>
+<span class="source-line-no">6901</span><span id="line-6901">                    .remove(store.getColumnFamilyDescriptor().getName());</span>
+<span class="source-line-no">6902</span><span id="line-6902">                  totalFreedDataSize += mss.getDataSize();</span>
+<span class="source-line-no">6903</span><span id="line-6903">                }</span>
+<span class="source-line-no">6904</span><span id="line-6904">              }</span>
+<span class="source-line-no">6905</span><span id="line-6905">            }</span>
+<span class="source-line-no">6906</span><span id="line-6906"></span>
+<span class="source-line-no">6907</span><span id="line-6907">            map.put(store, storeSeqId);</span>
+<span class="source-line-no">6908</span><span id="line-6908">          }</span>
+<span class="source-line-no">6909</span><span id="line-6909">        }</span>
+<span class="source-line-no">6910</span><span id="line-6910"></span>
+<span class="source-line-no">6911</span><span id="line-6911">        // if all stores ended up dropping their snapshots, we can safely drop the</span>
+<span class="source-line-no">6912</span><span id="line-6912">        // prepareFlushResult</span>
+<span class="source-line-no">6913</span><span id="line-6913">        dropPrepareFlushIfPossible();</span>
+<span class="source-line-no">6914</span><span id="line-6914"></span>
+<span class="source-line-no">6915</span><span id="line-6915">        // advance the mvcc read point so that the new flushed files are visible.</span>
+<span class="source-line-no">6916</span><span id="line-6916">        // either greater than flush seq number or they were already picked up via flush.</span>
+<span class="source-line-no">6917</span><span id="line-6917">        for (HStore s : stores.values()) {</span>
+<span class="source-line-no">6918</span><span id="line-6918">          mvcc.advanceTo(s.getMaxMemStoreTS().orElse(0L));</span>
+<span class="source-line-no">6919</span><span id="line-6919">        }</span>
+<span class="source-line-no">6920</span><span id="line-6920"></span>
+<span class="source-line-no">6921</span><span id="line-6921">        // smallestSeqIdInStores is the seqId that we have a corresponding hfile for. We can safely</span>
+<span class="source-line-no">6922</span><span id="line-6922">        // skip all edits that are to be replayed in the future with that has a smaller seqId</span>
+<span class="source-line-no">6923</span><span id="line-6923">        // than this. We are updating lastReplayedOpenRegionSeqId so that we can skip all edits</span>
+<span class="source-line-no">6924</span><span id="line-6924">        // that we have picked the flush files for</span>
+<span class="source-line-no">6925</span><span id="line-6925">        if (this.lastReplayedOpenRegionSeqId &lt; smallestSeqIdInStores) {</span>
+<span class="source-line-no">6926</span><span id="line-6926">          this.lastReplayedOpenRegionSeqId = smallestSeqIdInStores;</span>
+<span class="source-line-no">6927</span><span id="line-6927">        }</span>
+<span class="source-line-no">6928</span><span id="line-6928">      }</span>
+<span class="source-line-no">6929</span><span id="line-6929">      if (!map.isEmpty()) {</span>
+<span class="source-line-no">6930</span><span id="line-6930">        for (Map.Entry&lt;HStore, Long&gt; entry : map.entrySet()) {</span>
+<span class="source-line-no">6931</span><span id="line-6931">          // Drop the memstore contents if they are now smaller than the latest seen flushed file</span>
+<span class="source-line-no">6932</span><span id="line-6932">          totalFreedDataSize +=</span>
+<span class="source-line-no">6933</span><span id="line-6933">            dropMemStoreContentsForSeqId(entry.getValue(), entry.getKey()).getDataSize();</span>
+<span class="source-line-no">6934</span><span id="line-6934">        }</span>
+<span class="source-line-no">6935</span><span id="line-6935">      }</span>
+<span class="source-line-no">6936</span><span id="line-6936">      // C. Finally notify anyone waiting on memstore to clear:</span>
+<span class="source-line-no">6937</span><span id="line-6937">      // e.g. checkResources().</span>
+<span class="source-line-no">6938</span><span id="line-6938">      synchronized (this) {</span>
+<span class="source-line-no">6939</span><span id="line-6939">        notifyAll(); // FindBugs NN_NAKED_NOTIFY</span>
+<span class="source-line-no">6940</span><span id="line-6940">      }</span>
+<span class="source-line-no">6941</span><span id="line-6941">      return totalFreedDataSize &gt; 0;</span>
+<span class="source-line-no">6942</span><span id="line-6942">    } finally {</span>
+<span class="source-line-no">6943</span><span id="line-6943">      closeRegionOperation();</span>
+<span class="source-line-no">6944</span><span id="line-6944">    }</span>
+<span class="source-line-no">6945</span><span id="line-6945">  }</span>
+<span class="source-line-no">6946</span><span id="line-6946"></span>
+<span class="source-line-no">6947</span><span id="line-6947">  private void logRegionFiles() {</span>
+<span class="source-line-no">6948</span><span id="line-6948">    if (LOG.isTraceEnabled()) {</span>
+<span class="source-line-no">6949</span><span id="line-6949">      LOG.trace(getRegionInfo().getEncodedName() + " : Store files for region: ");</span>
+<span class="source-line-no">6950</span><span id="line-6950">      stores.values().stream().filter(s -&gt; s.getStorefiles() != null)</span>
+<span class="source-line-no">6951</span><span id="line-6951">        .flatMap(s -&gt; s.getStorefiles().stream())</span>
+<span class="source-line-no">6952</span><span id="line-6952">        .forEachOrdered(sf -&gt; LOG.trace(getRegionInfo().getEncodedName() + " : " + sf));</span>
+<span class="source-line-no">6953</span><span id="line-6953">    }</span>
+<span class="source-line-no">6954</span><span id="line-6954">  }</span>
+<span class="source-line-no">6955</span><span id="line-6955"></span>
+<span class="source-line-no">6956</span><span id="line-6956">  /**</span>
+<span class="source-line-no">6957</span><span id="line-6957">   * Checks whether the given regionName is either equal to our region, or that the regionName is</span>
+<span class="source-line-no">6958</span><span id="line-6958">   * the primary region to our corresponding range for the secondary replica.</span>
+<span class="source-line-no">6959</span><span id="line-6959">   */</span>
+<span class="source-line-no">6960</span><span id="line-6960">  private void checkTargetRegion(byte[] encodedRegionName, String exceptionMsg, Object payload)</span>
+<span class="source-line-no">6961</span><span id="line-6961">    throws WrongRegionException {</span>
+<span class="source-line-no">6962</span><span id="line-6962">    if (Bytes.equals(this.getRegionInfo().getEncodedNameAsBytes(), encodedRegionName)) {</span>
+<span class="source-line-no">6963</span><span id="line-6963">      return;</span>
+<span class="source-line-no">6964</span><span id="line-6964">    }</span>
+<span class="source-line-no">6965</span><span id="line-6965"></span>
+<span class="source-line-no">6966</span><span id="line-6966">    if (</span>
+<span class="source-line-no">6967</span><span id="line-6967">      !RegionReplicaUtil.isDefaultReplica(this.getRegionInfo())</span>
+<span class="source-line-no">6968</span><span id="line-6968">        &amp;&amp; Bytes.equals(encodedRegionName, this.fs.getRegionInfoForFS().getEncodedNameAsBytes())</span>
+<span class="source-line-no">6969</span><span id="line-6969">    ) {</span>
+<span class="source-line-no">6970</span><span id="line-6970">      return;</span>
+<span class="source-line-no">6971</span><span id="line-6971">    }</span>
+<span class="source-line-no">6972</span><span id="line-6972"></span>
+<span class="source-line-no">6973</span><span id="line-6973">    throw new WrongRegionException(</span>
+<span class="source-line-no">6974</span><span id="line-6974">      exceptionMsg + payload + " targetted for region " + Bytes.toStringBinary(encodedRegionName)</span>
+<span class="source-line-no">6975</span><span id="line-6975">        + " does not match this region: " + this.getRegionInfo());</span>
+<span class="source-line-no">6976</span><span id="line-6976">  }</span>
+<span class="source-line-no">6977</span><span id="line-6977"></span>
+<span class="source-line-no">6978</span><span id="line-6978">  /**</span>
+<span class="source-line-no">6979</span><span id="line-6979">   * Used by tests</span>
+<span class="source-line-no">6980</span><span id="line-6980">   * @param s    Store to add edit too.</span>
+<span class="source-line-no">6981</span><span id="line-6981">   * @param cell Cell to add.</span>
+<span class="source-line-no">6982</span><span id="line-6982">   */</span>
+<span class="source-line-no">6983</span><span id="line-6983">  protected void restoreEdit(HStore s, ExtendedCell cell, MemStoreSizing memstoreAccounting) {</span>
+<span class="source-line-no">6984</span><span id="line-6984">    s.add(cell, memstoreAccounting);</span>
+<span class="source-line-no">6985</span><span id="line-6985">  }</span>
+<span class="source-line-no">6986</span><span id="line-6986"></span>
+<span class="source-line-no">6987</span><span id="line-6987">  /**</span>
+<span class="source-line-no">6988</span><span id="line-6988">   * make sure have been through lease recovery before get file status, so the file length can be</span>
+<span class="source-line-no">6989</span><span id="line-6989">   * trusted.</span>
+<span class="source-line-no">6990</span><span id="line-6990">   * @param p File to check.</span>
+<span class="source-line-no">6991</span><span id="line-6991">   * @return True if file was zero-length (and if so, we'll delete it in here).</span>
+<span class="source-line-no">6992</span><span id="line-6992">   */</span>
+<span class="source-line-no">6993</span><span id="line-6993">  private static boolean isZeroLengthThenDelete(final FileSystem fs, final FileStatus stat,</span>
+<span class="source-line-no">6994</span><span id="line-6994">    final Path p) throws IOException {</span>
+<span class="source-line-no">6995</span><span id="line-6995">    if (stat.getLen() &gt; 0) {</span>
+<span class="source-line-no">6996</span><span id="line-6996">      return false;</span>
+<span class="source-line-no">6997</span><span id="line-6997">    }</span>
+<span class="source-line-no">6998</span><span id="line-6998">    LOG.warn("File " + p + " is zero-length, deleting.");</span>
+<span class="source-line-no">6999</span><span id="line-6999">    fs.delete(p, false);</span>
+<span class="source-line-no">7000</span><span id="line-7000">    return true;</span>
 <span class="source-line-no">7001</span><span id="line-7001">  }</span>
 <span class="source-line-no">7002</span><span id="line-7002"></span>
-<span class="source-line-no">7003</span><span id="line-7003">  @Override</span>
-<span class="source-line-no">7004</span><span id="line-7004">  public HStore getStore(byte[] column) {</span>
-<span class="source-line-no">7005</span><span id="line-7005">    return this.stores.get(column);</span>
-<span class="source-line-no">7006</span><span id="line-7006">  }</span>
-<span class="source-line-no">7007</span><span id="line-7007"></span>
-<span class="source-line-no">7008</span><span id="line-7008">  /**</span>
-<span class="source-line-no">7009</span><span id="line-7009">   * Return HStore instance. Does not do any copy: as the number of store is limited, we iterate on</span>
-<span class="source-line-no">7010</span><span id="line-7010">   * the list.</span>
-<span class="source-line-no">7011</span><span id="line-7011">   */</span>
-<span class="source-line-no">7012</span><span id="line-7012">  private HStore getStore(Cell cell) {</span>
-<span class="source-line-no">7013</span><span id="line-7013">    return stores.entrySet().stream().filter(e -&gt; CellUtil.matchingFamily(cell, e.getKey()))</span>
-<span class="source-line-no">7014</span><span id="line-7014">      .map(e -&gt; e.getValue()).findFirst().orElse(null);</span>
-<span class="source-line-no">7015</span><span id="line-7015">  }</span>
-<span class="source-line-no">7016</span><span id="line-7016"></span>
-<span class="source-line-no">7017</span><span id="line-7017">  @Override</span>
-<span class="source-line-no">7018</span><span id="line-7018">  public List&lt;HStore&gt; getStores() {</span>
-<span class="source-line-no">7019</span><span id="line-7019">    return new ArrayList&lt;&gt;(stores.values());</span>
-<span class="source-line-no">7020</span><span id="line-7020">  }</span>
-<span class="source-line-no">7021</span><span id="line-7021"></span>
-<span class="source-line-no">7022</span><span id="line-7022">  @Override</span>
-<span class="source-line-no">7023</span><span id="line-7023">  public List&lt;String&gt; getStoreFileList(byte[][] columns) throws IllegalArgumentException {</span>
-<span class="source-line-no">7024</span><span id="line-7024">    List&lt;String&gt; storeFileNames = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">7025</span><span id="line-7025">    synchronized (closeLock) {</span>
-<span class="source-line-no">7026</span><span id="line-7026">      for (byte[] column : columns) {</span>
-<span class="source-line-no">7027</span><span id="line-7027">        HStore store = this.stores.get(column);</span>
-<span class="source-line-no">7028</span><span id="line-7028">        if (store == null) {</span>
-<span class="source-line-no">7029</span><span id="line-7029">          throw new IllegalArgumentException(</span>
-<span class="source-line-no">7030</span><span id="line-7030">            "No column family : " + new String(column, StandardCharsets.UTF_8) + " available");</span>
-<span class="source-line-no">7031</span><span id="line-7031">        }</span>
-<span class="source-line-no">7032</span><span id="line-7032">        Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();</span>
-<span class="source-line-no">7033</span><span id="line-7033">        if (storeFiles == null) {</span>
-<span class="source-line-no">7034</span><span id="line-7034">          continue;</span>
-<span class="source-line-no">7035</span><span id="line-7035">        }</span>
-<span class="source-line-no">7036</span><span id="line-7036">        for (HStoreFile storeFile : storeFiles) {</span>
-<span class="source-line-no">7037</span><span id="line-7037">          storeFileNames.add(storeFile.getPath().toString());</span>
-<span class="source-line-no">7038</span><span id="line-7038">        }</span>
-<span class="source-line-no">7039</span><span id="line-7039"></span>
-<span class="source-line-no">7040</span><span id="line-7040">        logRegionFiles();</span>
-<span class="source-line-no">7041</span><span id="line-7041">      }</span>
-<span class="source-line-no">7042</span><span id="line-7042">    }</span>
-<span class="source-line-no">7043</span><span id="line-7043">    return storeFileNames;</span>
-<span class="source-line-no">7044</span><span id="line-7044">  }</span>
-<span class="source-line-no">7045</span><span id="line-7045"></span>
-<span class="source-line-no">7046</span><span id="line-7046">  //////////////////////////////////////////////////////////////////////////////</span>
-<span class="source-line-no">7047</span><span id="line-7047">  // Support code</span>
-<span class="source-line-no">7048</span><span id="line-7048">  //////////////////////////////////////////////////////////////////////////////</span>
-<span class="source-line-no">7049</span><span id="line-7049"></span>
-<span class="source-line-no">7050</span><span id="line-7050">  /** Make sure this is a valid row for the HRegion */</span>
-<span class="source-line-no">7051</span><span id="line-7051">  void checkRow(byte[] row, String op) throws IOException {</span>
-<span class="source-line-no">7052</span><span id="line-7052">    if (!rowIsInRange(getRegionInfo(), row)) {</span>
-<span class="source-line-no">7053</span><span id="line-7053">      throw new WrongRegionException("Requested row out of range for " + op + " on HRegion " + this</span>
-<span class="source-line-no">7054</span><span id="line-7054">        + ", startKey='" + Bytes.toStringBinary(getRegionInfo().getStartKey()) + "', getEndKey()='"</span>
-<span class="source-line-no">7055</span><span id="line-7055">        + Bytes.toStringBinary(getRegionInfo().getEndKey()) + "', row='" + Bytes.toStringBinary(row)</span>
-<span class="source-line-no">7056</span><span id="line-7056">        + "'");</span>
-<span class="source-line-no">7057</span><span id="line-7057">    }</span>
-<span class="source-line-no">7058</span><span id="line-7058">  }</span>
-<span class="source-line-no">7059</span><span id="line-7059"></span>
-<span class="source-line-no">7060</span><span id="line-7060">  /**</span>
-<span class="source-line-no">7061</span><span id="line-7061">   * Get an exclusive ( write lock ) lock on a given row.</span>
-<span class="source-line-no">7062</span><span id="line-7062">   * @param row Which row to lock.</span>
-<span class="source-line-no">7063</span><span id="line-7063">   * @return A locked RowLock. The lock is exclusive and already aqquired.</span>
-<span class="source-line-no">7064</span><span id="line-7064">   */</span>
-<span class="source-line-no">7065</span><span id="line-7065">  public RowLock getRowLock(byte[] row) throws IOException {</span>
-<span class="source-line-no">7066</span><span id="line-7066">    return getRowLock(row, false);</span>
-<span class="source-line-no">7067</span><span id="line-7067">  }</span>
-<span class="source-line-no">7068</span><span id="line-7068"></span>
-<span class="source-line-no">7069</span><span id="line-7069">  @Override</span>
-<span class="source-line-no">7070</span><span id="line-7070">  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {</span>
-<span class="source-line-no">7071</span><span id="line-7071">    checkRow(row, "row lock");</span>
-<span class="source-line-no">7072</span><span id="line-7072">    return getRowLock(row, readLock, null);</span>
-<span class="source-line-no">7073</span><span id="line-7073">  }</span>
-<span class="source-line-no">7074</span><span id="line-7074"></span>
-<span class="source-line-no">7075</span><span id="line-7075">  Span createRegionSpan(String name) {</span>
-<span class="source-line-no">7076</span><span id="line-7076">    return TraceUtil.createSpan(name).setAttribute(REGION_NAMES_KEY,</span>
-<span class="source-line-no">7077</span><span id="line-7077">      Collections.singletonList(getRegionInfo().getRegionNameAsString()));</span>
-<span class="source-line-no">7078</span><span id="line-7078">  }</span>
-<span class="source-line-no">7079</span><span id="line-7079"></span>
-<span class="source-line-no">7080</span><span id="line-7080">  // will be override in tests</span>
-<span class="source-line-no">7081</span><span id="line-7081">  protected RowLock getRowLockInternal(byte[] row, boolean readLock, RowLock prevRowLock)</span>
-<span class="source-line-no">7082</span><span id="line-7082">    throws IOException {</span>
-<span class="source-line-no">7083</span><span id="line-7083">    // create an object to use a a key in the row lock map</span>
-<span class="source-line-no">7084</span><span id="line-7084">    HashedBytes rowKey = new HashedBytes(row);</span>
-<span class="source-line-no">7085</span><span id="line-7085"></span>
-<span class="source-line-no">7086</span><span id="line-7086">    RowLockContext rowLockContext = null;</span>
-<span class="source-line-no">7087</span><span id="line-7087">    RowLockImpl result = null;</span>
-<span class="source-line-no">7088</span><span id="line-7088"></span>
-<span class="source-line-no">7089</span><span id="line-7089">    boolean success = false;</span>
-<span class="source-line-no">7090</span><span id="line-7090">    try {</span>
-<span class="source-line-no">7091</span><span id="line-7091">      // Keep trying until we have a lock or error out.</span>
-<span class="source-line-no">7092</span><span id="line-7092">      // TODO: do we need to add a time component here?</span>
-<span class="source-line-no">7093</span><span id="line-7093">      while (result == null) {</span>
-<span class="source-line-no">7094</span><span id="line-7094">        rowLockContext = computeIfAbsent(lockedRows, rowKey, () -&gt; new RowLockContext(rowKey));</span>
-<span class="source-line-no">7095</span><span id="line-7095">        // Now try an get the lock.</span>
-<span class="source-line-no">7096</span><span id="line-7096">        // This can fail as</span>
-<span class="source-line-no">7097</span><span id="line-7097">        if (readLock) {</span>
-<span class="source-line-no">7098</span><span id="line-7098">          // For read lock, if the caller has locked the same row previously, it will not try</span>
-<span class="source-line-no">7099</span><span id="line-7099">          // to acquire the same read lock. It simply returns the previous row lock.</span>
-<span class="source-line-no">7100</span><span id="line-7100">          RowLockImpl prevRowLockImpl = (RowLockImpl) prevRowLock;</span>
-<span class="source-line-no">7101</span><span id="line-7101">          if (</span>
-<span class="source-line-no">7102</span><span id="line-7102">            (prevRowLockImpl != null)</span>
-<span class="source-line-no">7103</span><span id="line-7103">              &amp;&amp; (prevRowLockImpl.getLock() == rowLockContext.readWriteLock.readLock())</span>
-<span class="source-line-no">7104</span><span id="line-7104">          ) {</span>
-<span class="source-line-no">7105</span><span id="line-7105">            success = true;</span>
-<span class="source-line-no">7106</span><span id="line-7106">            return prevRowLock;</span>
-<span class="source-line-no">7107</span><span id="line-7107">          }</span>
-<span class="source-line-no">7108</span><span id="line-7108">          result = rowLockContext.newReadLock();</span>
-<span class="source-line-no">7109</span><span id="line-7109">        } else {</span>
-<span class="source-line-no">7110</span><span id="line-7110">          result = rowLockContext.newWriteLock();</span>
-<span class="source-line-no">7111</span><span id="line-7111">        }</span>
-<span class="source-line-no">7112</span><span id="line-7112">      }</span>
-<span class="source-line-no">7113</span><span id="line-7113"></span>
-<span class="source-line-no">7114</span><span id="line-7114">      int timeout = rowLockWaitDuration;</span>
-<span class="source-line-no">7115</span><span id="line-7115">      boolean reachDeadlineFirst = false;</span>
-<span class="source-line-no">7116</span><span id="line-7116">      Optional&lt;RpcCall&gt; call = RpcServer.getCurrentCall();</span>
-<span class="source-line-no">7117</span><span id="line-7117">      if (call.isPresent()) {</span>
-<span class="source-line-no">7118</span><span id="line-7118">        long deadline = call.get().getDeadline();</span>
-<span class="source-line-no">7119</span><span id="line-7119">        if (deadline &lt; Long.MAX_VALUE) {</span>
-<span class="source-line-no">7120</span><span id="line-7120">          int timeToDeadline = (int) (deadline - EnvironmentEdgeManager.currentTime());</span>
-<span class="source-line-no">7121</span><span id="line-7121">          if (timeToDeadline &lt;= this.rowLockWaitDuration) {</span>
-<span class="source-line-no">7122</span><span id="line-7122">            reachDeadlineFirst = true;</span>
-<span class="source-line-no">7123</span><span id="line-7123">            timeout = timeToDeadline;</span>
-<span class="source-line-no">7124</span><span id="line-7124">          }</span>
-<span class="source-line-no">7125</span><span id="line-7125">        }</span>
-<span class="source-line-no">7126</span><span id="line-7126">      }</span>
-<span class="source-line-no">7127</span><span id="line-7127"></span>
-<span class="source-line-no">7128</span><span id="line-7128">      if (timeout &lt;= 0 || !result.getLock().tryLock(timeout, TimeUnit.MILLISECONDS)) {</span>
-<span class="source-line-no">7129</span><span id="line-7129">        String message = "Timed out waiting for lock for row: " + rowKey + " in region "</span>
-<span class="source-line-no">7130</span><span id="line-7130">          + getRegionInfo().getEncodedName();</span>
-<span class="source-line-no">7131</span><span id="line-7131">        if (reachDeadlineFirst) {</span>
-<span class="source-line-no">7132</span><span id="line-7132">          throw new TimeoutIOException(message);</span>
-<span class="source-line-no">7133</span><span id="line-7133">        } else {</span>
-<span class="source-line-no">7134</span><span id="line-7134">          // If timeToDeadline is larger than rowLockWaitDuration, we can not drop the request.</span>
-<span class="source-line-no">7135</span><span id="line-7135">          throw new IOException(message);</span>
-<span class="source-line-no">7136</span><span id="line-7136">        }</span>
-<span class="source-line-no">7137</span><span id="line-7137">      }</span>
-<span class="source-line-no">7138</span><span id="line-7138">      rowLockContext.setThreadName(Thread.currentThread().getName());</span>
-<span class="source-line-no">7139</span><span id="line-7139">      success = true;</span>
-<span class="source-line-no">7140</span><span id="line-7140">      return result;</span>
-<span class="source-line-no">7141</span><span id="line-7141">    } catch (InterruptedException ie) {</span>
-<span class="source-line-no">7142</span><span id="line-7142">      if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">7143</span><span id="line-7143">        LOG.debug("Thread interrupted waiting for lock on row: {}, in region {}", rowKey,</span>
-<span class="source-line-no">7144</span><span id="line-7144">          getRegionInfo().getRegionNameAsString());</span>
-<span class="source-line-no">7145</span><span id="line-7145">      }</span>
-<span class="source-line-no">7146</span><span id="line-7146">      throw throwOnInterrupt(ie);</span>
-<span class="source-line-no">7147</span><span id="line-7147">    } catch (Error error) {</span>
-<span class="source-line-no">7148</span><span id="line-7148">      // The maximum lock count for read lock is 64K (hardcoded), when this maximum count</span>
-<span class="source-line-no">7149</span><span id="line-7149">      // is reached, it will throw out an Error. This Error needs to be caught so it can</span>
-<span class="source-line-no">7150</span><span id="line-7150">      // go ahead to process the minibatch with lock acquired.</span>
-<span class="source-line-no">7151</span><span id="line-7151">      LOG.warn("Error to get row lock for {}, in region {}, cause: {}", Bytes.toStringBinary(row),</span>
-<span class="source-line-no">7152</span><span id="line-7152">        getRegionInfo().getRegionNameAsString(), error);</span>
-<span class="source-line-no">7153</span><span id="line-7153">      IOException ioe = new IOException(error);</span>
-<span class="source-line-no">7154</span><span id="line-7154">      throw ioe;</span>
-<span class="source-line-no">7155</span><span id="line-7155">    } finally {</span>
-<span class="source-line-no">7156</span><span id="line-7156">      // Clean up the counts just in case this was the thing keeping the context alive.</span>
-<span class="source-line-no">7157</span><span id="line-7157">      if (!success &amp;&amp; rowLockContext != null) {</span>
-<span class="source-line-no">7158</span><span id="line-7158">        rowLockContext.cleanUp();</span>
-<span class="source-line-no">7159</span><span id="line-7159">      }</span>
-<span class="source-line-no">7160</span><span id="line-7160">    }</span>
-<span class="source-line-no">7161</span><span id="line-7161">  }</span>
-<span class="source-line-no">7162</span><span id="line-7162"></span>
-<span class="source-line-no">7163</span><span id="line-7163">  private RowLock getRowLock(byte[] row, boolean readLock, final RowLock prevRowLock)</span>
-<span class="source-line-no">7164</span><span id="line-7164">    throws IOException {</span>
-<span class="source-line-no">7165</span><span id="line-7165">    return TraceUtil.trace(() -&gt; getRowLockInternal(row, readLock, prevRowLock),</span>
-<span class="source-line-no">7166</span><span id="line-7166">      () -&gt; createRegionSpan("Region.getRowLock").setAttribute(ROW_LOCK_READ_LOCK_KEY, readLock));</span>
-<span class="source-line-no">7167</span><span id="line-7167">  }</span>
-<span class="source-line-no">7168</span><span id="line-7168"></span>
-<span class="source-line-no">7169</span><span id="line-7169">  private void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {</span>
-<span class="source-line-no">7170</span><span id="line-7170">    if (rowLocks != null) {</span>
-<span class="source-line-no">7171</span><span id="line-7171">      for (RowLock rowLock : rowLocks) {</span>
-<span class="source-line-no">7172</span><span id="line-7172">        rowLock.release();</span>
-<span class="source-line-no">7173</span><span id="line-7173">      }</span>
-<span class="source-line-no">7174</span><span id="line-7174">      rowLocks.clear();</span>
-<span class="source-line-no">7175</span><span id="line-7175">    }</span>
-<span class="source-line-no">7176</span><span id="line-7176">  }</span>
-<span class="source-line-no">7177</span><span id="line-7177"></span>
-<span class="source-line-no">7178</span><span id="line-7178">  public int getReadLockCount() {</span>
-<span class="source-line-no">7179</span><span id="line-7179">    return lock.getReadLockCount();</span>
+<span class="source-line-no">7003</span><span id="line-7003">  protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)</span>
+<span class="source-line-no">7004</span><span id="line-7004">    throws IOException {</span>
+<span class="source-line-no">7005</span><span id="line-7005">    if (family.isMobEnabled()) {</span>
+<span class="source-line-no">7006</span><span id="line-7006">      if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {</span>
+<span class="source-line-no">7007</span><span id="line-7007">        throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS</span>
+<span class="source-line-no">7008</span><span id="line-7008">          + " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY</span>
+<span class="source-line-no">7009</span><span id="line-7009">          + " accordingly.");</span>
+<span class="source-line-no">7010</span><span id="line-7010">      }</span>
+<span class="source-line-no">7011</span><span id="line-7011">      return new HMobStore(this, family, this.conf, warmup);</span>
+<span class="source-line-no">7012</span><span id="line-7012">    }</span>
+<span class="source-line-no">7013</span><span id="line-7013">    return new HStore(this, family, this.conf, warmup);</span>
+<span class="source-line-no">7014</span><span id="line-7014">  }</span>
+<span class="source-line-no">7015</span><span id="line-7015"></span>
+<span class="source-line-no">7016</span><span id="line-7016">  @Override</span>
+<span class="source-line-no">7017</span><span id="line-7017">  public HStore getStore(byte[] column) {</span>
+<span class="source-line-no">7018</span><span id="line-7018">    return this.stores.get(column);</span>
+<span class="source-line-no">7019</span><span id="line-7019">  }</span>
+<span class="source-line-no">7020</span><span id="line-7020"></span>
+<span class="source-line-no">7021</span><span id="line-7021">  /**</span>
+<span class="source-line-no">7022</span><span id="line-7022">   * Return HStore instance. Does not do any copy: as the number of store is limited, we iterate on</span>
+<span class="source-line-no">7023</span><span id="line-7023">   * the list.</span>
+<span class="source-line-no">7024</span><span id="line-7024">   */</span>
+<span class="source-line-no">7025</span><span id="line-7025">  private HStore getStore(Cell cell) {</span>
+<span class="source-line-no">7026</span><span id="line-7026">    return stores.entrySet().stream().filter(e -&gt; CellUtil.matchingFamily(cell, e.getKey()))</span>
+<span class="source-line-no">7027</span><span id="line-7027">      .map(e -&gt; e.getValue()).findFirst().orElse(null);</span>
+<span class="source-line-no">7028</span><span id="line-7028">  }</span>
+<span class="source-line-no">7029</span><span id="line-7029"></span>
+<span class="source-line-no">7030</span><span id="line-7030">  @Override</span>
+<span class="source-line-no">7031</span><span id="line-7031">  public List&lt;HStore&gt; getStores() {</span>
+<span class="source-line-no">7032</span><span id="line-7032">    return new ArrayList&lt;&gt;(stores.values());</span>
+<span class="source-line-no">7033</span><span id="line-7033">  }</span>
+<span class="source-line-no">7034</span><span id="line-7034"></span>
+<span class="source-line-no">7035</span><span id="line-7035">  @Override</span>
+<span class="source-line-no">7036</span><span id="line-7036">  public List&lt;String&gt; getStoreFileList(byte[][] columns) throws IllegalArgumentException {</span>
+<span class="source-line-no">7037</span><span id="line-7037">    List&lt;String&gt; storeFileNames = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">7038</span><span id="line-7038">    synchronized (closeLock) {</span>
+<span class="source-line-no">7039</span><span id="line-7039">      for (byte[] column : columns) {</span>
+<span class="source-line-no">7040</span><span id="line-7040">        HStore store = this.stores.get(column);</span>
+<span class="source-line-no">7041</span><span id="line-7041">        if (store == null) {</span>
+<span class="source-line-no">7042</span><span id="line-7042">          throw new IllegalArgumentException(</span>
+<span class="source-line-no">7043</span><span id="line-7043">            "No column family : " + new String(column, StandardCharsets.UTF_8) + " available");</span>
+<span class="source-line-no">7044</span><span id="line-7044">        }</span>
+<span class="source-line-no">7045</span><span id="line-7045">        Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();</span>
+<span class="source-line-no">7046</span><span id="line-7046">        if (storeFiles == null) {</span>
+<span class="source-line-no">7047</span><span id="line-7047">          continue;</span>
+<span class="source-line-no">7048</span><span id="line-7048">        }</span>
+<span class="source-line-no">7049</span><span id="line-7049">        for (HStoreFile storeFile : storeFiles) {</span>
+<span class="source-line-no">7050</span><span id="line-7050">          storeFileNames.add(storeFile.getPath().toString());</span>
+<span class="source-line-no">7051</span><span id="line-7051">        }</span>
+<span class="source-line-no">7052</span><span id="line-7052"></span>
+<span class="source-line-no">7053</span><span id="line-7053">        logRegionFiles();</span>
+<span class="source-line-no">7054</span><span id="line-7054">      }</span>
+<span class="source-line-no">7055</span><span id="line-7055">    }</span>
+<span class="source-line-no">7056</span><span id="line-7056">    return storeFileNames;</span>
+<span class="source-line-no">7057</span><span id="line-7057">  }</span>
+<span class="source-line-no">7058</span><span id="line-7058"></span>
+<span class="source-line-no">7059</span><span id="line-7059">  //////////////////////////////////////////////////////////////////////////////</span>
+<span class="source-line-no">7060</span><span id="line-7060">  // Support code</span>
+<span class="source-line-no">7061</span><span id="line-7061">  //////////////////////////////////////////////////////////////////////////////</span>
+<span class="source-line-no">7062</span><span id="line-7062"></span>
+<span class="source-line-no">7063</span><span id="line-7063">  /** Make sure this is a valid row for the HRegion */</span>
+<span class="source-line-no">7064</span><span id="line-7064">  void checkRow(byte[] row, String op) throws IOException {</span>
+<span class="source-line-no">7065</span><span id="line-7065">    if (!rowIsInRange(getRegionInfo(), row)) {</span>
+<span class="source-line-no">7066</span><span id="line-7066">      throw new WrongRegionException("Requested row out of range for " + op + " on HRegion " + this</span>
+<span class="source-line-no">7067</span><span id="line-7067">        + ", startKey='" + Bytes.toStringBinary(getRegionInfo().getStartKey()) + "', getEndKey()='"</span>
+<span class="source-line-no">7068</span><span id="line-7068">        + Bytes.toStringBinary(getRegionInfo().getEndKey()) + "', row='" + Bytes.toStringBinary(row)</span>
+<span class="source-line-no">7069</span><span id="line-7069">        + "'");</span>
+<span class="source-line-no">7070</span><span id="line-7070">    }</span>
+<span class="source-line-no">7071</span><span id="line-7071">  }</span>
+<span class="source-line-no">7072</span><span id="line-7072"></span>
+<span class="source-line-no">7073</span><span id="line-7073">  /**</span>
+<span class="source-line-no">7074</span><span id="line-7074">   * Get an exclusive ( write lock ) lock on a given row.</span>
+<span class="source-line-no">7075</span><span id="line-7075">   * @param row Which row to lock.</span>
+<span class="source-line-no">7076</span><span id="line-7076">   * @return A locked RowLock. The lock is exclusive and already aqquired.</span>
+<span class="source-line-no">7077</span><span id="line-7077">   */</span>
+<span class="source-line-no">7078</span><span id="line-7078">  public RowLock getRowLock(byte[] row) throws IOException {</span>
+<span class="source-line-no">7079</span><span id="line-7079">    return getRowLock(row, false);</span>
+<span class="source-line-no">7080</span><span id="line-7080">  }</span>
+<span class="source-line-no">7081</span><span id="line-7081"></span>
+<span class="source-line-no">7082</span><span id="line-7082">  @Override</span>
+<span class="source-line-no">7083</span><span id="line-7083">  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {</span>
+<span class="source-line-no">7084</span><span id="line-7084">    checkRow(row, "row lock");</span>
+<span class="source-line-no">7085</span><span id="line-7085">    return getRowLock(row, readLock, null);</span>
+<span class="source-line-no">7086</span><span id="line-7086">  }</span>
+<span class="source-line-no">7087</span><span id="line-7087"></span>
+<span class="source-line-no">7088</span><span id="line-7088">  Span createRegionSpan(String name) {</span>
+<span class="source-line-no">7089</span><span id="line-7089">    return TraceUtil.createSpan(name).setAttribute(REGION_NAMES_KEY,</span>
+<span class="source-line-no">7090</span><span id="line-7090">      Collections.singletonList(getRegionInfo().getRegionNameAsString()));</span>
+<span class="source-line-no">7091</span><span id="line-7091">  }</span>
+<span class="source-line-no">7092</span><span id="line-7092"></span>
+<span class="source-line-no">7093</span><span id="line-7093">  // will be override in tests</span>
+<span class="source-line-no">7094</span><span id="line-7094">  protected RowLock getRowLockInternal(byte[] row, boolean readLock, RowLock prevRowLock)</span>
+<span class="source-line-no">7095</span><span id="line-7095">    throws IOException {</span>
+<span class="source-line-no">7096</span><span id="line-7096">    // create an object to use a a key in the row lock map</span>
+<span class="source-line-no">7097</span><span id="line-7097">    HashedBytes rowKey = new HashedBytes(row);</span>
+<span class="source-line-no">7098</span><span id="line-7098"></span>
+<span class="source-line-no">7099</span><span id="line-7099">    RowLockContext rowLockContext = null;</span>
+<span class="source-line-no">7100</span><span id="line-7100">    RowLockImpl result = null;</span>
+<span class="source-line-no">7101</span><span id="line-7101"></span>
+<span class="source-line-no">7102</span><span id="line-7102">    boolean success = false;</span>
+<span class="source-line-no">7103</span><span id="line-7103">    try {</span>
+<span class="source-line-no">7104</span><span id="line-7104">      // Keep trying until we have a lock or error out.</span>
+<span class="source-line-no">7105</span><span id="line-7105">      // TODO: do we need to add a time component here?</span>
+<span class="source-line-no">7106</span><span id="line-7106">      while (result == null) {</span>
+<span class="source-line-no">7107</span><span id="line-7107">        rowLockContext = computeIfAbsent(lockedRows, rowKey, () -&gt; new RowLockContext(rowKey));</span>
+<span class="source-line-no">7108</span><span id="line-7108">        // Now try an get the lock.</span>
+<span class="source-line-no">7109</span><span id="line-7109">        // This can fail as</span>
+<span class="source-line-no">7110</span><span id="line-7110">        if (readLock) {</span>
+<span class="source-line-no">7111</span><span id="line-7111">          // For read lock, if the caller has locked the same row previously, it will not try</span>
+<span class="source-line-no">7112</span><span id="line-7112">          // to acquire the same read lock. It simply returns the previous row lock.</span>
+<span class="source-line-no">7113</span><span id="line-7113">          RowLockImpl prevRowLockImpl = (RowLockImpl) prevRowLock;</span>
+<span class="source-line-no">7114</span><span id="line-7114">          if (</span>
+<span class="source-line-no">7115</span><span id="line-7115">            (prevRowLockImpl != null)</span>
+<span class="source-line-no">7116</span><span id="line-7116">              &amp;&amp; (prevRowLockImpl.getLock() == rowLockContext.readWriteLock.readLock())</span>
+<span class="source-line-no">7117</span><span id="line-7117">          ) {</span>
+<span class="source-line-no">7118</span><span id="line-7118">            success = true;</span>
+<span class="source-line-no">7119</span><span id="line-7119">            return prevRowLock;</span>
+<span class="source-line-no">7120</span><span id="line-7120">          }</span>
+<span class="source-line-no">7121</span><span id="line-7121">          result = rowLockContext.newReadLock();</span>
+<span class="source-line-no">7122</span><span id="line-7122">        } else {</span>
+<span class="source-line-no">7123</span><span id="line-7123">          result = rowLockContext.newWriteLock();</span>
+<span class="source-line-no">7124</span><span id="line-7124">        }</span>
+<span class="source-line-no">7125</span><span id="line-7125">      }</span>
+<span class="source-line-no">7126</span><span id="line-7126"></span>
+<span class="source-line-no">7127</span><span id="line-7127">      int timeout = rowLockWaitDuration;</span>
+<span class="source-line-no">7128</span><span id="line-7128">      boolean reachDeadlineFirst = false;</span>
+<span class="source-line-no">7129</span><span id="line-7129">      Optional&lt;RpcCall&gt; call = RpcServer.getCurrentCall();</span>
+<span class="source-line-no">7130</span><span id="line-7130">      if (call.isPresent()) {</span>
+<span class="source-line-no">7131</span><span id="line-7131">        long deadline = call.get().getDeadline();</span>
+<span class="source-line-no">7132</span><span id="line-7132">        if (deadline &lt; Long.MAX_VALUE) {</span>
+<span class="source-line-no">7133</span><span id="line-7133">          int timeToDeadline = (int) (deadline - EnvironmentEdgeManager.currentTime());</span>
+<span class="source-line-no">7134</span><span id="line-7134">          if (timeToDeadline &lt;= this.rowLockWaitDuration) {</span>
+<span class="source-line-no">7135</span><span id="line-7135">            reachDeadlineFirst = true;</span>
+<span class="source-line-no">7136</span><span id="line-7136">            timeout = timeToDeadline;</span>
+<span class="source-line-no">7137</span><span id="line-7137">          }</span>
+<span class="source-line-no">7138</span><span id="line-7138">        }</span>
+<span class="source-line-no">7139</span><span id="line-7139">      }</span>
+<span class="source-line-no">7140</span><span id="line-7140"></span>
+<span class="source-line-no">7141</span><span id="line-7141">      if (timeout &lt;= 0 || !result.getLock().tryLock(timeout, TimeUnit.MILLISECONDS)) {</span>
+<span class="source-line-no">7142</span><span id="line-7142">        String message = "Timed out waiting for lock for row: " + rowKey + " in region "</span>
+<span class="source-line-no">7143</span><span id="line-7143">          + getRegionInfo().getEncodedName();</span>
+<span class="source-line-no">7144</span><span id="line-7144">        if (reachDeadlineFirst) {</span>
+<span class="source-line-no">7145</span><span id="line-7145">          throw new TimeoutIOException(message);</span>
+<span class="source-line-no">7146</span><span id="line-7146">        } else {</span>
+<span class="source-line-no">7147</span><span id="line-7147">          // If timeToDeadline is larger than rowLockWaitDuration, we can not drop the request.</span>
+<span class="source-line-no">7148</span><span id="line-7148">          throw new IOException(message);</span>
+<span class="source-line-no">7149</span><span id="line-7149">        }</span>
+<span class="source-line-no">7150</span><span id="line-7150">      }</span>
+<span class="source-line-no">7151</span><span id="line-7151">      rowLockContext.setThreadName(Thread.currentThread().getName());</span>
+<span class="source-line-no">7152</span><span id="line-7152">      success = true;</span>
+<span class="source-line-no">7153</span><span id="line-7153">      return result;</span>
+<span class="source-line-no">7154</span><span id="line-7154">    } catch (InterruptedException ie) {</span>
+<span class="source-line-no">7155</span><span id="line-7155">      if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">7156</span><span id="line-7156">        LOG.debug("Thread interrupted waiting for lock on row: {}, in region {}", rowKey,</span>
+<span class="source-line-no">7157</span><span id="line-7157">          getRegionInfo().getRegionNameAsString());</span>
+<span class="source-line-no">7158</span><span id="line-7158">      }</span>
+<span class="source-line-no">7159</span><span id="line-7159">      throw throwOnInterrupt(ie);</span>
+<span class="source-line-no">7160</span><span id="line-7160">    } catch (Error error) {</span>
+<span class="source-line-no">7161</span><span id="line-7161">      // The maximum lock count for read lock is 64K (hardcoded), when this maximum count</span>
+<span class="source-line-no">7162</span><span id="line-7162">      // is reached, it will throw out an Error. This Error needs to be caught so it can</span>
+<span class="source-line-no">7163</span><span id="line-7163">      // go ahead to process the minibatch with lock acquired.</span>
+<span class="source-line-no">7164</span><span id="line-7164">      LOG.warn("Error to get row lock for {}, in region {}, cause: {}", Bytes.toStringBinary(row),</span>
+<span class="source-line-no">7165</span><span id="line-7165">        getRegionInfo().getRegionNameAsString(), error);</span>
+<span class="source-line-no">7166</span><span id="line-7166">      IOException ioe = new IOException(error);</span>
+<span class="source-line-no">7167</span><span id="line-7167">      throw ioe;</span>
+<span class="source-line-no">7168</span><span id="line-7168">    } finally {</span>
+<span class="source-line-no">7169</span><span id="line-7169">      // Clean up the counts just in case this was the thing keeping the context alive.</span>
+<span class="source-line-no">7170</span><span id="line-7170">      if (!success &amp;&amp; rowLockContext != null) {</span>
+<span class="source-line-no">7171</span><span id="line-7171">        rowLockContext.cleanUp();</span>
+<span class="source-line-no">7172</span><span id="line-7172">      }</span>
+<span class="source-line-no">7173</span><span id="line-7173">    }</span>
+<span class="source-line-no">7174</span><span id="line-7174">  }</span>
+<span class="source-line-no">7175</span><span id="line-7175"></span>
+<span class="source-line-no">7176</span><span id="line-7176">  private RowLock getRowLock(byte[] row, boolean readLock, final RowLock prevRowLock)</span>
+<span class="source-line-no">7177</span><span id="line-7177">    throws IOException {</span>
+<span class="source-line-no">7178</span><span id="line-7178">    return TraceUtil.trace(() -&gt; getRowLockInternal(row, readLock, prevRowLock),</span>
+<span class="source-line-no">7179</span><span id="line-7179">      () -&gt; createRegionSpan("Region.getRowLock").setAttribute(ROW_LOCK_READ_LOCK_KEY, readLock));</span>
 <span class="source-line-no">7180</span><span id="line-7180">  }</span>
 <span class="source-line-no">7181</span><span id="line-7181"></span>
-<span class="source-line-no">7182</span><span id="line-7182">  public ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; getLockedRows() {</span>
-<span class="source-line-no">7183</span><span id="line-7183">    return lockedRows;</span>
-<span class="source-line-no">7184</span><span id="line-7184">  }</span>
-<span class="source-line-no">7185</span><span id="line-7185"></span>
-<span class="source-line-no">7186</span><span id="line-7186">  class RowLockContext {</span>
-<span class="source-line-no">7187</span><span id="line-7187">    private final HashedBytes row;</span>
-<span class="source-line-no">7188</span><span id="line-7188">    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);</span>
-<span class="source-line-no">7189</span><span id="line-7189">    final AtomicBoolean usable = new AtomicBoolean(true);</span>
-<span class="source-line-no">7190</span><span id="line-7190">    final AtomicInteger count = new AtomicInteger(0);</span>
-<span class="source-line-no">7191</span><span id="line-7191">    final Object lock = new Object();</span>
-<span class="source-line-no">7192</span><span id="line-7192">    private String threadName;</span>
-<span class="source-line-no">7193</span><span id="line-7193"></span>
-<span class="source-line-no">7194</span><span id="line-7194">    RowLockContext(HashedBytes row) {</span>
-<span class="source-line-no">7195</span><span id="line-7195">      this.row = row;</span>
-<span class="source-line-no">7196</span><span id="line-7196">    }</span>
-<span class="source-line-no">7197</span><span id="line-7197"></span>
-<span class="source-line-no">7198</span><span id="line-7198">    RowLockImpl newWriteLock() {</span>
-<span class="source-line-no">7199</span><span id="line-7199">      Lock l = readWriteLock.writeLock();</span>
-<span class="source-line-no">7200</span><span id="line-7200">      return getRowLock(l);</span>
-<span class="source-line-no">7201</span><span id="line-7201">    }</span>
-<span class="source-line-no">7202</span><span id="line-7202"></span>
-<span class="source-line-no">7203</span><span id="line-7203">    RowLockImpl newReadLock() {</span>
-<span class="source-line-no">7204</span><span id="line-7204">      Lock l = readWriteLock.readLock();</span>
-<span class="source-line-no">7205</span><span id="line-7205">      return getRowLock(l);</span>
-<span class="source-line-no">7206</span><span id="line-7206">    }</span>
-<span class="source-line-no">7207</span><span id="line-7207"></span>
-<span class="source-line-no">7208</span><span id="line-7208">    private RowLockImpl getRowLock(Lock l) {</span>
-<span class="source-line-no">7209</span><span id="line-7209">      count.incrementAndGet();</span>
-<span class="source-line-no">7210</span><span id="line-7210">      synchronized (lock) {</span>
-<span class="source-line-no">7211</span><span id="line-7211">        if (usable.get()) {</span>
-<span class="source-line-no">7212</span><span id="line-7212">          return new RowLockImpl(this, l);</span>
-<span class="source-line-no">7213</span><span id="line-7213">        } else {</span>
-<span class="source-line-no">7214</span><span id="line-7214">          return null;</span>
-<span class="source-line-no">7215</span><span id="line-7215">        }</span>
-<span class="source-line-no">7216</span><span id="line-7216">      }</span>
-<span class="source-line-no">7217</span><span id="line-7217">    }</span>
-<span class="source-line-no">7218</span><span id="line-7218"></span>
-<span class="source-line-no">7219</span><span id="line-7219">    void cleanUp() {</span>
-<span class="source-line-no">7220</span><span id="line-7220">      long c = count.decrementAndGet();</span>
-<span class="source-line-no">7221</span><span id="line-7221">      if (c &lt;= 0) {</span>
-<span class="source-line-no">7222</span><span id="line-7222">        synchronized (lock) {</span>
-<span class="source-line-no">7223</span><span id="line-7223">          if (count.get() &lt;= 0 &amp;&amp; usable.get()) { // Don't attempt to remove row if already removed</span>
-<span class="source-line-no">7224</span><span id="line-7224">            usable.set(false);</span>
-<span class="source-line-no">7225</span><span id="line-7225">            RowLockContext removed = lockedRows.remove(row);</span>
-<span class="source-line-no">7226</span><span id="line-7226">            assert removed == this : "we should never remove a different context";</span>
-<span class="source-line-no">7227</span><span id="line-7227">          }</span>
+<span class="source-line-no">7182</span><span id="line-7182">  private void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {</span>
+<span class="source-line-no">7183</span><span id="line-7183">    if (rowLocks != null) {</span>
+<span class="source-line-no">7184</span><span id="line-7184">      for (RowLock rowLock : rowLocks) {</span>
+<span class="source-line-no">7185</span><span id="line-7185">        rowLock.release();</span>
+<span class="source-line-no">7186</span><span id="line-7186">      }</span>
+<span class="source-line-no">7187</span><span id="line-7187">      rowLocks.clear();</span>
+<span class="source-line-no">7188</span><span id="line-7188">    }</span>
+<span class="source-line-no">7189</span><span id="line-7189">  }</span>
+<span class="source-line-no">7190</span><span id="line-7190"></span>
+<span class="source-line-no">7191</span><span id="line-7191">  public int getReadLockCount() {</span>
+<span class="source-line-no">7192</span><span id="line-7192">    return lock.getReadLockCount();</span>
+<span class="source-line-no">7193</span><span id="line-7193">  }</span>
+<span class="source-line-no">7194</span><span id="line-7194"></span>
+<span class="source-line-no">7195</span><span id="line-7195">  public ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; getLockedRows() {</span>
+<span class="source-line-no">7196</span><span id="line-7196">    return lockedRows;</span>
+<span class="source-line-no">7197</span><span id="line-7197">  }</span>
+<span class="source-line-no">7198</span><span id="line-7198"></span>
+<span class="source-line-no">7199</span><span id="line-7199">  class RowLockContext {</span>
+<span class="source-line-no">7200</span><span id="line-7200">    private final HashedBytes row;</span>
+<span class="source-line-no">7201</span><span id="line-7201">    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);</span>
+<span class="source-line-no">7202</span><span id="line-7202">    final AtomicBoolean usable = new AtomicBoolean(true);</span>
+<span class="source-line-no">7203</span><span id="line-7203">    final AtomicInteger count = new AtomicInteger(0);</span>
+<span class="source-line-no">7204</span><span id="line-7204">    final Object lock = new Object();</span>
+<span class="source-line-no">7205</span><span id="line-7205">    private String threadName;</span>
+<span class="source-line-no">7206</span><span id="line-7206"></span>
+<span class="source-line-no">7207</span><span id="line-7207">    RowLockContext(HashedBytes row) {</span>
+<span class="source-line-no">7208</span><span id="line-7208">      this.row = row;</span>
+<span class="source-line-no">7209</span><span id="line-7209">    }</span>
+<span class="source-line-no">7210</span><span id="line-7210"></span>
+<span class="source-line-no">7211</span><span id="line-7211">    RowLockImpl newWriteLock() {</span>
+<span class="source-line-no">7212</span><span id="line-7212">      Lock l = readWriteLock.writeLock();</span>
+<span class="source-line-no">7213</span><span id="line-7213">      return getRowLock(l);</span>
+<span class="source-line-no">7214</span><span id="line-7214">    }</span>
+<span class="source-line-no">7215</span><span id="line-7215"></span>
+<span class="source-line-no">7216</span><span id="line-7216">    RowLockImpl newReadLock() {</span>
+<span class="source-line-no">7217</span><span id="line-7217">      Lock l = readWriteLock.readLock();</span>
+<span class="source-line-no">7218</span><span id="line-7218">      return getRowLock(l);</span>
+<span class="source-line-no">7219</span><span id="line-7219">    }</span>
+<span class="source-line-no">7220</span><span id="line-7220"></span>
+<span class="source-line-no">7221</span><span id="line-7221">    private RowLockImpl getRowLock(Lock l) {</span>
+<span class="source-line-no">7222</span><span id="line-7222">      count.incrementAndGet();</span>
+<span class="source-line-no">7223</span><span id="line-7223">      synchronized (lock) {</span>
+<span class="source-line-no">7224</span><span id="line-7224">        if (usable.get()) {</span>
+<span class="source-line-no">7225</span><span id="line-7225">          return new RowLockImpl(this, l);</span>
+<span class="source-line-no">7226</span><span id="line-7226">        } else {</span>
+<span class="source-line-no">7227</span><span id="line-7227">          return null;</span>
 <span class="source-line-no">7228</span><span id="line-7228">        }</span>
 <span class="source-line-no">7229</span><span id="line-7229">      }</span>
 <span class="source-line-no">7230</span><span id="line-7230">    }</span>
 <span class="source-line-no">7231</span><span id="line-7231"></span>
-<span class="source-line-no">7232</span><span id="line-7232">    public void setThreadName(String threadName) {</span>
-<span class="source-line-no">7233</span><span id="line-7233">      this.threadName = threadName;</span>
-<span class="source-line-no">7234</span><span id="line-7234">    }</span>
-<span class="source-line-no">7235</span><span id="line-7235"></span>
-<span class="source-line-no">7236</span><span id="line-7236">    @Override</span>
-<span class="source-line-no">7237</span><span id="line-7237">    public String toString() {</span>
-<span class="source-line-no">7238</span><span id="line-7238">      return "RowLockContext{" + "row=" + row + ", readWriteLock=" + readWriteLock + ", count="</span>
-<span class="source-line-no">7239</span><span id="line-7239">        + count + ", threadName=" + threadName + '}';</span>
-<span class="source-line-no">7240</span><span id="line-7240">    }</span>
-<span class="source-line-no">7241</span><span id="line-7241">  }</span>
-<span class="source-line-no">7242</span><span id="line-7242"></span>
-<span class="source-line-no">7243</span><span id="line-7243">  /**</span>
-<span class="source-line-no">7244</span><span id="line-7244">   * Class used to represent a lock on a row.</span>
-<span class="source-line-no">7245</span><span id="line-7245">   */</span>
-<span class="source-line-no">7246</span><span id="line-7246">  public static class RowLockImpl implements RowLock {</span>
-<span class="source-line-no">7247</span><span id="line-7247">    private final RowLockContext context;</span>
-<span class="source-line-no">7248</span><span id="line-7248">    private final Lock lock;</span>
-<span class="source-line-no">7249</span><span id="line-7249"></span>
-<span class="source-line-no">7250</span><span id="line-7250">    public RowLockImpl(RowLockContext context, Lock lock) {</span>
-<span class="source-line-no">7251</span><span id="line-7251">      this.context = context;</span>
-<span class="source-line-no">7252</span><span id="line-7252">      this.lock = lock;</span>
+<span class="source-line-no">7232</span><span id="line-7232">    void cleanUp() {</span>
+<span class="source-line-no">7233</span><span id="line-7233">      long c = count.decrementAndGet();</span>
+<span class="source-line-no">7234</span><span id="line-7234">      if (c &lt;= 0) {</span>
+<span class="source-line-no">7235</span><span id="line-7235">        synchronized (lock) {</span>
+<span class="source-line-no">7236</span><span id="line-7236">          if (count.get() &lt;= 0 &amp;&amp; usable.get()) { // Don't attempt to remove row if already removed</span>
+<span class="source-line-no">7237</span><span id="line-7237">            usable.set(false);</span>
+<span class="source-line-no">7238</span><span id="line-7238">            RowLockContext removed = lockedRows.remove(row);</span>
+<span class="source-line-no">7239</span><span id="line-7239">            assert removed == this : "we should never remove a different context";</span>
+<span class="source-line-no">7240</span><span id="line-7240">          }</span>
+<span class="source-line-no">7241</span><span id="line-7241">        }</span>
+<span class="source-line-no">7242</span><span id="line-7242">      }</span>
+<span class="source-line-no">7243</span><span id="line-7243">    }</span>
+<span class="source-line-no">7244</span><span id="line-7244"></span>
+<span class="source-line-no">7245</span><span id="line-7245">    public void setThreadName(String threadName) {</span>
+<span class="source-line-no">7246</span><span id="line-7246">      this.threadName = threadName;</span>
+<span class="source-line-no">7247</span><span id="line-7247">    }</span>
+<span class="source-line-no">7248</span><span id="line-7248"></span>
+<span class="source-line-no">7249</span><span id="line-7249">    @Override</span>
+<span class="source-line-no">7250</span><span id="line-7250">    public String toString() {</span>
+<span class="source-line-no">7251</span><span id="line-7251">      return "RowLockContext{" + "row=" + row + ", readWriteLock=" + readWriteLock + ", count="</span>
+<span class="source-line-no">7252</span><span id="line-7252">        + count + ", threadName=" + threadName + '}';</span>
 <span class="source-line-no">7253</span><span id="line-7253">    }</span>
-<span class="source-line-no">7254</span><span id="line-7254"></span>
-<span class="source-line-no">7255</span><span id="line-7255">    public Lock getLock() {</span>
-<span class="source-line-no">7256</span><span id="line-7256">      return lock;</span>
-<span class="source-line-no">7257</span><span id="line-7257">    }</span>
-<span class="source-line-no">7258</span><span id="line-7258"></span>
-<span class="source-line-no">7259</span><span id="line-7259">    public RowLockContext getContext() {</span>
-<span class="source-line-no">7260</span><span id="line-7260">      return context;</span>
-<span class="source-line-no">7261</span><span id="line-7261">    }</span>
+<span class="source-line-no">7254</span><span id="line-7254">  }</span>
+<span class="source-line-no">7255</span><span id="line-7255"></span>
+<span class="source-line-no">7256</span><span id="line-7256">  /**</span>
+<span class="source-line-no">7257</span><span id="line-7257">   * Class used to represent a lock on a row.</span>
+<span class="source-line-no">7258</span><span id="line-7258">   */</span>
+<span class="source-line-no">7259</span><span id="line-7259">  public static class RowLockImpl implements RowLock {</span>
+<span class="source-line-no">7260</span><span id="line-7260">    private final RowLockContext context;</span>
+<span class="source-line-no">7261</span><span id="line-7261">    private final Lock lock;</span>
 <span class="source-line-no">7262</span><span id="line-7262"></span>
-<span class="source-line-no">7263</span><span id="line-7263">    @Override</span>
-<span class="source-line-no">7264</span><span id="line-7264">    public void release() {</span>
-<span class="source-line-no">7265</span><span id="line-7265">      lock.unlock();</span>
-<span class="source-line-no">7266</span><span id="line-7266">      context.cleanUp();</span>
-<span class="source-line-no">7267</span><span id="line-7267">    }</span>
-<span class="source-line-no">7268</span><span id="line-7268"></span>
-<span class="source-line-no">7269</span><span id="line-7269">    @Override</span>
-<span class="source-line-no">7270</span><span id="line-7270">    public String toString() {</span>
-<span class="source-line-no">7271</span><span id="line-7271">      return "RowLockImpl{" + "context=" + context + ", lock=" + lock + '}';</span>
-<span class="source-line-no">7272</span><span id="line-7272">    }</span>
-<span class="source-line-no">7273</span><span id="line-7273">  }</span>
-<span class="source-line-no">7274</span><span id="line-7274"></span>
-<span class="source-line-no">7275</span><span id="line-7275">  /**</span>
-<span class="source-line-no">7276</span><span id="line-7276">   * Determines whether multiple column families are present Precondition: familyPaths is not null</span>
-<span class="source-line-no">7277</span><span id="line-7277">   * @param familyPaths List of (column family, hfilePath)</span>
-<span class="source-line-no">7278</span><span id="line-7278">   */</span>
-<span class="source-line-no">7279</span><span id="line-7279">  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {</span>
-<span class="source-line-no">7280</span><span id="line-7280">    boolean multipleFamilies = false;</span>
-<span class="source-line-no">7281</span><span id="line-7281">    byte[] family = null;</span>
-<span class="source-line-no">7282</span><span id="line-7282">    for (Pair&lt;byte[], String&gt; pair : familyPaths) {</span>
-<span class="source-line-no">7283</span><span id="line-7283">      byte[] fam = pair.getFirst();</span>
-<span class="source-line-no">7284</span><span id="line-7284">      if (family == null) {</span>
-<span class="source-line-no">7285</span><span id="line-7285">        family = fam;</span>
-<span class="source-line-no">7286</span><span id="line-7286">      } else if (!Bytes.equals(family, fam)) {</span>
-<span class="source-line-no">7287</span><span id="line-7287">        multipleFamilies = true;</span>
-<span class="source-line-no">7288</span><span id="line-7288">        break;</span>
-<span class="source-line-no">7289</span><span id="line-7289">      }</span>
-<span class="source-line-no">7290</span><span id="line-7290">    }</span>
-<span class="source-line-no">7291</span><span id="line-7291">    return multipleFamilies;</span>
-<span class="source-line-no">7292</span><span id="line-7292">  }</span>
-<span class="source-line-no">7293</span><span id="line-7293"></span>
-<span class="source-line-no">7294</span><span id="line-7294">  /**</span>
-<span class="source-line-no">7295</span><span id="line-7295">   * Attempts to atomically load a group of hfiles. This is critical for loading rows with multiple</span>
-<span class="source-line-no">7296</span><span id="line-7296">   * column families atomically.</span>
-<span class="source-line-no">7297</span><span id="line-7297">   * @param familyPaths      List of Pair&amp;lt;byte[] column family, String hfilePath&amp;gt;</span>
-<span class="source-line-no">7298</span><span id="line-7298">   * @param bulkLoadListener Internal hooks enabling massaging/preparation of a file about to be</span>
-<span class="source-line-no">7299</span><span id="line-7299">   *                         bulk loaded</span>
-<span class="source-line-no">7300</span><span id="line-7300">   * @return Map from family to List of store file paths if successful, null if failed recoverably</span>
-<span class="source-line-no">7301</span><span id="line-7301">   * @throws IOException if failed unrecoverably.</span>
-<span class="source-line-no">7302</span><span id="line-7302">   */</span>
-<span class="source-line-no">7303</span><span id="line-7303">  public Map&lt;byte[], List&lt;Path&gt;&gt; bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths,</span>
-<span class="source-line-no">7304</span><span id="line-7304">    boolean assignSeqId, BulkLoadListener bulkLoadListener) throws IOException {</span>
-<span class="source-line-no">7305</span><span id="line-7305">    return bulkLoadHFiles(familyPaths, assignSeqId, bulkLoadListener, false, null, true);</span>
-<span class="source-line-no">7306</span><span id="line-7306">  }</span>
-<span class="source-line-no">7307</span><span id="line-7307"></span>
-<span class="source-line-no">7308</span><span id="line-7308">  /**</span>
-<span class="source-line-no">7309</span><span id="line-7309">   * Listener class to enable callers of bulkLoadHFile() to perform any necessary pre/post</span>
-<span class="source-line-no">7310</span><span id="line-7310">   * processing of a given bulkload call</span>
-<span class="source-line-no">7311</span><span id="line-7311">   */</span>
-<span class="source-line-no">7312</span><span id="line-7312">  public interface BulkLoadListener {</span>
-<span class="source-line-no">7313</span><span id="line-7313">    /**</span>
-<span class="source-line-no">7314</span><span id="line-7314">     * Called before an HFile is actually loaded</span>
-<span class="source-line-no">7315</span><span id="line-7315">     * @param family  family being loaded to</span>
-<span class="source-line-no">7316</span><span id="line-7316">     * @param srcPath path of HFile</span>
-<span class="source-line-no">7317</span><span id="line-7317">     * @return final path to be used for actual loading</span>
-<span class="source-line-no">7318</span><span id="line-7318">     */</span>
-<span class="source-line-no">7319</span><span id="line-7319">    String prepareBulkLoad(byte[] family, String srcPath, boolean copyFile, String customStaging)</span>
-<span class="source-line-no">7320</span><span id="line-7320">      throws IOException;</span>
-<span class="source-line-no">7321</span><span id="line-7321"></span>
-<span class="source-line-no">7322</span><span id="line-7322">    /**</span>
-<span class="source-line-no">7323</span><span id="line-7323">     * Called after a successful HFile load</span>
-<span class="source-line-no">7324</span><span id="line-7324">     * @param family  family being loaded to</span>
-<span class="source-line-no">7325</span><span id="line-7325">     * @param srcPath path of HFile</span>
-<span class="source-line-no">7326</span><span id="line-7326">     */</span>
-<span class="source-line-no">7327</span><span id="line-7327">    void doneBulkLoad(byte[] family, String srcPath) throws IOException;</span>
-<span class="source-line-no">7328</span><span id="line-7328"></span>
-<span class="source-line-no">7329</span><span id="line-7329">    /**</span>
-<span class="source-line-no">7330</span><span id="line-7330">     * Called after a failed HFile load</span>
-<span class="source-line-no">7331</span><span id="line-7331">     * @param family  family being loaded to</span>
-<span class="source-line-no">7332</span><span id="line-7332">     * @param srcPath path of HFile</span>
-<span class="source-line-no">7333</span><span id="line-7333">     */</span>
-<span class="source-line-no">7334</span><span id="line-7334">    void failedBulkLoad(byte[] family, String srcPath) throws IOException;</span>
-<span class="source-line-no">7335</span><span id="line-7335">  }</span>
-<span class="source-line-no">7336</span><span id="line-7336"></span>
-<span class="source-line-no">7337</span><span id="line-7337">  /**</span>
-<span class="source-line-no">7338</span><span id="line-7338">   * Attempts to atomically load a group of hfiles. This is critical for loading rows with multiple</span>
-<span class="source-line-no">7339</span><span id="line-7339">   * column families atomically.</span>
-<span class="source-line-no">7340</span><span id="line-7340">   * @param familyPaths      List of Pair&amp;lt;byte[] column family, String hfilePath&amp;gt;</span>
-<span class="source-line-no">7341</span><span id="line-7341">   * @param bulkLoadListener Internal hooks enabling massaging/preparation of a file about to be</span>
-<span class="source-line-no">7342</span><span id="line-7342">   *                         bulk loaded</span>
-<span class="source-line-no">7343</span><span id="line-7343">   * @param copyFile         always copy hfiles if true</span>
-<span class="source-line-no">7344</span><span id="line-7344">   * @param clusterIds       ids from clusters that had already handled the given bulkload event.</span>
-<span class="source-line-no">7345</span><span id="line-7345">   * @return Map from family to List of store file paths if successful, null if failed recoverably</span>
-<span class="source-line-no">7346</span><span id="line-7346">   * @throws IOException if failed unrecoverably.</span>
-<span class="source-line-no">7347</span><span id="line-7347">   */</span>
-<span class="source-line-no">7348</span><span id="line-7348">  public Map&lt;byte[], List&lt;Path&gt;&gt; bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths,</span>
-<span class="source-line-no">7349</span><span id="line-7349">    boolean assignSeqId, BulkLoadListener bulkLoadListener, boolean copyFile,</span>
-<span class="source-line-no">7350</span><span id="line-7350">    List&lt;String&gt; clusterIds, boolean replicate) throws IOException {</span>
-<span class="source-line-no">7351</span><span id="line-7351">    long seqId = -1;</span>
-<span class="source-line-no">7352</span><span id="line-7352">    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">7353</span><span id="line-7353">    Map&lt;String, Long&gt; storeFilesSizes = new HashMap&lt;&gt;();</span>
-<span class="source-line-no">7354</span><span id="line-7354">    Preconditions.checkNotNull(familyPaths);</span>
-<span class="source-line-no">7355</span><span id="line-7355">    // we need writeLock for multi-family bulk load</span>
-<span class="source-line-no">7356</span><span id="line-7356">    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));</span>
-<span class="source-line-no">7357</span><span id="line-7357">    boolean isSuccessful = false;</span>
-<span class="source-line-no">7358</span><span id="line-7358">    try {</span>
-<span class="source-line-no">7359</span><span id="line-7359">      this.writeRequestsCount.increment();</span>
-<span class="source-line-no">7360</span><span id="line-7360"></span>
-<span class="source-line-no">7361</span><span id="line-7361">      // There possibly was a split that happened between when the split keys</span>
-<span class="source-line-no">7362</span><span id="line-7362">      // were gathered and before the HRegion's write lock was taken. We need</span>
-<span class="source-line-no">7363</span><span id="line-7363">      // to validate the HFile region before attempting to bulk load all of them</span>
-<span class="source-line-no">7364</span><span id="line-7364">      IOException ioException = null;</span>
-<span class="source-line-no">7365</span><span id="line-7365">      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">7366</span><span id="line-7366">      for (Pair&lt;byte[], String&gt; p : familyPaths) {</span>
-<span class="source-line-no">7367</span><span id="line-7367">        byte[] familyName = p.getFirst();</span>
-<span class="source-line-no">7368</span><span id="line-7368">        String path = p.getSecond();</span>
-<span class="source-line-no">7369</span><span id="line-7369"></span>
-<span class="source-line-no">7370</span><span id="line-7370">        HStore store = getStore(familyName);</span>
-<span class="source-line-no">7371</span><span id="line-7371">        if (store == null) {</span>
-<span class="source-line-no">7372</span><span id="line-7372">          ioException = new org.apache.hadoop.hbase.DoNotRetryIOException(</span>
-<span class="source-line-no">7373</span><span id="line-7373">            "No such column family " + Bytes.toStringBinary(familyName));</span>
-<span class="source-line-no">7374</span><span id="line-7374">        } else {</span>
-<span class="source-line-no">7375</span><span id="line-7375">          try {</span>
-<span class="source-line-no">7376</span><span id="line-7376">            store.assertBulkLoadHFileOk(new Path(path));</span>
-<span class="source-line-no">7377</span><span id="line-7377">          } catch (WrongRegionException wre) {</span>
-<span class="source-line-no">7378</span><span id="line-7378">            // recoverable (file doesn't fit in region)</span>
-<span class="source-line-no">7379</span><span id="line-7379">            failures.add(p);</span>
-<span class="source-line-no">7380</span><span id="line-7380">          } catch (IOException ioe) {</span>
-<span class="source-line-no">7381</span><span id="line-7381">            // unrecoverable (hdfs problem)</span>
-<span class="source-line-no">7382</span><span id="line-7382">            ioException = ioe;</span>
-<span class="source-line-no">7383</span><span id="line-7383">          }</span>
-<span class="source-line-no">7384</span><span id="line-7384">        }</span>
-<span class="source-line-no">7385</span><span id="line-7385"></span>
-<span class="source-line-no">7386</span><span id="line-7386">        // validation failed because of some sort of IO problem.</span>
-<span class="source-line-no">7387</span><span id="line-7387">        if (ioException != null) {</span>
-<span class="source-line-no">7388</span><span id="line-7388">          LOG.error("There was IO error when checking if the bulk load is ok in region {}.", this,</span>
-<span class="source-line-no">7389</span><span id="line-7389">            ioException);</span>
-<span class="source-line-no">7390</span><span id="line-7390">          throw ioException;</span>
-<span class="source-line-no">7391</span><span id="line-7391">        }</span>
-<span class="source-line-no">7392</span><span id="line-7392">      }</span>
-<span class="source-line-no">7393</span><span id="line-7393">      // validation failed, bail out before doing anything permanent.</span>
-<span class="source-line-no">7394</span><span id="line-7394">      if (failures.size() != 0) {</span>
-<span class="source-line-no">7395</span><span id="line-7395">        StringBuilder list = new StringBuilder();</span>
-<span class="source-line-no">7396</span><span id="line-7396">        for (Pair&lt;byte[], String&gt; p : failures) {</span>
-<span class="source-line-no">7397</span><span id="line-7397">          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")</span>
-<span class="source-line-no">7398</span><span id="line-7398">            .append(p.getSecond());</span>
-<span class="source-line-no">7399</span><span id="line-7399">        }</span>
-<span class="source-line-no">7400</span><span id="line-7400">        // problem when validating</span>
-<span class="source-line-no">7401</span><span id="line-7401">        LOG.warn("There was a recoverable bulk load failure likely due to a split. These (family,"</span>
-<span class="source-line-no">7402</span><span id="line-7402">          + " HFile) pairs were not loaded: {}, in region {}", list.toString(), this);</span>
-<span class="source-line-no">7403</span><span id="line-7403">        return null;</span>
-<span class="source-line-no">7404</span><span id="line-7404">      }</span>
-<span class="source-line-no">7405</span><span id="line-7405"></span>
-<span class="source-line-no">7406</span><span id="line-7406">      // We need to assign a sequential ID that's in between two memstores in order to preserve</span>
-<span class="source-line-no">7407</span><span id="line-7407">      // the guarantee that all the edits lower than the highest sequential ID from all the</span>
-<span class="source-line-no">7408</span><span id="line-7408">      // HFiles are flushed on disk. See HBASE-10958. The sequence id returned when we flush is</span>
-<span class="source-line-no">7409</span><span id="line-7409">      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is</span>
-<span class="source-line-no">7410</span><span id="line-7410">      // a sequence id that we can be sure is beyond the last hfile written).</span>
-<span class="source-line-no">7411</span><span id="line-7411">      if (assignSeqId) {</span>
-<span class="source-line-no">7412</span><span id="line-7412">        FlushResult fs = flushcache(true, false, FlushLifeCycleTracker.DUMMY);</span>
-<span class="source-line-no">7413</span><span id="line-7413">        if (fs.isFlushSucceeded()) {</span>
-<span class="source-line-no">7414</span><span id="line-7414">          seqId = ((FlushResultImpl) fs).flushSequenceId;</span>
-<span class="source-line-no">7415</span><span id="line-7415">        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {</span>
-<span class="source-line-no">7416</span><span id="line-7416">          seqId = ((FlushResultImpl) fs).flushSequenceId;</span>
-<span class="source-line-no">7417</span><span id="line-7417">        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH) {</span>
-<span class="source-line-no">7418</span><span id="line-7418">          // CANNOT_FLUSH may mean that a flush is already on-going</span>
-<span class="source-line-no">7419</span><span id="line-7419">          // we need to wait for that flush to complete</span>
-<span class="source-line-no">7420</span><span id="line-7420">          waitForFlushes();</span>
-<span class="source-line-no">7421</span><span id="line-7421">        } else {</span>
-<span class="source-line-no">7422</span><span id="line-7422">          throw new IOException("Could not bulk load with an assigned sequential ID because the "</span>
-<span class="source-line-no">7423</span><span id="line-7423">            + "flush didn't run. Reason for not flushing: " + ((FlushResultImpl) fs).failureReason);</span>
-<span class="source-line-no">7424</span><span id="line-7424">        }</span>
-<span class="source-line-no">7425</span><span id="line-7425">      }</span>
-<span class="source-line-no">7426</span><span id="line-7426"></span>
-<span class="source-line-no">7427</span><span id="line-7427">      Map&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; familyWithFinalPath =</span>
-<span class="source-line-no">7428</span><span id="line-7428">        new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">7429</span><span id="line-7429">      for (Pair&lt;byte[], String&gt; p : familyPaths) {</span>
-<span class="source-line-no">7430</span><span id="line-7430">        byte[] familyName = p.getFirst();</span>
-<span class="source-line-no">7431</span><span id="line-7431">        String path = p.getSecond();</span>
-<span class="source-line-no">7432</span><span id="line-7432">        HStore store = getStore(familyName);</span>
-<span class="source-line-no">7433</span><span id="line-7433">        if (!familyWithFinalPath.containsKey(familyName)) {</span>
-<span class="source-line-no">7434</span><span id="line-7434">          familyWithFinalPath.put(familyName, new ArrayList&lt;&gt;());</span>
-<span class="source-line-no">7435</span><span id="line-7435">        }</span>
-<span class="source-line-no">7436</span><span id="line-7436">        List&lt;Pair&lt;Path, Path&gt;&gt; lst = familyWithFinalPath.get(familyName);</span>
-<span class="source-line-no">7437</span><span id="line-7437">        String finalPath = path;</span>
-<span class="source-line-no">7438</span><span id="line-7438">        try {</span>
-<span class="source-line-no">7439</span><span id="line-7439">          boolean reqTmp = store.storeEngine.requireWritingToTmpDirFirst();</span>
-<span class="source-line-no">7440</span><span id="line-7440">          if (bulkLoadListener != null) {</span>
-<span class="source-line-no">7441</span><span id="line-7441">            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path, copyFile,</span>
-<span class="source-line-no">7442</span><span id="line-7442">              reqTmp ? null : fs.getRegionDir().toString());</span>
-<span class="source-line-no">7443</span><span id="line-7443">          }</span>
-<span class="source-line-no">7444</span><span id="line-7444">          Pair&lt;Path, Path&gt; pair = null;</span>
-<span class="source-line-no">7445</span><span id="line-7445">          if (reqTmp || !StoreFileInfo.isHFile(finalPath)) {</span>
-<span class="source-line-no">7446</span><span id="line-7446">            pair = store.preBulkLoadHFile(finalPath, seqId);</span>
-<span class="source-line-no">7447</span><span id="line-7447">          } else {</span>
-<span class="source-line-no">7448</span><span id="line-7448">            Path livePath = new Path(finalPath);</span>
-<span class="source-line-no">7449</span><span id="line-7449">            pair = new Pair&lt;&gt;(livePath, livePath);</span>
-<span class="source-line-no">7450</span><span id="line-7450">          }</span>
-<span class="source-line-no">7451</span><span id="line-7451">          lst.add(pair);</span>
-<span class="source-line-no">7452</span><span id="line-7452">        } catch (IOException ioe) {</span>
-<span class="source-line-no">7453</span><span id="line-7453">          // A failure here can cause an atomicity violation that we currently</span>
-<span class="source-line-no">7454</span><span id="line-7454">          // cannot recover from since it is likely a failed HDFS operation.</span>
-<span class="source-line-no">7455</span><span id="line-7455"></span>
-<span class="source-line-no">7456</span><span id="line-7456">          LOG.error("There was a partial failure due to IO when attempting to" + " load "</span>
-<span class="source-line-no">7457</span><span id="line-7457">            + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);</span>
-<span class="source-line-no">7458</span><span id="line-7458">          if (bulkLoadListener != null) {</span>
-<span class="source-line-no">7459</span><span id="line-7459">            try {</span>
-<span class="source-line-no">7460</span><span id="line-7460">              bulkLoadListener.failedBulkLoad(familyName, finalPath);</span>
-<span class="source-line-no">7461</span><span id="line-7461">            } catch (Exception ex) {</span>
-<span class="source-line-no">7462</span><span id="line-7462">              LOG.error("Error while calling failedBulkLoad for family "</span>
-<span class="source-line-no">7463</span><span id="line-7463">                + Bytes.toString(familyName) + " with path " + path, ex);</span>
-<span class="source-line-no">7464</span><span id="line-7464">            }</span>
-<span class="source-line-no">7465</span><span id="line-7465">          }</span>
-<span class="source-line-no">7466</span><span id="line-7466">          throw ioe;</span>
-<span class="source-line-no">7467</span><span id="line-7467">        }</span>
-<span class="source-line-no">7468</span><span id="line-7468">      }</span>
-<span class="source-line-no">7469</span><span id="line-7469"></span>
-<span class="source-line-no">7470</span><span id="line-7470">      if (this.getCoprocessorHost() != null) {</span>
-<span class="source-line-no">7471</span><span id="line-7471">        for (Map.Entry&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; entry : familyWithFinalPath.entrySet()) {</span>
-<span class="source-line-no">7472</span><span id="line-7472">          this.getCoprocessorHost().preCommitStoreFile(entry.getKey(), entry.getValue());</span>
-<span class="source-line-no">7473</span><span id="line-7473">        }</span>
-<span class="source-line-no">7474</span><span id="line-7474">      }</span>
-<span class="source-line-no">7475</span><span id="line-7475">      for (Map.Entry&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; entry : familyWithFinalPath.entrySet()) {</span>
-<span class="source-line-no">7476</span><span id="line-7476">        byte[] familyName = entry.getKey();</span>
-<span class="source-line-no">7477</span><span id="line-7477">        for (Pair&lt;Path, Path&gt; p : entry.getValue()) {</span>
-<span class="source-line-no">7478</span><span id="line-7478">          String path = p.getFirst().toString();</span>
-<span class="source-line-no">7479</span><span id="line-7479">          Path commitedStoreFile = p.getSecond();</span>
-<span class="source-line-no">7480</span><span id="line-7480">          HStore store = getStore(familyName);</span>
-<span class="source-line-no">7481</span><span id="line-7481">          try {</span>
-<span class="source-line-no">7482</span><span id="line-7482">            store.bulkLoadHFile(familyName, path, commitedStoreFile);</span>
-<span class="source-line-no">7483</span><span id="line-7483">            // Note the size of the store file</span>
-<span class="source-line-no">7484</span><span id="line-7484">            try {</span>
-<span class="source-line-no">7485</span><span id="line-7485">              FileSystem fs = commitedStoreFile.getFileSystem(baseConf);</span>
-<span class="source-line-no">7486</span><span id="line-7486">              storeFilesSizes.put(commitedStoreFile.getName(),</span>
-<span class="source-line-no">7487</span><span id="line-7487">                fs.getFileStatus(commitedStoreFile).getLen());</span>
-<span class="source-line-no">7488</span><span id="line-7488">            } catch (IOException e) {</span>
-<span class="source-line-no">7489</span><span id="line-7489">              LOG.warn("Failed to find the size of hfile " + commitedStoreFile, e);</span>
-<span class="source-line-no">7490</span><span id="line-7490">              storeFilesSizes.put(commitedStoreFile.getName(), 0L);</span>
-<span class="source-line-no">7491</span><span id="line-7491">            }</span>
-<span class="source-line-no">7492</span><span id="line-7492"></span>
-<span class="source-line-no">7493</span><span id="line-7493">            if (storeFiles.containsKey(familyName)) {</span>
-<span class="source-line-no">7494</span><span id="line-7494">              storeFiles.get(familyName).add(commitedStoreFile);</span>
-<span class="source-line-no">7495</span><span id="line-7495">            } else {</span>
-<span class="source-line-no">7496</span><span id="line-7496">              List&lt;Path&gt; storeFileNames = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">7497</span><span id="line-7497">              storeFileNames.add(commitedStoreFile);</span>
-<span class="source-line-no">7498</span><span id="line-7498">              storeFiles.put(familyName, storeFileNames);</span>
-<span class="source-line-no">7499</span><span id="line-7499">            }</span>
-<span class="source-line-no">7500</span><span id="line-7500">            if (bulkLoadListener != null) {</span>
-<span class="source-line-no">7501</span><span id="line-7501">              bulkLoadListener.doneBulkLoad(familyName, path);</span>
-<span class="source-line-no">7502</span><span id="line-7502">            }</span>
-<span class="source-line-no">7503</span><span id="line-7503">          } catch (IOException ioe) {</span>
-<span class="source-line-no">7504</span><span id="line-7504">            // A failure here can cause an atomicity violation that we currently</span>
-<span class="source-line-no">7505</span><span id="line-7505">            // cannot recover from since it is likely a failed HDFS operation.</span>
-<span class="source-line-no">7506</span><span id="line-7506"></span>
-<span class="source-line-no">7507</span><span id="line-7507">            // TODO Need a better story for reverting partial failures due to HDFS.</span>
-<span class="source-line-no">7508</span><span id="line-7508">            LOG.error("There was a partial failure due to IO when attempting to" + " load "</span>
-<span class="source-line-no">7509</span><span id="line-7509">              + Bytes.toString(familyName) + " : " + p.getSecond(), ioe);</span>
-<span class="source-line-no">7510</span><span id="line-7510">            if (bulkLoadListener != null) {</span>
-<span class="source-line-no">7511</span><span id="line-7511">              try {</span>
-<span class="source-line-no">7512</span><span id="line-7512">                bulkLoadListener.failedBulkLoad(familyName, path);</span>
-<span class="source-line-no">7513</span><span id="line-7513">              } catch (Exception ex) {</span>
-<span class="source-line-no">7514</span><span id="line-7514">                LOG.error("Error while calling failedBulkLoad for family "</span>
-<span class="source-line-no">7515</span><span id="line-7515">                  + Bytes.toString(familyName) + " with path " + path, ex);</span>
-<span class="source-line-no">7516</span><span id="line-7516">              }</span>
-<span class="source-line-no">7517</span><span id="line-7517">            }</span>
-<span class="source-line-no">7518</span><span id="line-7518">            throw ioe;</span>
-<span class="source-line-no">7519</span><span id="line-7519">          }</span>
-<span class="source-line-no">7520</span><span id="line-7520">        }</span>
-<span class="source-line-no">7521</span><span id="line-7521">      }</span>
-<span class="source-line-no">7522</span><span id="line-7522"></span>
-<span class="source-line-no">7523</span><span id="line-7523">      isSuccessful = true;</span>
-<span class="source-line-no">7524</span><span id="line-7524">      if (conf.getBoolean(COMPACTION_AFTER_BULKLOAD_ENABLE, false)) {</span>
-<span class="source-line-no">7525</span><span id="line-7525">        // request compaction</span>
-<span class="source-line-no">7526</span><span id="line-7526">        familyWithFinalPath.keySet().forEach(family -&gt; {</span>
-<span class="source-line-no">7527</span><span id="line-7527">          HStore store = getStore(family);</span>
-<span class="source-line-no">7528</span><span id="line-7528">          try {</span>
-<span class="source-line-no">7529</span><span id="line-7529">            if (this.rsServices != null &amp;&amp; store.needsCompaction()) {</span>
-<span class="source-line-no">7530</span><span id="line-7530">              this.rsServices.getCompactionRequestor().requestSystemCompaction(this, store,</span>
-<span class="source-line-no">7531</span><span id="line-7531">                "bulkload hfiles request compaction", true);</span>
-<span class="source-line-no">7532</span><span id="line-7532">              LOG.info("Request compaction for region {} family {} after bulk load",</span>
-<span class="source-line-no">7533</span><span id="line-7533">                this.getRegionInfo().getEncodedName(), store.getColumnFamilyName());</span>
-<span class="source-line-no">7534</span><span id="line-7534">            }</span>
-<span class="source-line-no">7535</span><span id="line-7535">          } catch (IOException e) {</span>
-<span class="source-line-no">7536</span><span id="line-7536">            LOG.error("bulkload hfiles request compaction error ", e);</span>
-<span class="source-line-no">7537</span><span id="line-7537">          }</span>
-<span class="source-line-no">7538</span><span id="line-7538">        });</span>
-<span class="source-line-no">7539</span><span id="line-7539">      }</span>
-<span class="source-line-no">7540</span><span id="line-7540">    } finally {</span>
-<span class="source-line-no">7541</span><span id="line-7541">      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {</span>
-<span class="source-line-no">7542</span><span id="line-7542">        // Write a bulk load event for hfiles that are loaded</span>
-<span class="source-line-no">7543</span><span id="line-7543">        try {</span>
-<span class="source-line-no">7544</span><span id="line-7544">          WALProtos.BulkLoadDescriptor loadDescriptor =</span>
-<span class="source-line-no">7545</span><span id="line-7545">            ProtobufUtil.toBulkLoadDescriptor(this.getRegionInfo().getTable(),</span>
-<span class="source-line-no">7546</span><span id="line-7546">              UnsafeByteOperations.unsafeWrap(this.getRegionInfo().getEncodedNameAsBytes()),</span>
-<span class="source-line-no">7547</span><span id="line-7547">              storeFiles, storeFilesSizes, seqId, clusterIds, replicate);</span>
-<span class="source-line-no">7548</span><span id="line-7548">          WALUtil.writeBulkLoadMarkerAndSync(this.wal, this.getReplicationScope(), getRegionInfo(),</span>
-<span class="source-line-no">7549</span><span id="line-7549">            loadDescriptor, mvcc, regionReplicationSink.orElse(null));</span>
-<span class="source-line-no">7550</span><span id="line-7550">        } catch (IOException ioe) {</span>
-<span class="source-line-no">7551</span><span id="line-7551">          if (this.rsServices != null) {</span>
-<span class="source-line-no">7552</span><span id="line-7552">            // Have to abort region server because some hfiles has been loaded but we can't write</span>
-<span class="source-line-no">7553</span><span id="line-7553">            // the event into WAL</span>
-<span class="source-line-no">7554</span><span id="line-7554">            isSuccessful = false;</span>
-<span class="source-line-no">7555</span><span id="line-7555">            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);</span>
-<span class="source-line-no">7556</span><span id="line-7556">          }</span>
-<span class="source-line-no">7557</span><span id="line-7557">        }</span>
-<span class="source-line-no">7558</span><span id="line-7558">      }</span>
-<span class="source-line-no">7559</span><span id="line-7559"></span>
-<span class="source-line-no">7560</span><span id="line-7560">      closeBulkRegionOperation();</span>
-<span class="source-line-no">7561</span><span id="line-7561">    }</span>
-<span class="source-line-no">7562</span><span id="line-7562">    return isSuccessful ? storeFiles : null;</span>
-<span class="source-line-no">7563</span><span id="line-7563">  }</span>
-<span class="source-line-no">7564</span><span id="line-7564"></span>
-<span class="source-line-no">7565</span><span id="line-7565">  @Override</span>
-<span class="source-line-no">7566</span><span id="line-7566">  public boolean equals(Object o) {</span>
-<span class="source-line-no">7567</span><span id="line-7567">    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),</span>
-<span class="source-line-no">7568</span><span id="line-7568">      ((HRegion) o).getRegionInfo().getRegionName());</span>
-<span class="source-line-no">7569</span><span id="line-7569">  }</span>
-<span class="source-line-no">7570</span><span id="line-7570"></span>
-<span class="source-line-no">7571</span><span id="line-7571">  @Override</span>
-<span class="source-line-no">7572</span><span id="line-7572">  public int hashCode() {</span>
-<span class="source-line-no">7573</span><span id="line-7573">    return Bytes.hashCode(getRegionInfo().getRegionName());</span>
-<span class="source-line-no">7574</span><span id="line-7574">  }</span>
-<span class="source-line-no">7575</span><span id="line-7575"></span>
-<span class="source-line-no">7576</span><span id="line-7576">  @Override</span>
-<span class="source-line-no">7577</span><span id="line-7577">  public String toString() {</span>
-<span class="source-line-no">7578</span><span id="line-7578">    return getRegionInfo().getRegionNameAsString();</span>
-<span class="source-line-no">7579</span><span id="line-7579">  }</span>
-<span class="source-line-no">7580</span><span id="line-7580"></span>
-<span class="source-line-no">7581</span><span id="line-7581">  // Utility methods</span>
-<span class="source-line-no">7582</span><span id="line-7582">  /**</span>
-<span class="source-line-no">7583</span><span id="line-7583">   * A utility method to create new instances of HRegion based on the {@link HConstants#REGION_IMPL}</span>
-<span class="source-line-no">7584</span><span id="line-7584">   * configuration property.</span>
-<span class="source-line-no">7585</span><span id="line-7585">   * @param tableDir   qualified path of directory where region should be located, usually the table</span>
-<span class="source-line-no">7586</span><span id="line-7586">   *                   directory.</span>
-<span class="source-line-no">7587</span><span id="line-7587">   * @param wal        The WAL is the outbound log for any updates to the HRegion The wal file is a</span>
-<span class="source-line-no">7588</span><span id="line-7588">   *                   logfile from the previous execution that's custom-computed for this HRegion.</span>
-<span class="source-line-no">7589</span><span id="line-7589">   *                   The HRegionServer computes and sorts the appropriate wal info for this</span>
-<span class="source-line-no">7590</span><span id="line-7590">   *                   HRegion. If there is a previous file (implying that the HRegion has been</span>
-<span class="source-line-no">7591</span><span id="line-7591">   *                   written-to before), then read it from the supplied path.</span>
-<span class="source-line-no">7592</span><span id="line-7592">   * @param fs         is the filesystem.</span>
-<span class="source-line-no">7593</span><span id="line-7593">   * @param conf       is global configuration settings.</span>
-<span class="source-line-no">7594</span><span id="line-7594">   * @param regionInfo - RegionInfo that describes the region is new), then read them from the</span>
-<span class="source-line-no">7595</span><span id="line-7595">   *                   supplied path.</span>
-<span class="source-line-no">7596</span><span id="line-7596">   * @param htd        the table descriptor</span>
-<span class="source-line-no">7597</span><span id="line-7597">   * @return the new instance</span>
-<span class="source-line-no">7598</span><span id="line-7598">   */</span>
-<span class="source-line-no">7599</span><span id="line-7599">  public static HRegion newHRegion(Path tableDir, WAL wal, FileSystem fs, Configuration conf,</span>
-<span class="source-line-no">7600</span><span id="line-7600">    RegionInfo regionInfo, final TableDescriptor htd, RegionServerServices rsServices) {</span>
-<span class="source-line-no">7601</span><span id="line-7601">    try {</span>
-<span class="source-line-no">7602</span><span id="line-7602">      @SuppressWarnings("unchecked")</span>
-<span class="source-line-no">7603</span><span id="line-7603">      Class&lt;? extends HRegion&gt; regionClass =</span>
-<span class="source-line-no">7604</span><span id="line-7604">        (Class&lt;? extends HRegion&gt;) conf.getClass(HConstants.REGION_IMPL, HRegion.class);</span>
-<span class="source-line-no">7605</span><span id="line-7605"></span>
-<span class="source-line-no">7606</span><span id="line-7606">      Constructor&lt;? extends HRegion&gt; c =</span>
-<span class="source-line-no">7607</span><span id="line-7607">        regionClass.getConstructor(Path.class, WAL.class, FileSystem.class, Configuration.class,</span>
-<span class="source-line-no">7608</span><span id="line-7608">          RegionInfo.class, TableDescriptor.class, RegionServerServices.class);</span>
-<span class="source-line-no">7609</span><span id="line-7609"></span>
-<span class="source-line-no">7610</span><span id="line-7610">      return c.newInstance(tableDir, wal, fs, conf, regionInfo, htd, rsServices);</span>
-<span class="source-line-no">7611</span><span id="line-7611">    } catch (Throwable e) {</span>
-<span class="source-line-no">7612</span><span id="line-7612">      // todo: what should I throw here?</span>
-<span class="source-line-no">7613</span><span id="line-7613">      throw new IllegalStateException("Could not instantiate a region instance.", e);</span>
-<span class="source-line-no">7614</span><span id="line-7614">    }</span>
-<span class="source-line-no">7615</span><span id="line-7615">  }</span>
-<span class="source-line-no">7616</span><span id="line-7616"></span>
-<span class="source-line-no">7617</span><span id="line-7617">  /**</span>
-<span class="source-line-no">7618</span><span id="line-7618">   * Convenience method creating new HRegions. Used by createTable.</span>
-<span class="source-line-no">7619</span><span id="line-7619">   * @param info       Info for region to create.</span>
-<span class="source-line-no">7620</span><span id="line-7620">   * @param rootDir    Root directory for HBase instance</span>
-<span class="source-line-no">7621</span><span id="line-7621">   * @param wal        shared WAL</span>
-<span class="source-line-no">7622</span><span id="line-7622">   * @param initialize - true to initialize the region</span>
-<span class="source-line-no">7623</span><span id="line-7623">   * @return new HRegion</span>
-<span class="source-line-no">7624</span><span id="line-7624">   */</span>
-<span class="source-line-no">7625</span><span id="line-7625">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">7626</span><span id="line-7626">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal,</span>
-<span class="source-line-no">7627</span><span id="line-7627">    final boolean initialize) throws IOException {</span>
-<span class="source-line-no">7628</span><span id="line-7628">    return createHRegion(info, rootDir, conf, hTableDescriptor, wal, initialize, null);</span>
-<span class="source-line-no">7629</span><span id="line-7629">  }</span>
-<span class="source-line-no">7630</span><span id="line-7630"></span>
-<span class="source-line-no">7631</span><span id="line-7631">  /**</span>
-<span class="source-line-no">7632</span><span id="line-7632">   * Convenience method creating new HRegions. Used by createTable.</span>
-<span class="source-line-no">7633</span><span id="line-7633">   * @param info          Info for region to create.</span>
-<span class="source-line-no">7634</span><span id="line-7634">   * @param rootDir       Root directory for HBase instance</span>
-<span class="source-line-no">7635</span><span id="line-7635">   * @param wal           shared WAL</span>
-<span class="source-line-no">7636</span><span id="line-7636">   * @param initialize    - true to initialize the region</span>
-<span class="source-line-no">7637</span><span id="line-7637">   * @param rsRpcServices An interface we can request flushes against.</span>
-<span class="source-line-no">7638</span><span id="line-7638">   * @return new HRegion</span>
-<span class="source-line-no">7639</span><span id="line-7639">   */</span>
-<span class="source-line-no">7640</span><span id="line-7640">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">7641</span><span id="line-7641">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal,</span>
-<span class="source-line-no">7642</span><span id="line-7642">    final boolean initialize, RegionServerServices rsRpcServices) throws IOException {</span>
-<span class="source-line-no">7643</span><span id="line-7643">    LOG.info("creating " + info + ", tableDescriptor="</span>
-<span class="source-line-no">7644</span><span id="line-7644">      + (hTableDescriptor == null ? "null" : hTableDescriptor) + ", regionDir=" + rootDir);</span>
-<span class="source-line-no">7645</span><span id="line-7645">    createRegionDir(conf, info, rootDir);</span>
-<span class="source-line-no">7646</span><span id="line-7646">    FileSystem fs = rootDir.getFileSystem(conf);</span>
-<span class="source-line-no">7647</span><span id="line-7647">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
-<span class="source-line-no">7648</span><span id="line-7648">    HRegion region =</span>
-<span class="source-line-no">7649</span><span id="line-7649">      HRegion.newHRegion(tableDir, wal, fs, conf, info, hTableDescriptor, rsRpcServices);</span>
-<span class="source-line-no">7650</span><span id="line-7650">    if (initialize) {</span>
-<span class="source-line-no">7651</span><span id="line-7651">      region.initialize(null);</span>
-<span class="source-line-no">7652</span><span id="line-7652">    }</span>
-<span class="source-line-no">7653</span><span id="line-7653">    return region;</span>
-<span class="source-line-no">7654</span><span id="line-7654">  }</span>
-<span class="source-line-no">7655</span><span id="line-7655"></span>
-<span class="source-line-no">7656</span><span id="line-7656">  /**</span>
-<span class="source-line-no">7657</span><span id="line-7657">   * Create a region under the given table directory.</span>
-<span class="source-line-no">7658</span><span id="line-7658">   */</span>
-<span class="source-line-no">7659</span><span id="line-7659">  public static HRegion createHRegion(Configuration conf, RegionInfo regionInfo, FileSystem fs,</span>
-<span class="source-line-no">7660</span><span id="line-7660">    Path tableDir, TableDescriptor tableDesc) throws IOException {</span>
-<span class="source-line-no">7661</span><span id="line-7661">    LOG.info("Creating {}, tableDescriptor={}, under table dir {}", regionInfo, tableDesc,</span>
-<span class="source-line-no">7662</span><span id="line-7662">      tableDir);</span>
-<span class="source-line-no">7663</span><span id="line-7663">    HRegionFileSystem.createRegionOnFileSystem(conf, fs, tableDir, regionInfo);</span>
-<span class="source-line-no">7664</span><span id="line-7664">    HRegion region = HRegion.newHRegion(tableDir, null, fs, conf, regionInfo, tableDesc, null);</span>
-<span class="source-line-no">7665</span><span id="line-7665">    return region;</span>
-<span class="source-line-no">7666</span><span id="line-7666">  }</span>
-<span class="source-line-no">7667</span><span id="line-7667"></span>
-<span class="source-line-no">7668</span><span id="line-7668">  /**</span>
-<span class="source-line-no">7669</span><span id="line-7669">   * Create the region directory in the filesystem.</span>
-<span class="source-line-no">7670</span><span id="line-7670">   */</span>
-<span class="source-line-no">7671</span><span id="line-7671">  public static HRegionFileSystem createRegionDir(Configuration configuration, RegionInfo ri,</span>
-<span class="source-line-no">7672</span><span id="line-7672">    Path rootDir) throws IOException {</span>
-<span class="source-line-no">7673</span><span id="line-7673">    FileSystem fs = rootDir.getFileSystem(configuration);</span>
-<span class="source-line-no">7674</span><span id="line-7674">    Path tableDir = CommonFSUtils.getTableDir(rootDir, ri.getTable());</span>
-<span class="source-line-no">7675</span><span id="line-7675">    // If directory already exists, will log warning and keep going. Will try to create</span>
-<span class="source-line-no">7676</span><span id="line-7676">    // .regioninfo. If one exists, will overwrite.</span>
-<span class="source-line-no">7677</span><span id="line-7677">    return HRegionFileSystem.createRegionOnFileSystem(configuration, fs, tableDir, ri);</span>
-<span class="source-line-no">7678</span><span id="line-7678">  }</span>
-<span class="source-line-no">7679</span><span id="line-7679"></span>
-<span class="source-line-no">7680</span><span id="line-7680">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">7681</span><span id="line-7681">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal)</span>
-<span class="source-line-no">7682</span><span id="line-7682">    throws IOException {</span>
-<span class="source-line-no">7683</span><span id="line-7683">    return createHRegion(info, rootDir, conf, hTableDescriptor, wal, true);</span>
-<span class="source-line-no">7684</span><span id="line-7684">  }</span>
-<span class="source-line-no">7685</span><span id="line-7685"></span>
-<span class="source-line-no">7686</span><span id="line-7686">  /**</span>
-<span class="source-line-no">7687</span><span id="line-7687">   * Open a Region.</span>
-<span class="source-line-no">7688</span><span id="line-7688">   * @param info Info for region to be opened.</span>
-<span class="source-line-no">7689</span><span id="line-7689">   * @param wal  WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
-<span class="source-line-no">7690</span><span id="line-7690">   *             the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
-<span class="source-line-no">7691</span><span id="line-7691">   *             properly kept up. HRegionStore does this every time it opens a new region.</span>
-<span class="source-line-no">7692</span><span id="line-7692">   * @return new HRegion</span>
-<span class="source-line-no">7693</span><span id="line-7693">   */</span>
-<span class="source-line-no">7694</span><span id="line-7694">  public static HRegion openHRegion(final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
-<span class="source-line-no">7695</span><span id="line-7695">    final Configuration conf) throws IOException {</span>
-<span class="source-line-no">7696</span><span id="line-7696">    return openHRegion(info, htd, wal, conf, null, null);</span>
+<span class="source-line-no">7263</span><span id="line-7263">    public RowLockImpl(RowLockContext context, Lock lock) {</span>
+<span class="source-line-no">7264</span><span id="line-7264">      this.context = context;</span>
+<span class="source-line-no">7265</span><span id="line-7265">      this.lock = lock;</span>
+<span class="source-line-no">7266</span><span id="line-7266">    }</span>
+<span class="source-line-no">7267</span><span id="line-7267"></span>
+<span class="source-line-no">7268</span><span id="line-7268">    public Lock getLock() {</span>
+<span class="source-line-no">7269</span><span id="line-7269">      return lock;</span>
+<span class="source-line-no">7270</span><span id="line-7270">    }</span>
+<span class="source-line-no">7271</span><span id="line-7271"></span>
+<span class="source-line-no">7272</span><span id="line-7272">    public RowLockContext getContext() {</span>
+<span class="source-line-no">7273</span><span id="line-7273">      return context;</span>
+<span class="source-line-no">7274</span><span id="line-7274">    }</span>
+<span class="source-line-no">7275</span><span id="line-7275"></span>
+<span class="source-line-no">7276</span><span id="line-7276">    @Override</span>
+<span class="source-line-no">7277</span><span id="line-7277">    public void release() {</span>
+<span class="source-line-no">7278</span><span id="line-7278">      lock.unlock();</span>
+<span class="source-line-no">7279</span><span id="line-7279">      context.cleanUp();</span>
+<span class="source-line-no">7280</span><span id="line-7280">    }</span>
+<span class="source-line-no">7281</span><span id="line-7281"></span>
+<span class="source-line-no">7282</span><span id="line-7282">    @Override</span>
+<span class="source-line-no">7283</span><span id="line-7283">    public String toString() {</span>
+<span class="source-line-no">7284</span><span id="line-7284">      return "RowLockImpl{" + "context=" + context + ", lock=" + lock + '}';</span>
+<span class="source-line-no">7285</span><span id="line-7285">    }</span>
+<span class="source-line-no">7286</span><span id="line-7286">  }</span>
+<span class="source-line-no">7287</span><span id="line-7287"></span>
+<span class="source-line-no">7288</span><span id="line-7288">  /**</span>
+<span class="source-line-no">7289</span><span id="line-7289">   * Determines whether multiple column families are present Precondition: familyPaths is not null</span>
+<span class="source-line-no">7290</span><span id="line-7290">   * @param familyPaths List of (column family, hfilePath)</span>
+<span class="source-line-no">7291</span><span id="line-7291">   */</span>
+<span class="source-line-no">7292</span><span id="line-7292">  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {</span>
+<span class="source-line-no">7293</span><span id="line-7293">    boolean multipleFamilies = false;</span>
+<span class="source-line-no">7294</span><span id="line-7294">    byte[] family = null;</span>
+<span class="source-line-no">7295</span><span id="line-7295">    for (Pair&lt;byte[], String&gt; pair : familyPaths) {</span>
+<span class="source-line-no">7296</span><span id="line-7296">      byte[] fam = pair.getFirst();</span>
+<span class="source-line-no">7297</span><span id="line-7297">      if (family == null) {</span>
+<span class="source-line-no">7298</span><span id="line-7298">        family = fam;</span>
+<span class="source-line-no">7299</span><span id="line-7299">      } else if (!Bytes.equals(family, fam)) {</span>
+<span class="source-line-no">7300</span><span id="line-7300">        multipleFamilies = true;</span>
+<span class="source-line-no">7301</span><span id="line-7301">        break;</span>
+<span class="source-line-no">7302</span><span id="line-7302">      }</span>
+<span class="source-line-no">7303</span><span id="line-7303">    }</span>
+<span class="source-line-no">7304</span><span id="line-7304">    return multipleFamilies;</span>
+<span class="source-line-no">7305</span><span id="line-7305">  }</span>
+<span class="source-line-no">7306</span><span id="line-7306"></span>
+<span class="source-line-no">7307</span><span id="line-7307">  /**</span>
+<span class="source-line-no">7308</span><span id="line-7308">   * Attempts to atomically load a group of hfiles. This is critical for loading rows with multiple</span>
+<span class="source-line-no">7309</span><span id="line-7309">   * column families atomically.</span>
+<span class="source-line-no">7310</span><span id="line-7310">   * @param familyPaths      List of Pair&amp;lt;byte[] column family, String hfilePath&amp;gt;</span>
+<span class="source-line-no">7311</span><span id="line-7311">   * @param bulkLoadListener Internal hooks enabling massaging/preparation of a file about to be</span>
+<span class="source-line-no">7312</span><span id="line-7312">   *                         bulk loaded</span>
+<span class="source-line-no">7313</span><span id="line-7313">   * @return Map from family to List of store file paths if successful, null if failed recoverably</span>
+<span class="source-line-no">7314</span><span id="line-7314">   * @throws IOException if failed unrecoverably.</span>
+<span class="source-line-no">7315</span><span id="line-7315">   */</span>
+<span class="source-line-no">7316</span><span id="line-7316">  public Map&lt;byte[], List&lt;Path&gt;&gt; bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths,</span>
+<span class="source-line-no">7317</span><span id="line-7317">    boolean assignSeqId, BulkLoadListener bulkLoadListener) throws IOException {</span>
+<span class="source-line-no">7318</span><span id="line-7318">    return bulkLoadHFiles(familyPaths, assignSeqId, bulkLoadListener, false, null, true);</span>
+<span class="source-line-no">7319</span><span id="line-7319">  }</span>
+<span class="source-line-no">7320</span><span id="line-7320"></span>
+<span class="source-line-no">7321</span><span id="line-7321">  /**</span>
+<span class="source-line-no">7322</span><span id="line-7322">   * Listener class to enable callers of bulkLoadHFile() to perform any necessary pre/post</span>
+<span class="source-line-no">7323</span><span id="line-7323">   * processing of a given bulkload call</span>
+<span class="source-line-no">7324</span><span id="line-7324">   */</span>
+<span class="source-line-no">7325</span><span id="line-7325">  public interface BulkLoadListener {</span>
+<span class="source-line-no">7326</span><span id="line-7326">    /**</span>
+<span class="source-line-no">7327</span><span id="line-7327">     * Called before an HFile is actually loaded</span>
+<span class="source-line-no">7328</span><span id="line-7328">     * @param family  family being loaded to</span>
+<span class="source-line-no">7329</span><span id="line-7329">     * @param srcPath path of HFile</span>
+<span class="source-line-no">7330</span><span id="line-7330">     * @return final path to be used for actual loading</span>
+<span class="source-line-no">7331</span><span id="line-7331">     */</span>
+<span class="source-line-no">7332</span><span id="line-7332">    String prepareBulkLoad(byte[] family, String srcPath, boolean copyFile, String customStaging)</span>
+<span class="source-line-no">7333</span><span id="line-7333">      throws IOException;</span>
+<span class="source-line-no">7334</span><span id="line-7334"></span>
+<span class="source-line-no">7335</span><span id="line-7335">    /**</span>
+<span class="source-line-no">7336</span><span id="line-7336">     * Called after a successful HFile load</span>
+<span class="source-line-no">7337</span><span id="line-7337">     * @param family  family being loaded to</span>
+<span class="source-line-no">7338</span><span id="line-7338">     * @param srcPath path of HFile</span>
+<span class="source-line-no">7339</span><span id="line-7339">     */</span>
+<span class="source-line-no">7340</span><span id="line-7340">    void doneBulkLoad(byte[] family, String srcPath) throws IOException;</span>
+<span class="source-line-no">7341</span><span id="line-7341"></span>
+<span class="source-line-no">7342</span><span id="line-7342">    /**</span>
+<span class="source-line-no">7343</span><span id="line-7343">     * Called after a failed HFile load</span>
+<span class="source-line-no">7344</span><span id="line-7344">     * @param family  family being loaded to</span>
+<span class="source-line-no">7345</span><span id="line-7345">     * @param srcPath path of HFile</span>
+<span class="source-line-no">7346</span><span id="line-7346">     */</span>
+<span class="source-line-no">7347</span><span id="line-7347">    void failedBulkLoad(byte[] family, String srcPath) throws IOException;</span>
+<span class="source-line-no">7348</span><span id="line-7348">  }</span>
+<span class="source-line-no">7349</span><span id="line-7349"></span>
+<span class="source-line-no">7350</span><span id="line-7350">  /**</span>
+<span class="source-line-no">7351</span><span id="line-7351">   * Attempts to atomically load a group of hfiles. This is critical for loading rows with multiple</span>
+<span class="source-line-no">7352</span><span id="line-7352">   * column families atomically.</span>
+<span class="source-line-no">7353</span><span id="line-7353">   * @param familyPaths      List of Pair&amp;lt;byte[] column family, String hfilePath&amp;gt;</span>
+<span class="source-line-no">7354</span><span id="line-7354">   * @param bulkLoadListener Internal hooks enabling massaging/preparation of a file about to be</span>
+<span class="source-line-no">7355</span><span id="line-7355">   *                         bulk loaded</span>
+<span class="source-line-no">7356</span><span id="line-7356">   * @param copyFile         always copy hfiles if true</span>
+<span class="source-line-no">7357</span><span id="line-7357">   * @param clusterIds       ids from clusters that had already handled the given bulkload event.</span>
+<span class="source-line-no">7358</span><span id="line-7358">   * @return Map from family to List of store file paths if successful, null if failed recoverably</span>
+<span class="source-line-no">7359</span><span id="line-7359">   * @throws IOException if failed unrecoverably.</span>
+<span class="source-line-no">7360</span><span id="line-7360">   */</span>
+<span class="source-line-no">7361</span><span id="line-7361">  public Map&lt;byte[], List&lt;Path&gt;&gt; bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths,</span>
+<span class="source-line-no">7362</span><span id="line-7362">    boolean assignSeqId, BulkLoadListener bulkLoadListener, boolean copyFile,</span>
+<span class="source-line-no">7363</span><span id="line-7363">    List&lt;String&gt; clusterIds, boolean replicate) throws IOException {</span>
+<span class="source-line-no">7364</span><span id="line-7364">    long seqId = -1;</span>
+<span class="source-line-no">7365</span><span id="line-7365">    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">7366</span><span id="line-7366">    Map&lt;String, Long&gt; storeFilesSizes = new HashMap&lt;&gt;();</span>
+<span class="source-line-no">7367</span><span id="line-7367">    Preconditions.checkNotNull(familyPaths);</span>
+<span class="source-line-no">7368</span><span id="line-7368">    // we need writeLock for multi-family bulk load</span>
+<span class="source-line-no">7369</span><span id="line-7369">    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));</span>
+<span class="source-line-no">7370</span><span id="line-7370">    boolean isSuccessful = false;</span>
+<span class="source-line-no">7371</span><span id="line-7371">    try {</span>
+<span class="source-line-no">7372</span><span id="line-7372">      this.writeRequestsCount.increment();</span>
+<span class="source-line-no">7373</span><span id="line-7373"></span>
+<span class="source-line-no">7374</span><span id="line-7374">      // There possibly was a split that happened between when the split keys</span>
+<span class="source-line-no">7375</span><span id="line-7375">      // were gathered and before the HRegion's write lock was taken. We need</span>
+<span class="source-line-no">7376</span><span id="line-7376">      // to validate the HFile region before attempting to bulk load all of them</span>
+<span class="source-line-no">7377</span><span id="line-7377">      IOException ioException = null;</span>
+<span class="source-line-no">7378</span><span id="line-7378">      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">7379</span><span id="line-7379">      for (Pair&lt;byte[], String&gt; p : familyPaths) {</span>
+<span class="source-line-no">7380</span><span id="line-7380">        byte[] familyName = p.getFirst();</span>
+<span class="source-line-no">7381</span><span id="line-7381">        String path = p.getSecond();</span>
+<span class="source-line-no">7382</span><span id="line-7382"></span>
+<span class="source-line-no">7383</span><span id="line-7383">        HStore store = getStore(familyName);</span>
+<span class="source-line-no">7384</span><span id="line-7384">        if (store == null) {</span>
+<span class="source-line-no">7385</span><span id="line-7385">          ioException = new org.apache.hadoop.hbase.DoNotRetryIOException(</span>
+<span class="source-line-no">7386</span><span id="line-7386">            "No such column family " + Bytes.toStringBinary(familyName));</span>
+<span class="source-line-no">7387</span><span id="line-7387">        } else {</span>
+<span class="source-line-no">7388</span><span id="line-7388">          try {</span>
+<span class="source-line-no">7389</span><span id="line-7389">            store.assertBulkLoadHFileOk(new Path(path));</span>
+<span class="source-line-no">7390</span><span id="line-7390">          } catch (WrongRegionException wre) {</span>
+<span class="source-line-no">7391</span><span id="line-7391">            // recoverable (file doesn't fit in region)</span>
+<span class="source-line-no">7392</span><span id="line-7392">            failures.add(p);</span>
+<span class="source-line-no">7393</span><span id="line-7393">          } catch (IOException ioe) {</span>
+<span class="source-line-no">7394</span><span id="line-7394">            // unrecoverable (hdfs problem)</span>
+<span class="source-line-no">7395</span><span id="line-7395">            ioException = ioe;</span>
+<span class="source-line-no">7396</span><span id="line-7396">          }</span>
+<span class="source-line-no">7397</span><span id="line-7397">        }</span>
+<span class="source-line-no">7398</span><span id="line-7398"></span>
+<span class="source-line-no">7399</span><span id="line-7399">        // validation failed because of some sort of IO problem.</span>
+<span class="source-line-no">7400</span><span id="line-7400">        if (ioException != null) {</span>
+<span class="source-line-no">7401</span><span id="line-7401">          LOG.error("There was IO error when checking if the bulk load is ok in region {}.", this,</span>
+<span class="source-line-no">7402</span><span id="line-7402">            ioException);</span>
+<span class="source-line-no">7403</span><span id="line-7403">          throw ioException;</span>
+<span class="source-line-no">7404</span><span id="line-7404">        }</span>
+<span class="source-line-no">7405</span><span id="line-7405">      }</span>
+<span class="source-line-no">7406</span><span id="line-7406">      // validation failed, bail out before doing anything permanent.</span>
+<span class="source-line-no">7407</span><span id="line-7407">      if (failures.size() != 0) {</span>
+<span class="source-line-no">7408</span><span id="line-7408">        StringBuilder list = new StringBuilder();</span>
+<span class="source-line-no">7409</span><span id="line-7409">        for (Pair&lt;byte[], String&gt; p : failures) {</span>
+<span class="source-line-no">7410</span><span id="line-7410">          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")</span>
+<span class="source-line-no">7411</span><span id="line-7411">            .append(p.getSecond());</span>
+<span class="source-line-no">7412</span><span id="line-7412">        }</span>
+<span class="source-line-no">7413</span><span id="line-7413">        // problem when validating</span>
+<span class="source-line-no">7414</span><span id="line-7414">        LOG.warn("There was a recoverable bulk load failure likely due to a split. These (family,"</span>
+<span class="source-line-no">7415</span><span id="line-7415">          + " HFile) pairs were not loaded: {}, in region {}", list.toString(), this);</span>
+<span class="source-line-no">7416</span><span id="line-7416">        return null;</span>
+<span class="source-line-no">7417</span><span id="line-7417">      }</span>
+<span class="source-line-no">7418</span><span id="line-7418"></span>
+<span class="source-line-no">7419</span><span id="line-7419">      // We need to assign a sequential ID that's in between two memstores in order to preserve</span>
+<span class="source-line-no">7420</span><span id="line-7420">      // the guarantee that all the edits lower than the highest sequential ID from all the</span>
+<span class="source-line-no">7421</span><span id="line-7421">      // HFiles are flushed on disk. See HBASE-10958. The sequence id returned when we flush is</span>
+<span class="source-line-no">7422</span><span id="line-7422">      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is</span>
+<span class="source-line-no">7423</span><span id="line-7423">      // a sequence id that we can be sure is beyond the last hfile written).</span>
+<span class="source-line-no">7424</span><span id="line-7424">      if (assignSeqId) {</span>
+<span class="source-line-no">7425</span><span id="line-7425">        FlushResult fs = flushcache(true, false, FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">7426</span><span id="line-7426">        if (fs.isFlushSucceeded()) {</span>
+<span class="source-line-no">7427</span><span id="line-7427">          seqId = ((FlushResultImpl) fs).flushSequenceId;</span>
+<span class="source-line-no">7428</span><span id="line-7428">        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {</span>
+<span class="source-line-no">7429</span><span id="line-7429">          seqId = ((FlushResultImpl) fs).flushSequenceId;</span>
+<span class="source-line-no">7430</span><span id="line-7430">        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH) {</span>
+<span class="source-line-no">7431</span><span id="line-7431">          // CANNOT_FLUSH may mean that a flush is already on-going</span>
+<span class="source-line-no">7432</span><span id="line-7432">          // we need to wait for that flush to complete</span>
+<span class="source-line-no">7433</span><span id="line-7433">          waitForFlushes();</span>
+<span class="source-line-no">7434</span><span id="line-7434">        } else {</span>
+<span class="source-line-no">7435</span><span id="line-7435">          throw new IOException("Could not bulk load with an assigned sequential ID because the "</span>
+<span class="source-line-no">7436</span><span id="line-7436">            + "flush didn't run. Reason for not flushing: " + ((FlushResultImpl) fs).failureReason);</span>
+<span class="source-line-no">7437</span><span id="line-7437">        }</span>
+<span class="source-line-no">7438</span><span id="line-7438">      }</span>
+<span class="source-line-no">7439</span><span id="line-7439"></span>
+<span class="source-line-no">7440</span><span id="line-7440">      Map&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; familyWithFinalPath =</span>
+<span class="source-line-no">7441</span><span id="line-7441">        new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">7442</span><span id="line-7442">      for (Pair&lt;byte[], String&gt; p : familyPaths) {</span>
+<span class="source-line-no">7443</span><span id="line-7443">        byte[] familyName = p.getFirst();</span>
+<span class="source-line-no">7444</span><span id="line-7444">        String path = p.getSecond();</span>
+<span class="source-line-no">7445</span><span id="line-7445">        HStore store = getStore(familyName);</span>
+<span class="source-line-no">7446</span><span id="line-7446">        if (!familyWithFinalPath.containsKey(familyName)) {</span>
+<span class="source-line-no">7447</span><span id="line-7447">          familyWithFinalPath.put(familyName, new ArrayList&lt;&gt;());</span>
+<span class="source-line-no">7448</span><span id="line-7448">        }</span>
+<span class="source-line-no">7449</span><span id="line-7449">        List&lt;Pair&lt;Path, Path&gt;&gt; lst = familyWithFinalPath.get(familyName);</span>
+<span class="source-line-no">7450</span><span id="line-7450">        String finalPath = path;</span>
+<span class="source-line-no">7451</span><span id="line-7451">        try {</span>
+<span class="source-line-no">7452</span><span id="line-7452">          boolean reqTmp = store.storeEngine.requireWritingToTmpDirFirst();</span>
+<span class="source-line-no">7453</span><span id="line-7453">          if (bulkLoadListener != null) {</span>
+<span class="source-line-no">7454</span><span id="line-7454">            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path, copyFile,</span>
+<span class="source-line-no">7455</span><span id="line-7455">              reqTmp ? null : fs.getRegionDir().toString());</span>
+<span class="source-line-no">7456</span><span id="line-7456">          }</span>
+<span class="source-line-no">7457</span><span id="line-7457">          Pair&lt;Path, Path&gt; pair = null;</span>
+<span class="source-line-no">7458</span><span id="line-7458">          if (reqTmp || !StoreFileInfo.isHFile(finalPath)) {</span>
+<span class="source-line-no">7459</span><span id="line-7459">            pair = store.preBulkLoadHFile(finalPath, seqId);</span>
+<span class="source-line-no">7460</span><span id="line-7460">          } else {</span>
+<span class="source-line-no">7461</span><span id="line-7461">            Path livePath = new Path(finalPath);</span>
+<span class="source-line-no">7462</span><span id="line-7462">            pair = new Pair&lt;&gt;(livePath, livePath);</span>
+<span class="source-line-no">7463</span><span id="line-7463">          }</span>
+<span class="source-line-no">7464</span><span id="line-7464">          lst.add(pair);</span>
+<span class="source-line-no">7465</span><span id="line-7465">        } catch (IOException ioe) {</span>
+<span class="source-line-no">7466</span><span id="line-7466">          // A failure here can cause an atomicity violation that we currently</span>
+<span class="source-line-no">7467</span><span id="line-7467">          // cannot recover from since it is likely a failed HDFS operation.</span>
+<span class="source-line-no">7468</span><span id="line-7468"></span>
+<span class="source-line-no">7469</span><span id="line-7469">          LOG.error("There was a partial failure due to IO when attempting to" + " load "</span>
+<span class="source-line-no">7470</span><span id="line-7470">            + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);</span>
+<span class="source-line-no">7471</span><span id="line-7471">          if (bulkLoadListener != null) {</span>
+<span class="source-line-no">7472</span><span id="line-7472">            try {</span>
+<span class="source-line-no">7473</span><span id="line-7473">              bulkLoadListener.failedBulkLoad(familyName, finalPath);</span>
+<span class="source-line-no">7474</span><span id="line-7474">            } catch (Exception ex) {</span>
+<span class="source-line-no">7475</span><span id="line-7475">              LOG.error("Error while calling failedBulkLoad for family "</span>
+<span class="source-line-no">7476</span><span id="line-7476">                + Bytes.toString(familyName) + " with path " + path, ex);</span>
+<span class="source-line-no">7477</span><span id="line-7477">            }</span>
+<span class="source-line-no">7478</span><span id="line-7478">          }</span>
+<span class="source-line-no">7479</span><span id="line-7479">          throw ioe;</span>
+<span class="source-line-no">7480</span><span id="line-7480">        }</span>
+<span class="source-line-no">7481</span><span id="line-7481">      }</span>
+<span class="source-line-no">7482</span><span id="line-7482"></span>
+<span class="source-line-no">7483</span><span id="line-7483">      if (this.getCoprocessorHost() != null) {</span>
+<span class="source-line-no">7484</span><span id="line-7484">        for (Map.Entry&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; entry : familyWithFinalPath.entrySet()) {</span>
+<span class="source-line-no">7485</span><span id="line-7485">          this.getCoprocessorHost().preCommitStoreFile(entry.getKey(), entry.getValue());</span>
+<span class="source-line-no">7486</span><span id="line-7486">        }</span>
+<span class="source-line-no">7487</span><span id="line-7487">      }</span>
+<span class="source-line-no">7488</span><span id="line-7488">      for (Map.Entry&lt;byte[], List&lt;Pair&lt;Path, Path&gt;&gt;&gt; entry : familyWithFinalPath.entrySet()) {</span>
+<span class="source-line-no">7489</span><span id="line-7489">        byte[] familyName = entry.getKey();</span>
+<span class="source-line-no">7490</span><span id="line-7490">        for (Pair&lt;Path, Path&gt; p : entry.getValue()) {</span>
+<span class="source-line-no">7491</span><span id="line-7491">          String path = p.getFirst().toString();</span>
+<span class="source-line-no">7492</span><span id="line-7492">          Path commitedStoreFile = p.getSecond();</span>
+<span class="source-line-no">7493</span><span id="line-7493">          HStore store = getStore(familyName);</span>
+<span class="source-line-no">7494</span><span id="line-7494">          try {</span>
+<span class="source-line-no">7495</span><span id="line-7495">            store.bulkLoadHFile(familyName, path, commitedStoreFile);</span>
+<span class="source-line-no">7496</span><span id="line-7496">            // Note the size of the store file</span>
+<span class="source-line-no">7497</span><span id="line-7497">            try {</span>
+<span class="source-line-no">7498</span><span id="line-7498">              FileSystem fs = commitedStoreFile.getFileSystem(baseConf);</span>
+<span class="source-line-no">7499</span><span id="line-7499">              storeFilesSizes.put(commitedStoreFile.getName(),</span>
+<span class="source-line-no">7500</span><span id="line-7500">                fs.getFileStatus(commitedStoreFile).getLen());</span>
+<span class="source-line-no">7501</span><span id="line-7501">            } catch (IOException e) {</span>
+<span class="source-line-no">7502</span><span id="line-7502">              LOG.warn("Failed to find the size of hfile " + commitedStoreFile, e);</span>
+<span class="source-line-no">7503</span><span id="line-7503">              storeFilesSizes.put(commitedStoreFile.getName(), 0L);</span>
+<span class="source-line-no">7504</span><span id="line-7504">            }</span>
+<span class="source-line-no">7505</span><span id="line-7505"></span>
+<span class="source-line-no">7506</span><span id="line-7506">            if (storeFiles.containsKey(familyName)) {</span>
+<span class="source-line-no">7507</span><span id="line-7507">              storeFiles.get(familyName).add(commitedStoreFile);</span>
+<span class="source-line-no">7508</span><span id="line-7508">            } else {</span>
+<span class="source-line-no">7509</span><span id="line-7509">              List&lt;Path&gt; storeFileNames = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">7510</span><span id="line-7510">              storeFileNames.add(commitedStoreFile);</span>
+<span class="source-line-no">7511</span><span id="line-7511">              storeFiles.put(familyName, storeFileNames);</span>
+<span class="source-line-no">7512</span><span id="line-7512">            }</span>
+<span class="source-line-no">7513</span><span id="line-7513">            if (bulkLoadListener != null) {</span>
+<span class="source-line-no">7514</span><span id="line-7514">              bulkLoadListener.doneBulkLoad(familyName, path);</span>
+<span class="source-line-no">7515</span><span id="line-7515">            }</span>
+<span class="source-line-no">7516</span><span id="line-7516">          } catch (IOException ioe) {</span>
+<span class="source-line-no">7517</span><span id="line-7517">            // A failure here can cause an atomicity violation that we currently</span>
+<span class="source-line-no">7518</span><span id="line-7518">            // cannot recover from since it is likely a failed HDFS operation.</span>
+<span class="source-line-no">7519</span><span id="line-7519"></span>
+<span class="source-line-no">7520</span><span id="line-7520">            // TODO Need a better story for reverting partial failures due to HDFS.</span>
+<span class="source-line-no">7521</span><span id="line-7521">            LOG.error("There was a partial failure due to IO when attempting to" + " load "</span>
+<span class="source-line-no">7522</span><span id="line-7522">              + Bytes.toString(familyName) + " : " + p.getSecond(), ioe);</span>
+<span class="source-line-no">7523</span><span id="line-7523">            if (bulkLoadListener != null) {</span>
+<span class="source-line-no">7524</span><span id="line-7524">              try {</span>
+<span class="source-line-no">7525</span><span id="line-7525">                bulkLoadListener.failedBulkLoad(familyName, path);</span>
+<span class="source-line-no">7526</span><span id="line-7526">              } catch (Exception ex) {</span>
+<span class="source-line-no">7527</span><span id="line-7527">                LOG.error("Error while calling failedBulkLoad for family "</span>
+<span class="source-line-no">7528</span><span id="line-7528">                  + Bytes.toString(familyName) + " with path " + path, ex);</span>
+<span class="source-line-no">7529</span><span id="line-7529">              }</span>
+<span class="source-line-no">7530</span><span id="line-7530">            }</span>
+<span class="source-line-no">7531</span><span id="line-7531">            throw ioe;</span>
+<span class="source-line-no">7532</span><span id="line-7532">          }</span>
+<span class="source-line-no">7533</span><span id="line-7533">        }</span>
+<span class="source-line-no">7534</span><span id="line-7534">      }</span>
+<span class="source-line-no">7535</span><span id="line-7535"></span>
+<span class="source-line-no">7536</span><span id="line-7536">      isSuccessful = true;</span>
+<span class="source-line-no">7537</span><span id="line-7537">      if (conf.getBoolean(COMPACTION_AFTER_BULKLOAD_ENABLE, false)) {</span>
+<span class="source-line-no">7538</span><span id="line-7538">        // request compaction</span>
+<span class="source-line-no">7539</span><span id="line-7539">        familyWithFinalPath.keySet().forEach(family -&gt; {</span>
+<span class="source-line-no">7540</span><span id="line-7540">          HStore store = getStore(family);</span>
+<span class="source-line-no">7541</span><span id="line-7541">          try {</span>
+<span class="source-line-no">7542</span><span id="line-7542">            if (this.rsServices != null &amp;&amp; store.needsCompaction()) {</span>
+<span class="source-line-no">7543</span><span id="line-7543">              this.rsServices.getCompactionRequestor().requestSystemCompaction(this, store,</span>
+<span class="source-line-no">7544</span><span id="line-7544">                "bulkload hfiles request compaction", true);</span>
+<span class="source-line-no">7545</span><span id="line-7545">              LOG.info("Request compaction for region {} family {} after bulk load",</span>
+<span class="source-line-no">7546</span><span id="line-7546">                this.getRegionInfo().getEncodedName(), store.getColumnFamilyName());</span>
+<span class="source-line-no">7547</span><span id="line-7547">            }</span>
+<span class="source-line-no">7548</span><span id="line-7548">          } catch (IOException e) {</span>
+<span class="source-line-no">7549</span><span id="line-7549">            LOG.error("bulkload hfiles request compaction error ", e);</span>
+<span class="source-line-no">7550</span><span id="line-7550">          }</span>
+<span class="source-line-no">7551</span><span id="line-7551">        });</span>
+<span class="source-line-no">7552</span><span id="line-7552">      }</span>
+<span class="source-line-no">7553</span><span id="line-7553">    } finally {</span>
+<span class="source-line-no">7554</span><span id="line-7554">      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {</span>
+<span class="source-line-no">7555</span><span id="line-7555">        // Write a bulk load event for hfiles that are loaded</span>
+<span class="source-line-no">7556</span><span id="line-7556">        try {</span>
+<span class="source-line-no">7557</span><span id="line-7557">          WALProtos.BulkLoadDescriptor loadDescriptor =</span>
+<span class="source-line-no">7558</span><span id="line-7558">            ProtobufUtil.toBulkLoadDescriptor(this.getRegionInfo().getTable(),</span>
+<span class="source-line-no">7559</span><span id="line-7559">              UnsafeByteOperations.unsafeWrap(this.getRegionInfo().getEncodedNameAsBytes()),</span>
+<span class="source-line-no">7560</span><span id="line-7560">              storeFiles, storeFilesSizes, seqId, clusterIds, replicate);</span>
+<span class="source-line-no">7561</span><span id="line-7561">          WALUtil.writeBulkLoadMarkerAndSync(this.wal, this.getReplicationScope(), getRegionInfo(),</span>
+<span class="source-line-no">7562</span><span id="line-7562">            loadDescriptor, mvcc, regionReplicationSink.orElse(null));</span>
+<span class="source-line-no">7563</span><span id="line-7563">        } catch (IOException ioe) {</span>
+<span class="source-line-no">7564</span><span id="line-7564">          if (this.rsServices != null) {</span>
+<span class="source-line-no">7565</span><span id="line-7565">            // Have to abort region server because some hfiles has been loaded but we can't write</span>
+<span class="source-line-no">7566</span><span id="line-7566">            // the event into WAL</span>
+<span class="source-line-no">7567</span><span id="line-7567">            isSuccessful = false;</span>
+<span class="source-line-no">7568</span><span id="line-7568">            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);</span>
+<span class="source-line-no">7569</span><span id="line-7569">          }</span>
+<span class="source-line-no">7570</span><span id="line-7570">        }</span>
+<span class="source-line-no">7571</span><span id="line-7571">      }</span>
+<span class="source-line-no">7572</span><span id="line-7572"></span>
+<span class="source-line-no">7573</span><span id="line-7573">      closeBulkRegionOperation();</span>
+<span class="source-line-no">7574</span><span id="line-7574">    }</span>
+<span class="source-line-no">7575</span><span id="line-7575">    return isSuccessful ? storeFiles : null;</span>
+<span class="source-line-no">7576</span><span id="line-7576">  }</span>
+<span class="source-line-no">7577</span><span id="line-7577"></span>
+<span class="source-line-no">7578</span><span id="line-7578">  @Override</span>
+<span class="source-line-no">7579</span><span id="line-7579">  public boolean equals(Object o) {</span>
+<span class="source-line-no">7580</span><span id="line-7580">    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),</span>
+<span class="source-line-no">7581</span><span id="line-7581">      ((HRegion) o).getRegionInfo().getRegionName());</span>
+<span class="source-line-no">7582</span><span id="line-7582">  }</span>
+<span class="source-line-no">7583</span><span id="line-7583"></span>
+<span class="source-line-no">7584</span><span id="line-7584">  @Override</span>
+<span class="source-line-no">7585</span><span id="line-7585">  public int hashCode() {</span>
+<span class="source-line-no">7586</span><span id="line-7586">    return Bytes.hashCode(getRegionInfo().getRegionName());</span>
+<span class="source-line-no">7587</span><span id="line-7587">  }</span>
+<span class="source-line-no">7588</span><span id="line-7588"></span>
+<span class="source-line-no">7589</span><span id="line-7589">  @Override</span>
+<span class="source-line-no">7590</span><span id="line-7590">  public String toString() {</span>
+<span class="source-line-no">7591</span><span id="line-7591">    return getRegionInfo().getRegionNameAsString();</span>
+<span class="source-line-no">7592</span><span id="line-7592">  }</span>
+<span class="source-line-no">7593</span><span id="line-7593"></span>
+<span class="source-line-no">7594</span><span id="line-7594">  // Utility methods</span>
+<span class="source-line-no">7595</span><span id="line-7595">  /**</span>
+<span class="source-line-no">7596</span><span id="line-7596">   * A utility method to create new instances of HRegion based on the {@link HConstants#REGION_IMPL}</span>
+<span class="source-line-no">7597</span><span id="line-7597">   * configuration property.</span>
+<span class="source-line-no">7598</span><span id="line-7598">   * @param tableDir   qualified path of directory where region should be located, usually the table</span>
+<span class="source-line-no">7599</span><span id="line-7599">   *                   directory.</span>
+<span class="source-line-no">7600</span><span id="line-7600">   * @param wal        The WAL is the outbound log for any updates to the HRegion The wal file is a</span>
+<span class="source-line-no">7601</span><span id="line-7601">   *                   logfile from the previous execution that's custom-computed for this HRegion.</span>
+<span class="source-line-no">7602</span><span id="line-7602">   *                   The HRegionServer computes and sorts the appropriate wal info for this</span>
+<span class="source-line-no">7603</span><span id="line-7603">   *                   HRegion. If there is a previous file (implying that the HRegion has been</span>
+<span class="source-line-no">7604</span><span id="line-7604">   *                   written-to before), then read it from the supplied path.</span>
+<span class="source-line-no">7605</span><span id="line-7605">   * @param fs         is the filesystem.</span>
+<span class="source-line-no">7606</span><span id="line-7606">   * @param conf       is global configuration settings.</span>
+<span class="source-line-no">7607</span><span id="line-7607">   * @param regionInfo - RegionInfo that describes the region is new), then read them from the</span>
+<span class="source-line-no">7608</span><span id="line-7608">   *                   supplied path.</span>
+<span class="source-line-no">7609</span><span id="line-7609">   * @param htd        the table descriptor</span>
+<span class="source-line-no">7610</span><span id="line-7610">   * @return the new instance</span>
+<span class="source-line-no">7611</span><span id="line-7611">   */</span>
+<span class="source-line-no">7612</span><span id="line-7612">  public static HRegion newHRegion(Path tableDir, WAL wal, FileSystem fs, Configuration conf,</span>
+<span class="source-line-no">7613</span><span id="line-7613">    RegionInfo regionInfo, final TableDescriptor htd, RegionServerServices rsServices) {</span>
+<span class="source-line-no">7614</span><span id="line-7614">    try {</span>
+<span class="source-line-no">7615</span><span id="line-7615">      @SuppressWarnings("unchecked")</span>
+<span class="source-line-no">7616</span><span id="line-7616">      Class&lt;? extends HRegion&gt; regionClass =</span>
+<span class="source-line-no">7617</span><span id="line-7617">        (Class&lt;? extends HRegion&gt;) conf.getClass(HConstants.REGION_IMPL, HRegion.class);</span>
+<span class="source-line-no">7618</span><span id="line-7618"></span>
+<span class="source-line-no">7619</span><span id="line-7619">      Constructor&lt;? extends HRegion&gt; c =</span>
+<span class="source-line-no">7620</span><span id="line-7620">        regionClass.getConstructor(Path.class, WAL.class, FileSystem.class, Configuration.class,</span>
+<span class="source-line-no">7621</span><span id="line-7621">          RegionInfo.class, TableDescriptor.class, RegionServerServices.class);</span>
+<span class="source-line-no">7622</span><span id="line-7622"></span>
+<span class="source-line-no">7623</span><span id="line-7623">      return c.newInstance(tableDir, wal, fs, conf, regionInfo, htd, rsServices);</span>
+<span class="source-line-no">7624</span><span id="line-7624">    } catch (Throwable e) {</span>
+<span class="source-line-no">7625</span><span id="line-7625">      // todo: what should I throw here?</span>
+<span class="source-line-no">7626</span><span id="line-7626">      throw new IllegalStateException("Could not instantiate a region instance.", e);</span>
+<span class="source-line-no">7627</span><span id="line-7627">    }</span>
+<span class="source-line-no">7628</span><span id="line-7628">  }</span>
+<span class="source-line-no">7629</span><span id="line-7629"></span>
+<span class="source-line-no">7630</span><span id="line-7630">  /**</span>
+<span class="source-line-no">7631</span><span id="line-7631">   * Convenience method creating new HRegions. Used by createTable.</span>
+<span class="source-line-no">7632</span><span id="line-7632">   * @param info       Info for region to create.</span>
+<span class="source-line-no">7633</span><span id="line-7633">   * @param rootDir    Root directory for HBase instance</span>
+<span class="source-line-no">7634</span><span id="line-7634">   * @param wal        shared WAL</span>
+<span class="source-line-no">7635</span><span id="line-7635">   * @param initialize - true to initialize the region</span>
+<span class="source-line-no">7636</span><span id="line-7636">   * @return new HRegion</span>
+<span class="source-line-no">7637</span><span id="line-7637">   */</span>
+<span class="source-line-no">7638</span><span id="line-7638">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">7639</span><span id="line-7639">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal,</span>
+<span class="source-line-no">7640</span><span id="line-7640">    final boolean initialize) throws IOException {</span>
+<span class="source-line-no">7641</span><span id="line-7641">    return createHRegion(info, rootDir, conf, hTableDescriptor, wal, initialize, null);</span>
+<span class="source-line-no">7642</span><span id="line-7642">  }</span>
+<span class="source-line-no">7643</span><span id="line-7643"></span>
+<span class="source-line-no">7644</span><span id="line-7644">  /**</span>
+<span class="source-line-no">7645</span><span id="line-7645">   * Convenience method creating new HRegions. Used by createTable.</span>
+<span class="source-line-no">7646</span><span id="line-7646">   * @param info          Info for region to create.</span>
+<span class="source-line-no">7647</span><span id="line-7647">   * @param rootDir       Root directory for HBase instance</span>
+<span class="source-line-no">7648</span><span id="line-7648">   * @param wal           shared WAL</span>
+<span class="source-line-no">7649</span><span id="line-7649">   * @param initialize    - true to initialize the region</span>
+<span class="source-line-no">7650</span><span id="line-7650">   * @param rsRpcServices An interface we can request flushes against.</span>
+<span class="source-line-no">7651</span><span id="line-7651">   * @return new HRegion</span>
+<span class="source-line-no">7652</span><span id="line-7652">   */</span>
+<span class="source-line-no">7653</span><span id="line-7653">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">7654</span><span id="line-7654">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal,</span>
+<span class="source-line-no">7655</span><span id="line-7655">    final boolean initialize, RegionServerServices rsRpcServices) throws IOException {</span>
+<span class="source-line-no">7656</span><span id="line-7656">    LOG.info("creating " + info + ", tableDescriptor="</span>
+<span class="source-line-no">7657</span><span id="line-7657">      + (hTableDescriptor == null ? "null" : hTableDescriptor) + ", regionDir=" + rootDir);</span>
+<span class="source-line-no">7658</span><span id="line-7658">    createRegionDir(conf, info, rootDir);</span>
+<span class="source-line-no">7659</span><span id="line-7659">    FileSystem fs = rootDir.getFileSystem(conf);</span>
+<span class="source-line-no">7660</span><span id="line-7660">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
+<span class="source-line-no">7661</span><span id="line-7661">    HRegion region =</span>
+<span class="source-line-no">7662</span><span id="line-7662">      HRegion.newHRegion(tableDir, wal, fs, conf, info, hTableDescriptor, rsRpcServices);</span>
+<span class="source-line-no">7663</span><span id="line-7663">    if (initialize) {</span>
+<span class="source-line-no">7664</span><span id="line-7664">      region.initialize(null);</span>
+<span class="source-line-no">7665</span><span id="line-7665">    }</span>
+<span class="source-line-no">7666</span><span id="line-7666">    return region;</span>
+<span class="source-line-no">7667</span><span id="line-7667">  }</span>
+<span class="source-line-no">7668</span><span id="line-7668"></span>
+<span class="source-line-no">7669</span><span id="line-7669">  /**</span>
+<span class="source-line-no">7670</span><span id="line-7670">   * Create a region under the given table directory.</span>
+<span class="source-line-no">7671</span><span id="line-7671">   */</span>
+<span class="source-line-no">7672</span><span id="line-7672">  public static HRegion createHRegion(Configuration conf, RegionInfo regionInfo, FileSystem fs,</span>
+<span class="source-line-no">7673</span><span id="line-7673">    Path tableDir, TableDescriptor tableDesc) throws IOException {</span>
+<span class="source-line-no">7674</span><span id="line-7674">    LOG.info("Creating {}, tableDescriptor={}, under table dir {}", regionInfo, tableDesc,</span>
+<span class="source-line-no">7675</span><span id="line-7675">      tableDir);</span>
+<span class="source-line-no">7676</span><span id="line-7676">    HRegionFileSystem.createRegionOnFileSystem(conf, fs, tableDir, regionInfo);</span>
+<span class="source-line-no">7677</span><span id="line-7677">    HRegion region = HRegion.newHRegion(tableDir, null, fs, conf, regionInfo, tableDesc, null);</span>
+<span class="source-line-no">7678</span><span id="line-7678">    return region;</span>
+<span class="source-line-no">7679</span><span id="line-7679">  }</span>
+<span class="source-line-no">7680</span><span id="line-7680"></span>
+<span class="source-line-no">7681</span><span id="line-7681">  /**</span>
+<span class="source-line-no">7682</span><span id="line-7682">   * Create the region directory in the filesystem.</span>
+<span class="source-line-no">7683</span><span id="line-7683">   */</span>
+<span class="source-line-no">7684</span><span id="line-7684">  public static HRegionFileSystem createRegionDir(Configuration configuration, RegionInfo ri,</span>
+<span class="source-line-no">7685</span><span id="line-7685">    Path rootDir) throws IOException {</span>
+<span class="source-line-no">7686</span><span id="line-7686">    FileSystem fs = rootDir.getFileSystem(configuration);</span>
+<span class="source-line-no">7687</span><span id="line-7687">    Path tableDir = CommonFSUtils.getTableDir(rootDir, ri.getTable());</span>
+<span class="source-line-no">7688</span><span id="line-7688">    // If directory already exists, will log warning and keep going. Will try to create</span>
+<span class="source-line-no">7689</span><span id="line-7689">    // .regioninfo. If one exists, will overwrite.</span>
+<span class="source-line-no">7690</span><span id="line-7690">    return HRegionFileSystem.createRegionOnFileSystem(configuration, fs, tableDir, ri);</span>
+<span class="source-line-no">7691</span><span id="line-7691">  }</span>
+<span class="source-line-no">7692</span><span id="line-7692"></span>
+<span class="source-line-no">7693</span><span id="line-7693">  public static HRegion createHRegion(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">7694</span><span id="line-7694">    final Configuration conf, final TableDescriptor hTableDescriptor, final WAL wal)</span>
+<span class="source-line-no">7695</span><span id="line-7695">    throws IOException {</span>
+<span class="source-line-no">7696</span><span id="line-7696">    return createHRegion(info, rootDir, conf, hTableDescriptor, wal, true);</span>
 <span class="source-line-no">7697</span><span id="line-7697">  }</span>
 <span class="source-line-no">7698</span><span id="line-7698"></span>
 <span class="source-line-no">7699</span><span id="line-7699">  /**</span>
 <span class="source-line-no">7700</span><span id="line-7700">   * Open a Region.</span>
-<span class="source-line-no">7701</span><span id="line-7701">   * @param info       Info for region to be opened</span>
-<span class="source-line-no">7702</span><span id="line-7702">   * @param htd        the table descriptor</span>
-<span class="source-line-no">7703</span><span id="line-7703">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
-<span class="source-line-no">7704</span><span id="line-7704">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
-<span class="source-line-no">7705</span><span id="line-7705">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
-<span class="source-line-no">7706</span><span id="line-7706">   *                   region.</span>
-<span class="source-line-no">7707</span><span id="line-7707">   * @param conf       The Configuration object to use.</span>
-<span class="source-line-no">7708</span><span id="line-7708">   * @param rsServices An interface we can request flushes against.</span>
-<span class="source-line-no">7709</span><span id="line-7709">   * @param reporter   An interface we can report progress against.</span>
-<span class="source-line-no">7710</span><span id="line-7710">   * @return new HRegion</span>
-<span class="source-line-no">7711</span><span id="line-7711">   */</span>
-<span class="source-line-no">7712</span><span id="line-7712">  public static HRegion openHRegion(final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
-<span class="source-line-no">7713</span><span id="line-7713">    final Configuration conf, final RegionServerServices rsServices,</span>
-<span class="source-line-no">7714</span><span id="line-7714">    final CancelableProgressable reporter) throws IOException {</span>
-<span class="source-line-no">7715</span><span id="line-7715">    return openHRegion(CommonFSUtils.getRootDir(conf), info, htd, wal, conf, rsServices, reporter);</span>
-<span class="source-line-no">7716</span><span id="line-7716">  }</span>
-<span class="source-line-no">7717</span><span id="line-7717"></span>
-<span class="source-line-no">7718</span><span id="line-7718">  /**</span>
-<span class="source-line-no">7719</span><span id="line-7719">   * Open a Region.</span>
-<span class="source-line-no">7720</span><span id="line-7720">   * @param rootDir Root directory for HBase instance</span>
-<span class="source-line-no">7721</span><span id="line-7721">   * @param info    Info for region to be opened.</span>
-<span class="source-line-no">7722</span><span id="line-7722">   * @param htd     the table descriptor</span>
-<span class="source-line-no">7723</span><span id="line-7723">   * @param wal     WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
-<span class="source-line-no">7724</span><span id="line-7724">   *                the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
-<span class="source-line-no">7725</span><span id="line-7725">   *                properly kept up. HRegionStore does this every time it opens a new region.</span>
-<span class="source-line-no">7726</span><span id="line-7726">   * @param conf    The Configuration object to use.</span>
-<span class="source-line-no">7727</span><span id="line-7727">   * @return new HRegion</span>
-<span class="source-line-no">7728</span><span id="line-7728">   */</span>
-<span class="source-line-no">7729</span><span id="line-7729">  public static HRegion openHRegion(Path rootDir, final RegionInfo info, final TableDescriptor htd,</span>
-<span class="source-line-no">7730</span><span id="line-7730">    final WAL wal, final Configuration conf) throws IOException {</span>
-<span class="source-line-no">7731</span><span id="line-7731">    return openHRegion(rootDir, info, htd, wal, conf, null, null);</span>
-<span class="source-line-no">7732</span><span id="line-7732">  }</span>
-<span class="source-line-no">7733</span><span id="line-7733"></span>
-<span class="source-line-no">7734</span><span id="line-7734">  /**</span>
-<span class="source-line-no">7735</span><span id="line-7735">   * Open a Region.</span>
-<span class="source-line-no">7736</span><span id="line-7736">   * @param rootDir    Root directory for HBase instance</span>
-<span class="source-line-no">7737</span><span id="line-7737">   * @param info       Info for region to be opened.</span>
-<span class="source-line-no">7738</span><span id="line-7738">   * @param htd        the table descriptor</span>
-<span class="source-line-no">7739</span><span id="line-7739">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
-<span class="source-line-no">7740</span><span id="line-7740">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
-<span class="source-line-no">7741</span><span id="line-7741">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
-<span class="source-line-no">7742</span><span id="line-7742">   *                   region.</span>
-<span class="source-line-no">7743</span><span id="line-7743">   * @param conf       The Configuration object to use.</span>
-<span class="source-line-no">7744</span><span id="line-7744">   * @param rsServices An interface we can request flushes against.</span>
-<span class="source-line-no">7745</span><span id="line-7745">   * @param reporter   An interface we can report progress against.</span>
-<span class="source-line-no">7746</span><span id="line-7746">   * @return new HRegion</span>
-<span class="source-line-no">7747</span><span id="line-7747">   */</span>
-<span class="source-line-no">7748</span><span id="line-7748">  public static HRegion openHRegion(final Path rootDir, final RegionInfo info,</span>
-<span class="source-line-no">7749</span><span id="line-7749">    final TableDescriptor htd, final WAL wal, final Configuration conf,</span>
-<span class="source-line-no">7750</span><span id="line-7750">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
-<span class="source-line-no">7751</span><span id="line-7751">    throws IOException {</span>
-<span class="source-line-no">7752</span><span id="line-7752">    FileSystem fs = null;</span>
-<span class="source-line-no">7753</span><span id="line-7753">    if (rsServices != null) {</span>
-<span class="source-line-no">7754</span><span id="line-7754">      fs = rsServices.getFileSystem();</span>
-<span class="source-line-no">7755</span><span id="line-7755">    }</span>
-<span class="source-line-no">7756</span><span id="line-7756">    if (fs == null) {</span>
-<span class="source-line-no">7757</span><span id="line-7757">      fs = rootDir.getFileSystem(conf);</span>
-<span class="source-line-no">7758</span><span id="line-7758">    }</span>
-<span class="source-line-no">7759</span><span id="line-7759">    return openHRegion(conf, fs, rootDir, info, htd, wal, rsServices, reporter);</span>
-<span class="source-line-no">7760</span><span id="line-7760">  }</span>
-<span class="source-line-no">7761</span><span id="line-7761"></span>
-<span class="source-line-no">7762</span><span id="line-7762">  /**</span>
-<span class="source-line-no">7763</span><span id="line-7763">   * Open a Region.</span>
-<span class="source-line-no">7764</span><span id="line-7764">   * @param conf    The Configuration object to use.</span>
-<span class="source-line-no">7765</span><span id="line-7765">   * @param fs      Filesystem to use</span>
-<span class="source-line-no">7766</span><span id="line-7766">   * @param rootDir Root directory for HBase instance</span>
-<span class="source-line-no">7767</span><span id="line-7767">   * @param info    Info for region to be opened.</span>
-<span class="source-line-no">7768</span><span id="line-7768">   * @param htd     the table descriptor</span>
-<span class="source-line-no">7769</span><span id="line-7769">   * @param wal     WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
-<span class="source-line-no">7770</span><span id="line-7770">   *                the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
-<span class="source-line-no">7771</span><span id="line-7771">   *                properly kept up. HRegionStore does this every time it opens a new region.</span>
-<span class="source-line-no">7772</span><span id="line-7772">   * @return new HRegion</span>
-<span class="source-line-no">7773</span><span id="line-7773">   */</span>
-<span class="source-line-no">7774</span><span id="line-7774">  public static HRegion openHRegion(final Configuration conf, final FileSystem fs,</span>
-<span class="source-line-no">7775</span><span id="line-7775">    final Path rootDir, final RegionInfo info, final TableDescriptor htd, final WAL wal)</span>
-<span class="source-line-no">7776</span><span id="line-7776">    throws IOException {</span>
-<span class="source-line-no">7777</span><span id="line-7777">    return openHRegion(conf, fs, rootDir, info, htd, wal, null, null);</span>
-<span class="source-line-no">7778</span><span id="line-7778">  }</span>
-<span class="source-line-no">7779</span><span id="line-7779"></span>
-<span class="source-line-no">7780</span><span id="line-7780">  /**</span>
-<span class="source-line-no">7781</span><span id="line-7781">   * Open a Region.</span>
-<span class="source-line-no">7782</span><span id="line-7782">   * @param conf       The Configuration object to use.</span>
-<span class="source-line-no">7783</span><span id="line-7783">   * @param fs         Filesystem to use</span>
-<span class="source-line-no">7784</span><span id="line-7784">   * @param rootDir    Root directory for HBase instance</span>
-<span class="source-line-no">7785</span><span id="line-7785">   * @param info       Info for region to be opened.</span>
-<span class="source-line-no">7786</span><span id="line-7786">   * @param htd        the table descriptor</span>
-<span class="source-line-no">7787</span><span id="line-7787">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
-<span class="source-line-no">7788</span><span id="line-7788">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
-<span class="source-line-no">7789</span><span id="line-7789">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
-<span class="source-line-no">7790</span><span id="line-7790">   *                   region.</span>
-<span class="source-line-no">7791</span><span id="line-7791">   * @param rsServices An interface we can request flushes against.</span>
-<span class="source-line-no">7792</span><span id="line-7792">   * @param reporter   An interface we can report progress against.</span>
-<span class="source-line-no">7793</span><span id="line-7793">   * @return new HRegion</span>
-<span class="source-line-no">7794</span><span id="line-7794">   */</span>
-<span class="source-line-no">7795</span><span id="line-7795">  public static HRegion openHRegion(final Configuration conf, final FileSystem fs,</span>
-<span class="source-line-no">7796</span><span id="line-7796">    final Path rootDir, final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
-<span class="source-line-no">7797</span><span id="line-7797">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
-<span class="source-line-no">7798</span><span id="line-7798">    throws IOException {</span>
-<span class="source-line-no">7799</span><span id="line-7799">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
-<span class="source-line-no">7800</span><span id="line-7800">    return openHRegionFromTableDir(conf, fs, tableDir, info, htd, wal, rsServices, reporter);</span>
-<span class="source-line-no">7801</span><span id="line-7801">  }</span>
-<span class="source-line-no">7802</span><span id="line-7802"></span>
-<span class="source-line-no">7803</span><span id="line-7803">  /**</span>
-<span class="source-line-no">7804</span><span id="line-7804">   * Open a Region.</span>
-<span class="source-line-no">7805</span><span id="line-7805">   * @param conf       The Configuration object to use.</span>
-<span class="source-line-no">7806</span><span id="line-7806">   * @param fs         Filesystem to use</span>
-<span class="source-line-no">7807</span><span id="line-7807">   * @param info       Info for region to be opened.</span>
-<span class="source-line-no">7808</span><span id="line-7808">   * @param htd        the table descriptor</span>
-<span class="source-line-no">7809</span><span id="line-7809">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
-<span class="source-line-no">7810</span><span id="line-7810">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
-<span class="source-line-no">7811</span><span id="line-7811">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
-<span class="source-line-no">7812</span><span id="line-7812">   *                   region.</span>
-<span class="source-line-no">7813</span><span id="line-7813">   * @param rsServices An interface we can request flushes against.</span>
-<span class="source-line-no">7814</span><span id="line-7814">   * @param reporter   An interface we can report progress against.</span>
-<span class="source-line-no">7815</span><span id="line-7815">   * @return new HRegion</span>
-<span class="source-line-no">7816</span><span id="line-7816">   * @throws NullPointerException if {@code info} is {@code null}</span>
-<span class="source-line-no">7817</span><span id="line-7817">   */</span>
-<span class="source-line-no">7818</span><span id="line-7818">  public static HRegion openHRegionFromTableDir(final Configuration conf, final FileSystem fs,</span>
-<span class="source-line-no">7819</span><span id="line-7819">    final Path tableDir, final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
-<span class="source-line-no">7820</span><span id="line-7820">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
-<span class="source-line-no">7821</span><span id="line-7821">    throws IOException {</span>
-<span class="source-line-no">7822</span><span id="line-7822">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
-<span class="source-line-no">7823</span><span id="line-7823">    LOG.debug("Opening region: {}", info);</span>
-<span class="source-line-no">7824</span><span id="line-7824">    HRegion r = HRegion.newHRegion(tableDir, wal, fs, conf, info, htd, rsServices);</span>
-<span class="source-line-no">7825</span><span id="line-7825">    return r.openHRegion(reporter);</span>
-<span class="source-line-no">7826</span><span id="line-7826">  }</span>
-<span class="source-line-no">7827</span><span id="line-7827"></span>
-<span class="source-line-no">7828</span><span id="line-7828">  public NavigableMap&lt;byte[], Integer&gt; getReplicationScope() {</span>
-<span class="source-line-no">7829</span><span id="line-7829">    return this.replicationScope;</span>
-<span class="source-line-no">7830</span><span id="line-7830">  }</span>
-<span class="source-line-no">7831</span><span id="line-7831"></span>
-<span class="source-line-no">7832</span><span id="line-7832">  /**</span>
-<span class="source-line-no">7833</span><span id="line-7833">   * Useful when reopening a closed region (normally for unit tests)</span>
-<span class="source-line-no">7834</span><span id="line-7834">   * @param other    original object</span>
-<span class="source-line-no">7835</span><span id="line-7835">   * @param reporter An interface we can report progress against.</span>
-<span class="source-line-no">7836</span><span id="line-7836">   * @return new HRegion</span>
-<span class="source-line-no">7837</span><span id="line-7837">   */</span>
-<span class="source-line-no">7838</span><span id="line-7838">  public static HRegion openHRegion(final HRegion other, final CancelableProgressable reporter)</span>
-<span class="source-line-no">7839</span><span id="line-7839">    throws IOException {</span>
-<span class="source-line-no">7840</span><span id="line-7840">    HRegionFileSystem regionFs = other.getRegionFileSystem();</span>
-<span class="source-line-no">7841</span><span id="line-7841">    HRegion r = newHRegion(regionFs.getTableDir(), other.getWAL(), regionFs.getFileSystem(),</span>
-<span class="source-line-no">7842</span><span id="line-7842">      other.baseConf, other.getRegionInfo(), other.getTableDescriptor(), null);</span>
-<span class="source-line-no">7843</span><span id="line-7843">    return r.openHRegion(reporter);</span>
-<span class="source-line-no">7844</span><span id="line-7844">  }</span>
-<span class="source-line-no">7845</span><span id="line-7845"></span>
-<span class="source-line-no">7846</span><span id="line-7846">  public static Region openHRegion(final Region other, final CancelableProgressable reporter)</span>
-<span class="source-line-no">7847</span><span id="line-7847">    throws IOException {</span>
-<span class="source-line-no">7848</span><span id="line-7848">    return openHRegion((HRegion) other, reporter);</span>
-<span class="source-line-no">7849</span><span id="line-7849">  }</span>
-<span class="source-line-no">7850</span><span id="line-7850"></span>
-<span class="source-line-no">7851</span><span id="line-7851">  /**</span>
-<span class="source-line-no">7852</span><span id="line-7852">   * Open HRegion.</span>
-<span class="source-line-no">7853</span><span id="line-7853">   * &lt;p/&gt;</span>
-<span class="source-line-no">7854</span><span id="line-7854">   * Calls initialize and sets sequenceId.</span>
-<span class="source-line-no">7855</span><span id="line-7855">   * @return Returns &lt;code&gt;this&lt;/code&gt;</span>
-<span class="source-line-no">7856</span><span id="line-7856">   */</span>
-<span class="source-line-no">7857</span><span id="line-7857">  private HRegion openHRegion(final CancelableProgressable reporter) throws IOException {</span>
-<span class="source-line-no">7858</span><span id="line-7858">    try {</span>
-<span class="source-line-no">7859</span><span id="line-7859">      CompoundConfiguration cConfig =</span>
-<span class="source-line-no">7860</span><span id="line-7860">        new CompoundConfiguration().add(conf).addBytesMap(htableDescriptor.getValues());</span>
-<span class="source-line-no">7861</span><span id="line-7861">      // Refuse to open the region if we are missing local compression support</span>
-<span class="source-line-no">7862</span><span id="line-7862">      TableDescriptorChecker.checkCompression(cConfig, htableDescriptor);</span>
-<span class="source-line-no">7863</span><span id="line-7863">      // Refuse to open the region if encryption configuration is incorrect or</span>
-<span class="source-line-no">7864</span><span id="line-7864">      // codec support is missing</span>
-<span class="source-line-no">7865</span><span id="line-7865">      LOG.debug("checking encryption for " + this.getRegionInfo().getEncodedName());</span>
-<span class="source-line-no">7866</span><span id="line-7866">      TableDescriptorChecker.checkEncryption(cConfig, htableDescriptor);</span>
-<span class="source-line-no">7867</span><span id="line-7867">      // Refuse to open the region if a required class cannot be loaded</span>
-<span class="source-line-no">7868</span><span id="line-7868">      LOG.debug("checking classloading for " + this.getRegionInfo().getEncodedName());</span>
-<span class="source-line-no">7869</span><span id="line-7869">      TableDescriptorChecker.checkClassLoading(cConfig, htableDescriptor);</span>
-<span class="source-line-no">7870</span><span id="line-7870">      this.openSeqNum = initialize(reporter);</span>
-<span class="source-line-no">7871</span><span id="line-7871">      this.mvcc.advanceTo(openSeqNum);</span>
-<span class="source-line-no">7872</span><span id="line-7872">      // The openSeqNum must be increased every time when a region is assigned, as we rely on it to</span>
-<span class="source-line-no">7873</span><span id="line-7873">      // determine whether a region has been successfully reopened. So here we always write open</span>
-<span class="source-line-no">7874</span><span id="line-7874">      // marker, even if the table is read only.</span>
-<span class="source-line-no">7875</span><span id="line-7875">      if (</span>
-<span class="source-line-no">7876</span><span id="line-7876">        wal != null &amp;&amp; getRegionServerServices() != null</span>
-<span class="source-line-no">7877</span><span id="line-7877">          &amp;&amp; RegionReplicaUtil.isDefaultReplica(getRegionInfo())</span>
-<span class="source-line-no">7878</span><span id="line-7878">      ) {</span>
-<span class="source-line-no">7879</span><span id="line-7879">        writeRegionOpenMarker(wal, openSeqNum);</span>
-<span class="source-line-no">7880</span><span id="line-7880">      }</span>
-<span class="source-line-no">7881</span><span id="line-7881">    } catch (Throwable t) {</span>
-<span class="source-line-no">7882</span><span id="line-7882">      // By coprocessor path wrong region will open failed,</span>
-<span class="source-line-no">7883</span><span id="line-7883">      // MetricsRegionWrapperImpl is already init and not close,</span>
-<span class="source-line-no">7884</span><span id="line-7884">      // add region close when open failed</span>
-<span class="source-line-no">7885</span><span id="line-7885">      try {</span>
-<span class="source-line-no">7886</span><span id="line-7886">        // It is not required to write sequence id file when region open is failed.</span>
-<span class="source-line-no">7887</span><span id="line-7887">        // Passing true to skip the sequence id file write.</span>
-<span class="source-line-no">7888</span><span id="line-7888">        this.close(true);</span>
-<span class="source-line-no">7889</span><span id="line-7889">      } catch (Throwable e) {</span>
-<span class="source-line-no">7890</span><span id="line-7890">        LOG.warn("Open region: {} failed. Try close region but got exception ",</span>
-<span class="source-line-no">7891</span><span id="line-7891">          this.getRegionInfo(), e);</span>
-<span class="source-line-no">7892</span><span id="line-7892">      }</span>
-<span class="source-line-no">7893</span><span id="line-7893">      throw t;</span>
-<span class="source-line-no">7894</span><span id="line-7894">    }</span>
-<span class="source-line-no">7895</span><span id="line-7895">    return this;</span>
-<span class="source-line-no">7896</span><span id="line-7896">  }</span>
-<span class="source-line-no">7897</span><span id="line-7897"></span>
-<span class="source-line-no">7898</span><span id="line-7898">  /**</span>
-<span class="source-line-no">7899</span><span id="line-7899">   * Open a Region on a read-only file-system (like hdfs snapshots)</span>
-<span class="source-line-no">7900</span><span id="line-7900">   * @param conf The Configuration object to use.</span>
-<span class="source-line-no">7901</span><span id="line-7901">   * @param fs   Filesystem to use</span>
-<span class="source-line-no">7902</span><span id="line-7902">   * @param info Info for region to be opened.</span>
-<span class="source-line-no">7903</span><span id="line-7903">   * @param htd  the table descriptor</span>
-<span class="source-line-no">7904</span><span id="line-7904">   * @return new HRegion</span>
-<span class="source-line-no">7905</span><span id="line-7905">   * @throws NullPointerException if {@code info} is {@code null}</span>
-<span class="source-line-no">7906</span><span id="line-7906">   */</span>
-<span class="source-line-no">7907</span><span id="line-7907">  public static HRegion openReadOnlyFileSystemHRegion(final Configuration conf, final FileSystem fs,</span>
-<span class="source-line-no">7908</span><span id="line-7908">    final Path tableDir, RegionInfo info, final TableDescriptor htd) throws IOException {</span>
-<span class="source-line-no">7909</span><span id="line-7909">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
-<span class="source-line-no">7910</span><span id="line-7910">    if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">7911</span><span id="line-7911">      LOG.debug("Opening region (readOnly filesystem): " + info);</span>
-<span class="source-line-no">7912</span><span id="line-7912">    }</span>
-<span class="source-line-no">7913</span><span id="line-7913">    if (info.getReplicaId() &lt;= 0) {</span>
-<span class="source-line-no">7914</span><span id="line-7914">      info = RegionReplicaUtil.getRegionInfoForReplica(info, 1);</span>
-<span class="source-line-no">7915</span><span id="line-7915">    }</span>
-<span class="source-line-no">7916</span><span id="line-7916">    HRegion r = HRegion.newHRegion(tableDir, null, fs, conf, info, htd, null);</span>
-<span class="source-line-no">7917</span><span id="line-7917">    r.writestate.setReadOnly(true);</span>
-<span class="source-line-no">7918</span><span id="line-7918">    return r.openHRegion(null);</span>
-<span class="source-line-no">7919</span><span id="line-7919">  }</span>
-<span class="source-line-no">7920</span><span id="line-7920"></span>
-<span class="source-line-no">7921</span><span id="line-7921">  public static HRegion warmupHRegion(final RegionInfo info, final TableDescriptor htd,</span>
-<span class="source-line-no">7922</span><span id="line-7922">    final WAL wal, final Configuration conf, final RegionServerServices rsServices,</span>
-<span class="source-line-no">7923</span><span id="line-7923">    final CancelableProgressable reporter) throws IOException {</span>
-<span class="source-line-no">7924</span><span id="line-7924"></span>
-<span class="source-line-no">7925</span><span id="line-7925">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
-<span class="source-line-no">7926</span><span id="line-7926">    LOG.debug("Warmup {}", info);</span>
-<span class="source-line-no">7927</span><span id="line-7927">    Path rootDir = CommonFSUtils.getRootDir(conf);</span>
-<span class="source-line-no">7928</span><span id="line-7928">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
-<span class="source-line-no">7929</span><span id="line-7929">    FileSystem fs = null;</span>
-<span class="source-line-no">7930</span><span id="line-7930">    if (rsServices != null) {</span>
-<span class="source-line-no">7931</span><span id="line-7931">      fs = rsServices.getFileSystem();</span>
-<span class="source-line-no">7932</span><span id="line-7932">    }</span>
-<span class="source-line-no">7933</span><span id="line-7933">    if (fs == null) {</span>
-<span class="source-line-no">7934</span><span id="line-7934">      fs = rootDir.getFileSystem(conf);</span>
-<span class="source-line-no">7935</span><span id="line-7935">    }</span>
-<span class="source-line-no">7936</span><span id="line-7936">    HRegion r = HRegion.newHRegion(tableDir, wal, fs, conf, info, htd, null);</span>
-<span class="source-line-no">7937</span><span id="line-7937">    r.initializeWarmup(reporter);</span>
-<span class="source-line-no">7938</span><span id="line-7938">    r.close();</span>
-<span class="source-line-no">7939</span><span id="line-7939">    return r;</span>
-<span class="source-line-no">7940</span><span id="line-7940">  }</span>
-<span class="source-line-no">7941</span><span id="line-7941"></span>
-<span class="source-line-no">7942</span><span id="line-7942">  /**</span>
-<span class="source-line-no">7943</span><span id="line-7943">   * Computes the Path of the HRegion</span>
-<span class="source-line-no">7944</span><span id="line-7944">   * @param tabledir qualified path for table</span>
-<span class="source-line-no">7945</span><span id="line-7945">   * @param name     ENCODED region name</span>
-<span class="source-line-no">7946</span><span id="line-7946">   * @return Path of HRegion directory</span>
-<span class="source-line-no">7947</span><span id="line-7947">   * @deprecated For tests only; to be removed.</span>
-<span class="source-line-no">7948</span><span id="line-7948">   */</span>
-<span class="source-line-no">7949</span><span id="line-7949">  @Deprecated</span>
-<span class="source-line-no">7950</span><span id="line-7950">  public static Path getRegionDir(final Path tabledir, final String name) {</span>
-<span class="source-line-no">7951</span><span id="line-7951">    return new Path(tabledir, name);</span>
-<span class="source-line-no">7952</span><span id="line-7952">  }</span>
-<span class="source-line-no">7953</span><span id="line-7953"></span>
-<span class="source-line-no">7954</span><span id="line-7954">  /**</span>
-<span class="source-line-no">7955</span><span id="line-7955">   * Determines if the specified row is within the row range specified by the specified RegionInfo</span>
-<span class="source-line-no">7956</span><span id="line-7956">   * @param info RegionInfo that specifies the row range</span>
-<span class="source-line-no">7957</span><span id="line-7957">   * @param row  row to be checked</span>
-<span class="source-line-no">7958</span><span id="line-7958">   * @return true if the row is within the range specified by the RegionInfo</span>
-<span class="source-line-no">7959</span><span id="line-7959">   */</span>
-<span class="source-line-no">7960</span><span id="line-7960">  public static boolean rowIsInRange(RegionInfo info, final byte[] row) {</span>
-<span class="source-line-no">7961</span><span id="line-7961">    return ((info.getStartKey().length == 0) || (Bytes.compareTo(info.getStartKey(), row) &lt;= 0))</span>
-<span class="source-line-no">7962</span><span id="line-7962">      &amp;&amp; ((info.getEndKey().length == 0) || (Bytes.compareTo(info.getEndKey(), row) &gt; 0));</span>
-<span class="source-line-no">7963</span><span id="line-7963">  }</span>
-<span class="source-line-no">7964</span><span id="line-7964"></span>
-<span class="source-line-no">7965</span><span id="line-7965">  public static boolean rowIsInRange(RegionInfo info, final byte[] row, final int offset,</span>
-<span class="source-line-no">7966</span><span id="line-7966">    final short length) {</span>
-<span class="source-line-no">7967</span><span id="line-7967">    return ((info.getStartKey().length == 0)</span>
-<span class="source-line-no">7968</span><span id="line-7968">      || (Bytes.compareTo(info.getStartKey(), 0, info.getStartKey().length, row, offset, length)</span>
-<span class="source-line-no">7969</span><span id="line-7969">          &lt;= 0))</span>
-<span class="source-line-no">7970</span><span id="line-7970">      &amp;&amp; ((info.getEndKey().length == 0)</span>
-<span class="source-line-no">7971</span><span id="line-7971">        || (Bytes.compareTo(info.getEndKey(), 0, info.getEndKey().length, row, offset, length)</span>
-<span class="source-line-no">7972</span><span id="line-7972">            &gt; 0));</span>
-<span class="source-line-no">7973</span><span id="line-7973">  }</span>
-<span class="source-line-no">7974</span><span id="line-7974"></span>
-<span class="source-line-no">7975</span><span id="line-7975">  @Override</span>
-<span class="source-line-no">7976</span><span id="line-7976">  public Result get(final Get get) throws IOException {</span>
-<span class="source-line-no">7977</span><span id="line-7977">    prepareGet(get);</span>
-<span class="source-line-no">7978</span><span id="line-7978">    List&lt;Cell&gt; results = get(get, true);</span>
-<span class="source-line-no">7979</span><span id="line-7979">    boolean stale = this.getRegionInfo().getReplicaId() != 0;</span>
-<span class="source-line-no">7980</span><span id="line-7980">    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);</span>
-<span class="source-line-no">7981</span><span id="line-7981">  }</span>
-<span class="source-line-no">7982</span><span id="line-7982"></span>
-<span class="source-line-no">7983</span><span id="line-7983">  void prepareGet(final Get get) throws IOException {</span>
-<span class="source-line-no">7984</span><span id="line-7984">    checkRow(get.getRow(), "Get");</span>
-<span class="source-line-no">7985</span><span id="line-7985">    // Verify families are all valid</span>
-<span class="source-line-no">7986</span><span id="line-7986">    if (get.hasFamilies()) {</span>
-<span class="source-line-no">7987</span><span id="line-7987">      for (byte[] family : get.familySet()) {</span>
-<span class="source-line-no">7988</span><span id="line-7988">        checkFamily(family);</span>
-<span class="source-line-no">7989</span><span id="line-7989">      }</span>
-<span class="source-line-no">7990</span><span id="line-7990">    } else { // Adding all families to scanner</span>
-<span class="source-line-no">7991</span><span id="line-7991">      for (byte[] family : this.htableDescriptor.getColumnFamilyNames()) {</span>
-<span class="source-line-no">7992</span><span id="line-7992">        get.addFamily(family);</span>
-<span class="source-line-no">7993</span><span id="line-7993">      }</span>
-<span class="source-line-no">7994</span><span id="line-7994">    }</span>
-<span class="source-line-no">7995</span><span id="line-7995">  }</span>
-<span class="source-line-no">7996</span><span id="line-7996"></span>
-<span class="source-line-no">7997</span><span id="line-7997">  @Override</span>
-<span class="source-line-no">7998</span><span id="line-7998">  public List&lt;Cell&gt; get(Get get, boolean withCoprocessor) throws IOException {</span>
-<span class="source-line-no">7999</span><span id="line-7999">    return get(get, withCoprocessor, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
-<span class="source-line-no">8000</span><span id="line-8000">  }</span>
-<span class="source-line-no">8001</span><span id="line-8001"></span>
-<span class="source-line-no">8002</span><span id="line-8002">  private List&lt;Cell&gt; get(Get get, boolean withCoprocessor, long nonceGroup, long nonce)</span>
-<span class="source-line-no">8003</span><span id="line-8003">    throws IOException {</span>
-<span class="source-line-no">8004</span><span id="line-8004">    return TraceUtil.trace(() -&gt; getInternal(get, withCoprocessor, nonceGroup, nonce),</span>
-<span class="source-line-no">8005</span><span id="line-8005">      () -&gt; createRegionSpan("Region.get"));</span>
-<span class="source-line-no">8006</span><span id="line-8006">  }</span>
-<span class="source-line-no">8007</span><span id="line-8007"></span>
-<span class="source-line-no">8008</span><span id="line-8008">  private List&lt;Cell&gt; getInternal(Get get, boolean withCoprocessor, long nonceGroup, long nonce)</span>
-<span class="source-line-no">8009</span><span id="line-8009">    throws IOException {</span>
-<span class="source-line-no">8010</span><span id="line-8010">    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">8011</span><span id="line-8011"></span>
-<span class="source-line-no">8012</span><span id="line-8012">    // pre-get CP hook</span>
-<span class="source-line-no">8013</span><span id="line-8013">    if (withCoprocessor &amp;&amp; (coprocessorHost != null)) {</span>
-<span class="source-line-no">8014</span><span id="line-8014">      if (coprocessorHost.preGet(get, results)) {</span>
-<span class="source-line-no">8015</span><span id="line-8015">        metricsUpdateForGet();</span>
-<span class="source-line-no">8016</span><span id="line-8016">        return results;</span>
-<span class="source-line-no">8017</span><span id="line-8017">      }</span>
-<span class="source-line-no">8018</span><span id="line-8018">    }</span>
-<span class="source-line-no">8019</span><span id="line-8019">    Scan scan = new Scan(get);</span>
-<span class="source-line-no">8020</span><span id="line-8020">    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {</span>
-<span class="source-line-no">8021</span><span id="line-8021">      scan.setLoadColumnFamiliesOnDemand(isLoadingCfsOnDemandDefault());</span>
-<span class="source-line-no">8022</span><span id="line-8022">    }</span>
-<span class="source-line-no">8023</span><span id="line-8023">    try (RegionScanner scanner = getScanner(scan, null, nonceGroup, nonce)) {</span>
-<span class="source-line-no">8024</span><span id="line-8024">      List&lt;Cell&gt; tmp = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">8025</span><span id="line-8025">      scanner.next(tmp);</span>
-<span class="source-line-no">8026</span><span id="line-8026">      // Copy EC to heap, then close the scanner.</span>
-<span class="source-line-no">8027</span><span id="line-8027">      // This can be an EXPENSIVE call. It may make an extra copy from offheap to onheap buffers.</span>
-<span class="source-line-no">8028</span><span id="line-8028">      // See more details in HBASE-26036.</span>
-<span class="source-line-no">8029</span><span id="line-8029">      for (Cell cell : tmp) {</span>
-<span class="source-line-no">8030</span><span id="line-8030">        results.add(CellUtil.cloneIfNecessary(cell));</span>
-<span class="source-line-no">8031</span><span id="line-8031">      }</span>
-<span class="source-line-no">8032</span><span id="line-8032">    }</span>
-<span class="source-line-no">8033</span><span id="line-8033"></span>
-<span class="source-line-no">8034</span><span id="line-8034">    // post-get CP hook</span>
-<span class="source-line-no">8035</span><span id="line-8035">    if (withCoprocessor &amp;&amp; (coprocessorHost != null)) {</span>
-<span class="source-line-no">8036</span><span id="line-8036">      coprocessorHost.postGet(get, results);</span>
-<span class="source-line-no">8037</span><span id="line-8037">    }</span>
-<span class="source-line-no">8038</span><span id="line-8038"></span>
-<span class="source-line-no">8039</span><span id="line-8039">    metricsUpdateForGet();</span>
-<span class="source-line-no">8040</span><span id="line-8040"></span>
-<span class="source-line-no">8041</span><span id="line-8041">    return results;</span>
-<span class="source-line-no">8042</span><span id="line-8042">  }</span>
-<span class="source-line-no">8043</span><span id="line-8043"></span>
-<span class="source-line-no">8044</span><span id="line-8044">  void metricsUpdateForGet() {</span>
-<span class="source-line-no">8045</span><span id="line-8045">    if (this.metricsRegion != null) {</span>
-<span class="source-line-no">8046</span><span id="line-8046">      this.metricsRegion.updateGet();</span>
-<span class="source-line-no">8047</span><span id="line-8047">    }</span>
-<span class="source-line-no">8048</span><span id="line-8048">    if (this.rsServices != null &amp;&amp; this.rsServices.getMetrics() != null) {</span>
-<span class="source-line-no">8049</span><span id="line-8049">      rsServices.getMetrics().updateReadQueryMeter(this, 1);</span>
+<span class="source-line-no">7701</span><span id="line-7701">   * @param info Info for region to be opened.</span>
+<span class="source-line-no">7702</span><span id="line-7702">   * @param wal  WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
+<span class="source-line-no">7703</span><span id="line-7703">   *             the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
+<span class="source-line-no">7704</span><span id="line-7704">   *             properly kept up. HRegionStore does this every time it opens a new region.</span>
+<span class="source-line-no">7705</span><span id="line-7705">   * @return new HRegion</span>
+<span class="source-line-no">7706</span><span id="line-7706">   */</span>
+<span class="source-line-no">7707</span><span id="line-7707">  public static HRegion openHRegion(final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
+<span class="source-line-no">7708</span><span id="line-7708">    final Configuration conf) throws IOException {</span>
+<span class="source-line-no">7709</span><span id="line-7709">    return openHRegion(info, htd, wal, conf, null, null);</span>
+<span class="source-line-no">7710</span><span id="line-7710">  }</span>
+<span class="source-line-no">7711</span><span id="line-7711"></span>
+<span class="source-line-no">7712</span><span id="line-7712">  /**</span>
+<span class="source-line-no">7713</span><span id="line-7713">   * Open a Region.</span>
+<span class="source-line-no">7714</span><span id="line-7714">   * @param info       Info for region to be opened</span>
+<span class="source-line-no">7715</span><span id="line-7715">   * @param htd        the table descriptor</span>
+<span class="source-line-no">7716</span><span id="line-7716">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
+<span class="source-line-no">7717</span><span id="line-7717">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
+<span class="source-line-no">7718</span><span id="line-7718">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
+<span class="source-line-no">7719</span><span id="line-7719">   *                   region.</span>
+<span class="source-line-no">7720</span><span id="line-7720">   * @param conf       The Configuration object to use.</span>
+<span class="source-line-no">7721</span><span id="line-7721">   * @param rsServices An interface we can request flushes against.</span>
+<span class="source-line-no">7722</span><span id="line-7722">   * @param reporter   An interface we can report progress against.</span>
+<span class="source-line-no">7723</span><span id="line-7723">   * @return new HRegion</span>
+<span class="source-line-no">7724</span><span id="line-7724">   */</span>
+<span class="source-line-no">7725</span><span id="line-7725">  public static HRegion openHRegion(final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
+<span class="source-line-no">7726</span><span id="line-7726">    final Configuration conf, final RegionServerServices rsServices,</span>
+<span class="source-line-no">7727</span><span id="line-7727">    final CancelableProgressable reporter) throws IOException {</span>
+<span class="source-line-no">7728</span><span id="line-7728">    return openHRegion(CommonFSUtils.getRootDir(conf), info, htd, wal, conf, rsServices, reporter);</span>
+<span class="source-line-no">7729</span><span id="line-7729">  }</span>
+<span class="source-line-no">7730</span><span id="line-7730"></span>
+<span class="source-line-no">7731</span><span id="line-7731">  /**</span>
+<span class="source-line-no">7732</span><span id="line-7732">   * Open a Region.</span>
+<span class="source-line-no">7733</span><span id="line-7733">   * @param rootDir Root directory for HBase instance</span>
+<span class="source-line-no">7734</span><span id="line-7734">   * @param info    Info for region to be opened.</span>
+<span class="source-line-no">7735</span><span id="line-7735">   * @param htd     the table descriptor</span>
+<span class="source-line-no">7736</span><span id="line-7736">   * @param wal     WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
+<span class="source-line-no">7737</span><span id="line-7737">   *                the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
+<span class="source-line-no">7738</span><span id="line-7738">   *                properly kept up. HRegionStore does this every time it opens a new region.</span>
+<span class="source-line-no">7739</span><span id="line-7739">   * @param conf    The Configuration object to use.</span>
+<span class="source-line-no">7740</span><span id="line-7740">   * @return new HRegion</span>
+<span class="source-line-no">7741</span><span id="line-7741">   */</span>
+<span class="source-line-no">7742</span><span id="line-7742">  public static HRegion openHRegion(Path rootDir, final RegionInfo info, final TableDescriptor htd,</span>
+<span class="source-line-no">7743</span><span id="line-7743">    final WAL wal, final Configuration conf) throws IOException {</span>
+<span class="source-line-no">7744</span><span id="line-7744">    return openHRegion(rootDir, info, htd, wal, conf, null, null);</span>
+<span class="source-line-no">7745</span><span id="line-7745">  }</span>
+<span class="source-line-no">7746</span><span id="line-7746"></span>
+<span class="source-line-no">7747</span><span id="line-7747">  /**</span>
+<span class="source-line-no">7748</span><span id="line-7748">   * Open a Region.</span>
+<span class="source-line-no">7749</span><span id="line-7749">   * @param rootDir    Root directory for HBase instance</span>
+<span class="source-line-no">7750</span><span id="line-7750">   * @param info       Info for region to be opened.</span>
+<span class="source-line-no">7751</span><span id="line-7751">   * @param htd        the table descriptor</span>
+<span class="source-line-no">7752</span><span id="line-7752">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
+<span class="source-line-no">7753</span><span id="line-7753">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
+<span class="source-line-no">7754</span><span id="line-7754">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
+<span class="source-line-no">7755</span><span id="line-7755">   *                   region.</span>
+<span class="source-line-no">7756</span><span id="line-7756">   * @param conf       The Configuration object to use.</span>
+<span class="source-line-no">7757</span><span id="line-7757">   * @param rsServices An interface we can request flushes against.</span>
+<span class="source-line-no">7758</span><span id="line-7758">   * @param reporter   An interface we can report progress against.</span>
+<span class="source-line-no">7759</span><span id="line-7759">   * @return new HRegion</span>
+<span class="source-line-no">7760</span><span id="line-7760">   */</span>
+<span class="source-line-no">7761</span><span id="line-7761">  public static HRegion openHRegion(final Path rootDir, final RegionInfo info,</span>
+<span class="source-line-no">7762</span><span id="line-7762">    final TableDescriptor htd, final WAL wal, final Configuration conf,</span>
+<span class="source-line-no">7763</span><span id="line-7763">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
+<span class="source-line-no">7764</span><span id="line-7764">    throws IOException {</span>
+<span class="source-line-no">7765</span><span id="line-7765">    FileSystem fs = null;</span>
+<span class="source-line-no">7766</span><span id="line-7766">    if (rsServices != null) {</span>
+<span class="source-line-no">7767</span><span id="line-7767">      fs = rsServices.getFileSystem();</span>
+<span class="source-line-no">7768</span><span id="line-7768">    }</span>
+<span class="source-line-no">7769</span><span id="line-7769">    if (fs == null) {</span>
+<span class="source-line-no">7770</span><span id="line-7770">      fs = rootDir.getFileSystem(conf);</span>
+<span class="source-line-no">7771</span><span id="line-7771">    }</span>
+<span class="source-line-no">7772</span><span id="line-7772">    return openHRegion(conf, fs, rootDir, info, htd, wal, rsServices, reporter);</span>
+<span class="source-line-no">7773</span><span id="line-7773">  }</span>
+<span class="source-line-no">7774</span><span id="line-7774"></span>
+<span class="source-line-no">7775</span><span id="line-7775">  /**</span>
+<span class="source-line-no">7776</span><span id="line-7776">   * Open a Region.</span>
+<span class="source-line-no">7777</span><span id="line-7777">   * @param conf    The Configuration object to use.</span>
+<span class="source-line-no">7778</span><span id="line-7778">   * @param fs      Filesystem to use</span>
+<span class="source-line-no">7779</span><span id="line-7779">   * @param rootDir Root directory for HBase instance</span>
+<span class="source-line-no">7780</span><span id="line-7780">   * @param info    Info for region to be opened.</span>
+<span class="source-line-no">7781</span><span id="line-7781">   * @param htd     the table descriptor</span>
+<span class="source-line-no">7782</span><span id="line-7782">   * @param wal     WAL for region to use. This method will call WAL#setSequenceNumber(long) passing</span>
+<span class="source-line-no">7783</span><span id="line-7783">   *                the result of the call to HRegion#getMinSequenceId() to ensure the wal id is</span>
+<span class="source-line-no">7784</span><span id="line-7784">   *                properly kept up. HRegionStore does this every time it opens a new region.</span>
+<span class="source-line-no">7785</span><span id="line-7785">   * @return new HRegion</span>
+<span class="source-line-no">7786</span><span id="line-7786">   */</span>
+<span class="source-line-no">7787</span><span id="line-7787">  public static HRegion openHRegion(final Configuration conf, final FileSystem fs,</span>
+<span class="source-line-no">7788</span><span id="line-7788">    final Path rootDir, final RegionInfo info, final TableDescriptor htd, final WAL wal)</span>
+<span class="source-line-no">7789</span><span id="line-7789">    throws IOException {</span>
+<span class="source-line-no">7790</span><span id="line-7790">    return openHRegion(conf, fs, rootDir, info, htd, wal, null, null);</span>
+<span class="source-line-no">7791</span><span id="line-7791">  }</span>
+<span class="source-line-no">7792</span><span id="line-7792"></span>
+<span class="source-line-no">7793</span><span id="line-7793">  /**</span>
+<span class="source-line-no">7794</span><span id="line-7794">   * Open a Region.</span>
+<span class="source-line-no">7795</span><span id="line-7795">   * @param conf       The Configuration object to use.</span>
+<span class="source-line-no">7796</span><span id="line-7796">   * @param fs         Filesystem to use</span>
+<span class="source-line-no">7797</span><span id="line-7797">   * @param rootDir    Root directory for HBase instance</span>
+<span class="source-line-no">7798</span><span id="line-7798">   * @param info       Info for region to be opened.</span>
+<span class="source-line-no">7799</span><span id="line-7799">   * @param htd        the table descriptor</span>
+<span class="source-line-no">7800</span><span id="line-7800">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
+<span class="source-line-no">7801</span><span id="line-7801">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
+<span class="source-line-no">7802</span><span id="line-7802">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
+<span class="source-line-no">7803</span><span id="line-7803">   *                   region.</span>
+<span class="source-line-no">7804</span><span id="line-7804">   * @param rsServices An interface we can request flushes against.</span>
+<span class="source-line-no">7805</span><span id="line-7805">   * @param reporter   An interface we can report progress against.</span>
+<span class="source-line-no">7806</span><span id="line-7806">   * @return new HRegion</span>
+<span class="source-line-no">7807</span><span id="line-7807">   */</span>
+<span class="source-line-no">7808</span><span id="line-7808">  public static HRegion openHRegion(final Configuration conf, final FileSystem fs,</span>
+<span class="source-line-no">7809</span><span id="line-7809">    final Path rootDir, final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
+<span class="source-line-no">7810</span><span id="line-7810">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
+<span class="source-line-no">7811</span><span id="line-7811">    throws IOException {</span>
+<span class="source-line-no">7812</span><span id="line-7812">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
+<span class="source-line-no">7813</span><span id="line-7813">    return openHRegionFromTableDir(conf, fs, tableDir, info, htd, wal, rsServices, reporter);</span>
+<span class="source-line-no">7814</span><span id="line-7814">  }</span>
+<span class="source-line-no">7815</span><span id="line-7815"></span>
+<span class="source-line-no">7816</span><span id="line-7816">  /**</span>
+<span class="source-line-no">7817</span><span id="line-7817">   * Open a Region.</span>
+<span class="source-line-no">7818</span><span id="line-7818">   * @param conf       The Configuration object to use.</span>
+<span class="source-line-no">7819</span><span id="line-7819">   * @param fs         Filesystem to use</span>
+<span class="source-line-no">7820</span><span id="line-7820">   * @param info       Info for region to be opened.</span>
+<span class="source-line-no">7821</span><span id="line-7821">   * @param htd        the table descriptor</span>
+<span class="source-line-no">7822</span><span id="line-7822">   * @param wal        WAL for region to use. This method will call WAL#setSequenceNumber(long)</span>
+<span class="source-line-no">7823</span><span id="line-7823">   *                   passing the result of the call to HRegion#getMinSequenceId() to ensure the</span>
+<span class="source-line-no">7824</span><span id="line-7824">   *                   wal id is properly kept up. HRegionStore does this every time it opens a new</span>
+<span class="source-line-no">7825</span><span id="line-7825">   *                   region.</span>
+<span class="source-line-no">7826</span><span id="line-7826">   * @param rsServices An interface we can request flushes against.</span>
+<span class="source-line-no">7827</span><span id="line-7827">   * @param reporter   An interface we can report progress against.</span>
+<span class="source-line-no">7828</span><span id="line-7828">   * @return new HRegion</span>
+<span class="source-line-no">7829</span><span id="line-7829">   * @throws NullPointerException if {@code info} is {@code null}</span>
+<span class="source-line-no">7830</span><span id="line-7830">   */</span>
+<span class="source-line-no">7831</span><span id="line-7831">  public static HRegion openHRegionFromTableDir(final Configuration conf, final FileSystem fs,</span>
+<span class="source-line-no">7832</span><span id="line-7832">    final Path tableDir, final RegionInfo info, final TableDescriptor htd, final WAL wal,</span>
+<span class="source-line-no">7833</span><span id="line-7833">    final RegionServerServices rsServices, final CancelableProgressable reporter)</span>
+<span class="source-line-no">7834</span><span id="line-7834">    throws IOException {</span>
+<span class="source-line-no">7835</span><span id="line-7835">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
+<span class="source-line-no">7836</span><span id="line-7836">    LOG.debug("Opening region: {}", info);</span>
+<span class="source-line-no">7837</span><span id="line-7837">    HRegion r = HRegion.newHRegion(tableDir, wal, fs, conf, info, htd, rsServices);</span>
+<span class="source-line-no">7838</span><span id="line-7838">    return r.openHRegion(reporter);</span>
+<span class="source-line-no">7839</span><span id="line-7839">  }</span>
+<span class="source-line-no">7840</span><span id="line-7840"></span>
+<span class="source-line-no">7841</span><span id="line-7841">  public NavigableMap&lt;byte[], Integer&gt; getReplicationScope() {</span>
+<span class="source-line-no">7842</span><span id="line-7842">    return this.replicationScope;</span>
+<span class="source-line-no">7843</span><span id="line-7843">  }</span>
+<span class="source-line-no">7844</span><span id="line-7844"></span>
+<span class="source-line-no">7845</span><span id="line-7845">  /**</span>
+<span class="source-line-no">7846</span><span id="line-7846">   * Useful when reopening a closed region (normally for unit tests)</span>
+<span class="source-line-no">7847</span><span id="line-7847">   * @param other    original object</span>
+<span class="source-line-no">7848</span><span id="line-7848">   * @param reporter An interface we can report progress against.</span>
+<span class="source-line-no">7849</span><span id="line-7849">   * @return new HRegion</span>
+<span class="source-line-no">7850</span><span id="line-7850">   */</span>
+<span class="source-line-no">7851</span><span id="line-7851">  public static HRegion openHRegion(final HRegion other, final CancelableProgressable reporter)</span>
+<span class="source-line-no">7852</span><span id="line-7852">    throws IOException {</span>
+<span class="source-line-no">7853</span><span id="line-7853">    HRegionFileSystem regionFs = other.getRegionFileSystem();</span>
+<span class="source-line-no">7854</span><span id="line-7854">    HRegion r = newHRegion(regionFs.getTableDir(), other.getWAL(), regionFs.getFileSystem(),</span>
+<span class="source-line-no">7855</span><span id="line-7855">      other.baseConf, other.getRegionInfo(), other.getTableDescriptor(), null);</span>
+<span class="source-line-no">7856</span><span id="line-7856">    return r.openHRegion(reporter);</span>
+<span class="source-line-no">7857</span><span id="line-7857">  }</span>
+<span class="source-line-no">7858</span><span id="line-7858"></span>
+<span class="source-line-no">7859</span><span id="line-7859">  public static Region openHRegion(final Region other, final CancelableProgressable reporter)</span>
+<span class="source-line-no">7860</span><span id="line-7860">    throws IOException {</span>
+<span class="source-line-no">7861</span><span id="line-7861">    return openHRegion((HRegion) other, reporter);</span>
+<span class="source-line-no">7862</span><span id="line-7862">  }</span>
+<span class="source-line-no">7863</span><span id="line-7863"></span>
+<span class="source-line-no">7864</span><span id="line-7864">  /**</span>
+<span class="source-line-no">7865</span><span id="line-7865">   * Open HRegion.</span>
+<span class="source-line-no">7866</span><span id="line-7866">   * &lt;p/&gt;</span>
+<span class="source-line-no">7867</span><span id="line-7867">   * Calls initialize and sets sequenceId.</span>
+<span class="source-line-no">7868</span><span id="line-7868">   * @return Returns &lt;code&gt;this&lt;/code&gt;</span>
+<span class="source-line-no">7869</span><span id="line-7869">   */</span>
+<span class="source-line-no">7870</span><span id="line-7870">  private HRegion openHRegion(final CancelableProgressable reporter) throws IOException {</span>
+<span class="source-line-no">7871</span><span id="line-7871">    try {</span>
+<span class="source-line-no">7872</span><span id="line-7872">      CompoundConfiguration cConfig =</span>
+<span class="source-line-no">7873</span><span id="line-7873">        new CompoundConfiguration().add(conf).addBytesMap(htableDescriptor.getValues());</span>
+<span class="source-line-no">7874</span><span id="line-7874">      // Refuse to open the region if we are missing local compression support</span>
+<span class="source-line-no">7875</span><span id="line-7875">      TableDescriptorChecker.checkCompression(cConfig, htableDescriptor);</span>
+<span class="source-line-no">7876</span><span id="line-7876">      // Refuse to open the region if encryption configuration is incorrect or</span>
+<span class="source-line-no">7877</span><span id="line-7877">      // codec support is missing</span>
+<span class="source-line-no">7878</span><span id="line-7878">      LOG.debug("checking encryption for " + this.getRegionInfo().getEncodedName());</span>
+<span class="source-line-no">7879</span><span id="line-7879">      TableDescriptorChecker.checkEncryption(cConfig, htableDescriptor);</span>
+<span class="source-line-no">7880</span><span id="line-7880">      // Refuse to open the region if a required class cannot be loaded</span>
+<span class="source-line-no">7881</span><span id="line-7881">      LOG.debug("checking classloading for " + this.getRegionInfo().getEncodedName());</span>
+<span class="source-line-no">7882</span><span id="line-7882">      TableDescriptorChecker.checkClassLoading(cConfig, htableDescriptor);</span>
+<span class="source-line-no">7883</span><span id="line-7883">      this.openSeqNum = initialize(reporter);</span>
+<span class="source-line-no">7884</span><span id="line-7884">      this.mvcc.advanceTo(openSeqNum);</span>
+<span class="source-line-no">7885</span><span id="line-7885">      // The openSeqNum must be increased every time when a region is assigned, as we rely on it to</span>
+<span class="source-line-no">7886</span><span id="line-7886">      // determine whether a region has been successfully reopened. So here we always write open</span>
+<span class="source-line-no">7887</span><span id="line-7887">      // marker, even if the table is read only.</span>
+<span class="source-line-no">7888</span><span id="line-7888">      if (</span>
+<span class="source-line-no">7889</span><span id="line-7889">        wal != null &amp;&amp; getRegionServerServices() != null</span>
+<span class="source-line-no">7890</span><span id="line-7890">          &amp;&amp; RegionReplicaUtil.isDefaultReplica(getRegionInfo())</span>
+<span class="source-line-no">7891</span><span id="line-7891">      ) {</span>
+<span class="source-line-no">7892</span><span id="line-7892">        writeRegionOpenMarker(wal, openSeqNum);</span>
+<span class="source-line-no">7893</span><span id="line-7893">      }</span>
+<span class="source-line-no">7894</span><span id="line-7894">    } catch (Throwable t) {</span>
+<span class="source-line-no">7895</span><span id="line-7895">      // By coprocessor path wrong region will open failed,</span>
+<span class="source-line-no">7896</span><span id="line-7896">      // MetricsRegionWrapperImpl is already init and not close,</span>
+<span class="source-line-no">7897</span><span id="line-7897">      // add region close when open failed</span>
+<span class="source-line-no">7898</span><span id="line-7898">      try {</span>
+<span class="source-line-no">7899</span><span id="line-7899">        // It is not required to write sequence id file when region open is failed.</span>
+<span class="source-line-no">7900</span><span id="line-7900">        // Passing true to skip the sequence id file write.</span>
+<span class="source-line-no">7901</span><span id="line-7901">        this.close(true);</span>
+<span class="source-line-no">7902</span><span id="line-7902">      } catch (Throwable e) {</span>
+<span class="source-line-no">7903</span><span id="line-7903">        LOG.warn("Open region: {} failed. Try close region but got exception ",</span>
+<span class="source-line-no">7904</span><span id="line-7904">          this.getRegionInfo(), e);</span>
+<span class="source-line-no">7905</span><span id="line-7905">      }</span>
+<span class="source-line-no">7906</span><span id="line-7906">      throw t;</span>
+<span class="source-line-no">7907</span><span id="line-7907">    }</span>
+<span class="source-line-no">7908</span><span id="line-7908">    return this;</span>
+<span class="source-line-no">7909</span><span id="line-7909">  }</span>
+<span class="source-line-no">7910</span><span id="line-7910"></span>
+<span class="source-line-no">7911</span><span id="line-7911">  /**</span>
+<span class="source-line-no">7912</span><span id="line-7912">   * Open a Region on a read-only file-system (like hdfs snapshots)</span>
+<span class="source-line-no">7913</span><span id="line-7913">   * @param conf The Configuration object to use.</span>
+<span class="source-line-no">7914</span><span id="line-7914">   * @param fs   Filesystem to use</span>
+<span class="source-line-no">7915</span><span id="line-7915">   * @param info Info for region to be opened.</span>
+<span class="source-line-no">7916</span><span id="line-7916">   * @param htd  the table descriptor</span>
+<span class="source-line-no">7917</span><span id="line-7917">   * @return new HRegion</span>
+<span class="source-line-no">7918</span><span id="line-7918">   * @throws NullPointerException if {@code info} is {@code null}</span>
+<span class="source-line-no">7919</span><span id="line-7919">   */</span>
+<span class="source-line-no">7920</span><span id="line-7920">  public static HRegion openReadOnlyFileSystemHRegion(final Configuration conf, final FileSystem fs,</span>
+<span class="source-line-no">7921</span><span id="line-7921">    final Path tableDir, RegionInfo info, final TableDescriptor htd) throws IOException {</span>
+<span class="source-line-no">7922</span><span id="line-7922">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
+<span class="source-line-no">7923</span><span id="line-7923">    if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">7924</span><span id="line-7924">      LOG.debug("Opening region (readOnly filesystem): " + info);</span>
+<span class="source-line-no">7925</span><span id="line-7925">    }</span>
+<span class="source-line-no">7926</span><span id="line-7926">    if (info.getReplicaId() &lt;= 0) {</span>
+<span class="source-line-no">7927</span><span id="line-7927">      info = RegionReplicaUtil.getRegionInfoForReplica(info, 1);</span>
+<span class="source-line-no">7928</span><span id="line-7928">    }</span>
+<span class="source-line-no">7929</span><span id="line-7929">    HRegion r = HRegion.newHRegion(tableDir, null, fs, conf, info, htd, null);</span>
+<span class="source-line-no">7930</span><span id="line-7930">    r.writestate.setReadOnly(true);</span>
+<span class="source-line-no">7931</span><span id="line-7931">    return r.openHRegion(null);</span>
+<span class="source-line-no">7932</span><span id="line-7932">  }</span>
+<span class="source-line-no">7933</span><span id="line-7933"></span>
+<span class="source-line-no">7934</span><span id="line-7934">  public static HRegion warmupHRegion(final RegionInfo info, final TableDescriptor htd,</span>
+<span class="source-line-no">7935</span><span id="line-7935">    final WAL wal, final Configuration conf, final RegionServerServices rsServices,</span>
+<span class="source-line-no">7936</span><span id="line-7936">    final CancelableProgressable reporter) throws IOException {</span>
+<span class="source-line-no">7937</span><span id="line-7937"></span>
+<span class="source-line-no">7938</span><span id="line-7938">    Objects.requireNonNull(info, "RegionInfo cannot be null");</span>
+<span class="source-line-no">7939</span><span id="line-7939">    LOG.debug("Warmup {}", info);</span>
+<span class="source-line-no">7940</span><span id="line-7940">    Path rootDir = CommonFSUtils.getRootDir(conf);</span>
+<span class="source-line-no">7941</span><span id="line-7941">    Path tableDir = CommonFSUtils.getTableDir(rootDir, info.getTable());</span>
+<span class="source-line-no">7942</span><span id="line-7942">    FileSystem fs = null;</span>
+<span class="source-line-no">7943</span><span id="line-7943">    if (rsServices != null) {</span>
+<span class="source-line-no">7944</span><span id="line-7944">      fs = rsServices.getFileSystem();</span>
+<span class="source-line-no">7945</span><span id="line-7945">    }</span>
+<span class="source-line-no">7946</span><span id="line-7946">    if (fs == null) {</span>
+<span class="source-line-no">7947</span><span id="line-7947">      fs = rootDir.getFileSystem(conf);</span>
+<span class="source-line-no">7948</span><span id="line-7948">    }</span>
+<span class="source-line-no">7949</span><span id="line-7949">    HRegion r = HRegion.newHRegion(tableDir, wal, fs, conf, info, htd, null);</span>
+<span class="source-line-no">7950</span><span id="line-7950">    r.initializeWarmup(reporter);</span>
+<span class="source-line-no">7951</span><span id="line-7951">    r.close();</span>
+<span class="source-line-no">7952</span><span id="line-7952">    return r;</span>
+<span class="source-line-no">7953</span><span id="line-7953">  }</span>
+<span class="source-line-no">7954</span><span id="line-7954"></span>
+<span class="source-line-no">7955</span><span id="line-7955">  /**</span>
+<span class="source-line-no">7956</span><span id="line-7956">   * Computes the Path of the HRegion</span>
+<span class="source-line-no">7957</span><span id="line-7957">   * @param tabledir qualified path for table</span>
+<span class="source-line-no">7958</span><span id="line-7958">   * @param name     ENCODED region name</span>
+<span class="source-line-no">7959</span><span id="line-7959">   * @return Path of HRegion directory</span>
+<span class="source-line-no">7960</span><span id="line-7960">   * @deprecated For tests only; to be removed.</span>
+<span class="source-line-no">7961</span><span id="line-7961">   */</span>
+<span class="source-line-no">7962</span><span id="line-7962">  @Deprecated</span>
+<span class="source-line-no">7963</span><span id="line-7963">  public static Path getRegionDir(final Path tabledir, final String name) {</span>
+<span class="source-line-no">7964</span><span id="line-7964">    return new Path(tabledir, name);</span>
+<span class="source-line-no">7965</span><span id="line-7965">  }</span>
+<span class="source-line-no">7966</span><span id="line-7966"></span>
+<span class="source-line-no">7967</span><span id="line-7967">  /**</span>
+<span class="source-line-no">7968</span><span id="line-7968">   * Determines if the specified row is within the row range specified by the specified RegionInfo</span>
+<span class="source-line-no">7969</span><span id="line-7969">   * @param info RegionInfo that specifies the row range</span>
+<span class="source-line-no">7970</span><span id="line-7970">   * @param row  row to be checked</span>
+<span class="source-line-no">7971</span><span id="line-7971">   * @return true if the row is within the range specified by the RegionInfo</span>
+<span class="source-line-no">7972</span><span id="line-7972">   */</span>
+<span class="source-line-no">7973</span><span id="line-7973">  public static boolean rowIsInRange(RegionInfo info, final byte[] row) {</span>
+<span class="source-line-no">7974</span><span id="line-7974">    return ((info.getStartKey().length == 0) || (Bytes.compareTo(info.getStartKey(), row) &lt;= 0))</span>
+<span class="source-line-no">7975</span><span id="line-7975">      &amp;&amp; ((info.getEndKey().length == 0) || (Bytes.compareTo(info.getEndKey(), row) &gt; 0));</span>
+<span class="source-line-no">7976</span><span id="line-7976">  }</span>
+<span class="source-line-no">7977</span><span id="line-7977"></span>
+<span class="source-line-no">7978</span><span id="line-7978">  public static boolean rowIsInRange(RegionInfo info, final byte[] row, final int offset,</span>
+<span class="source-line-no">7979</span><span id="line-7979">    final short length) {</span>
+<span class="source-line-no">7980</span><span id="line-7980">    return ((info.getStartKey().length == 0)</span>
+<span class="source-line-no">7981</span><span id="line-7981">      || (Bytes.compareTo(info.getStartKey(), 0, info.getStartKey().length, row, offset, length)</span>
+<span class="source-line-no">7982</span><span id="line-7982">          &lt;= 0))</span>
+<span class="source-line-no">7983</span><span id="line-7983">      &amp;&amp; ((info.getEndKey().length == 0)</span>
+<span class="source-line-no">7984</span><span id="line-7984">        || (Bytes.compareTo(info.getEndKey(), 0, info.getEndKey().length, row, offset, length)</span>
+<span class="source-line-no">7985</span><span id="line-7985">            &gt; 0));</span>
+<span class="source-line-no">7986</span><span id="line-7986">  }</span>
+<span class="source-line-no">7987</span><span id="line-7987"></span>
+<span class="source-line-no">7988</span><span id="line-7988">  @Override</span>
+<span class="source-line-no">7989</span><span id="line-7989">  public Result get(final Get get) throws IOException {</span>
+<span class="source-line-no">7990</span><span id="line-7990">    prepareGet(get);</span>
+<span class="source-line-no">7991</span><span id="line-7991">    List&lt;Cell&gt; results = get(get, true);</span>
+<span class="source-line-no">7992</span><span id="line-7992">    boolean stale = this.getRegionInfo().getReplicaId() != 0;</span>
+<span class="source-line-no">7993</span><span id="line-7993">    return Result.create(results, get.isCheckExistenceOnly() ? !results.isEmpty() : null, stale);</span>
+<span class="source-line-no">7994</span><span id="line-7994">  }</span>
+<span class="source-line-no">7995</span><span id="line-7995"></span>
+<span class="source-line-no">7996</span><span id="line-7996">  void prepareGet(final Get get) throws IOException {</span>
+<span class="source-line-no">7997</span><span id="line-7997">    checkRow(get.getRow(), "Get");</span>
+<span class="source-line-no">7998</span><span id="line-7998">    // Verify families are all valid</span>
+<span class="source-line-no">7999</span><span id="line-7999">    if (get.hasFamilies()) {</span>
+<span class="source-line-no">8000</span><span id="line-8000">      for (byte[] family : get.familySet()) {</span>
+<span class="source-line-no">8001</span><span id="line-8001">        checkFamily(family);</span>
+<span class="source-line-no">8002</span><span id="line-8002">      }</span>
+<span class="source-line-no">8003</span><span id="line-8003">    } else { // Adding all families to scanner</span>
+<span class="source-line-no">8004</span><span id="line-8004">      for (byte[] family : this.htableDescriptor.getColumnFamilyNames()) {</span>
+<span class="source-line-no">8005</span><span id="line-8005">        get.addFamily(family);</span>
+<span class="source-line-no">8006</span><span id="line-8006">      }</span>
+<span class="source-line-no">8007</span><span id="line-8007">    }</span>
+<span class="source-line-no">8008</span><span id="line-8008">  }</span>
+<span class="source-line-no">8009</span><span id="line-8009"></span>
+<span class="source-line-no">8010</span><span id="line-8010">  @Override</span>
+<span class="source-line-no">8011</span><span id="line-8011">  public List&lt;Cell&gt; get(Get get, boolean withCoprocessor) throws IOException {</span>
+<span class="source-line-no">8012</span><span id="line-8012">    return get(get, withCoprocessor, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
+<span class="source-line-no">8013</span><span id="line-8013">  }</span>
+<span class="source-line-no">8014</span><span id="line-8014"></span>
+<span class="source-line-no">8015</span><span id="line-8015">  private List&lt;Cell&gt; get(Get get, boolean withCoprocessor, long nonceGroup, long nonce)</span>
+<span class="source-line-no">8016</span><span id="line-8016">    throws IOException {</span>
+<span class="source-line-no">8017</span><span id="line-8017">    return TraceUtil.trace(() -&gt; getInternal(get, withCoprocessor, nonceGroup, nonce),</span>
+<span class="source-line-no">8018</span><span id="line-8018">      () -&gt; createRegionSpan("Region.get"));</span>
+<span class="source-line-no">8019</span><span id="line-8019">  }</span>
+<span class="source-line-no">8020</span><span id="line-8020"></span>
+<span class="source-line-no">8021</span><span id="line-8021">  private List&lt;Cell&gt; getInternal(Get get, boolean withCoprocessor, long nonceGroup, long nonce)</span>
+<span class="source-line-no">8022</span><span id="line-8022">    throws IOException {</span>
+<span class="source-line-no">8023</span><span id="line-8023">    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">8024</span><span id="line-8024"></span>
+<span class="source-line-no">8025</span><span id="line-8025">    // pre-get CP hook</span>
+<span class="source-line-no">8026</span><span id="line-8026">    if (withCoprocessor &amp;&amp; (coprocessorHost != null)) {</span>
+<span class="source-line-no">8027</span><span id="line-8027">      if (coprocessorHost.preGet(get, results)) {</span>
+<span class="source-line-no">8028</span><span id="line-8028">        metricsUpdateForGet();</span>
+<span class="source-line-no">8029</span><span id="line-8029">        return results;</span>
+<span class="source-line-no">8030</span><span id="line-8030">      }</span>
+<span class="source-line-no">8031</span><span id="line-8031">    }</span>
+<span class="source-line-no">8032</span><span id="line-8032">    Scan scan = new Scan(get);</span>
+<span class="source-line-no">8033</span><span id="line-8033">    if (scan.getLoadColumnFamiliesOnDemandValue() == null) {</span>
+<span class="source-line-no">8034</span><span id="line-8034">      scan.setLoadColumnFamiliesOnDemand(isLoadingCfsOnDemandDefault());</span>
+<span class="source-line-no">8035</span><span id="line-8035">    }</span>
+<span class="source-line-no">8036</span><span id="line-8036">    try (RegionScanner scanner = getScanner(scan, null, nonceGroup, nonce)) {</span>
+<span class="source-line-no">8037</span><span id="line-8037">      List&lt;Cell&gt; tmp = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">8038</span><span id="line-8038">      scanner.next(tmp);</span>
+<span class="source-line-no">8039</span><span id="line-8039">      // Copy EC to heap, then close the scanner.</span>
+<span class="source-line-no">8040</span><span id="line-8040">      // This can be an EXPENSIVE call. It may make an extra copy from offheap to onheap buffers.</span>
+<span class="source-line-no">8041</span><span id="line-8041">      // See more details in HBASE-26036.</span>
+<span class="source-line-no">8042</span><span id="line-8042">      for (Cell cell : tmp) {</span>
+<span class="source-line-no">8043</span><span id="line-8043">        results.add(CellUtil.cloneIfNecessary(cell));</span>
+<span class="source-line-no">8044</span><span id="line-8044">      }</span>
+<span class="source-line-no">8045</span><span id="line-8045">    }</span>
+<span class="source-line-no">8046</span><span id="line-8046"></span>
+<span class="source-line-no">8047</span><span id="line-8047">    // post-get CP hook</span>
+<span class="source-line-no">8048</span><span id="line-8048">    if (withCoprocessor &amp;&amp; (coprocessorHost != null)) {</span>
+<span class="source-line-no">8049</span><span id="line-8049">      coprocessorHost.postGet(get, results);</span>
 <span class="source-line-no">8050</span><span id="line-8050">    }</span>
 <span class="source-line-no">8051</span><span id="line-8051"></span>
-<span class="source-line-no">8052</span><span id="line-8052">  }</span>
+<span class="source-line-no">8052</span><span id="line-8052">    metricsUpdateForGet();</span>
 <span class="source-line-no">8053</span><span id="line-8053"></span>
-<span class="source-line-no">8054</span><span id="line-8054">  @Override</span>
-<span class="source-line-no">8055</span><span id="line-8055">  public Result mutateRow(RowMutations rm) throws IOException {</span>
-<span class="source-line-no">8056</span><span id="line-8056">    return mutateRow(rm, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
-<span class="source-line-no">8057</span><span id="line-8057">  }</span>
-<span class="source-line-no">8058</span><span id="line-8058"></span>
-<span class="source-line-no">8059</span><span id="line-8059">  public Result mutateRow(RowMutations rm, long nonceGroup, long nonce) throws IOException {</span>
-<span class="source-line-no">8060</span><span id="line-8060">    final List&lt;Mutation&gt; m = rm.getMutations();</span>
-<span class="source-line-no">8061</span><span id="line-8061">    OperationStatus[] statuses = batchMutate(m.toArray(new Mutation[0]), true, nonceGroup, nonce);</span>
-<span class="source-line-no">8062</span><span id="line-8062"></span>
-<span class="source-line-no">8063</span><span id="line-8063">    List&lt;Result&gt; results = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">8064</span><span id="line-8064">    for (OperationStatus status : statuses) {</span>
-<span class="source-line-no">8065</span><span id="line-8065">      if (status.getResult() != null) {</span>
-<span class="source-line-no">8066</span><span id="line-8066">        results.add(status.getResult());</span>
-<span class="source-line-no">8067</span><span id="line-8067">      }</span>
-<span class="source-line-no">8068</span><span id="line-8068">    }</span>
-<span class="source-line-no">8069</span><span id="line-8069"></span>
-<span class="source-line-no">8070</span><span id="line-8070">    if (results.isEmpty()) {</span>
-<span class="source-line-no">8071</span><span id="line-8071">      return null;</span>
-<span class="source-line-no">8072</span><span id="line-8072">    }</span>
-<span class="source-line-no">8073</span><span id="line-8073"></span>
-<span class="source-line-no">8074</span><span id="line-8074">    // Merge the results of the Increment/Append operations</span>
-<span class="source-line-no">8075</span><span id="line-8075">    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">8076</span><span id="line-8076">    for (Result result : results) {</span>
-<span class="source-line-no">8077</span><span id="line-8077">      if (result.rawCells() != null) {</span>
-<span class="source-line-no">8078</span><span id="line-8078">        cells.addAll(Arrays.asList(result.rawCells()));</span>
-<span class="source-line-no">8079</span><span id="line-8079">      }</span>
-<span class="source-line-no">8080</span><span id="line-8080">    }</span>
-<span class="source-line-no">8081</span><span id="line-8081">    return Result.create(cells);</span>
-<span class="source-line-no">8082</span><span id="line-8082">  }</span>
-<span class="source-line-no">8083</span><span id="line-8083"></span>
-<span class="source-line-no">8084</span><span id="line-8084">  /**</span>
-<span class="source-line-no">8085</span><span id="line-8085">   * Perform atomic (all or none) mutations within the region.</span>
-<span class="source-line-no">8086</span><span id="line-8086">   * @param mutations  The list of mutations to perform. &lt;code&gt;mutations&lt;/code&gt; can contain</span>
-<span class="source-line-no">8087</span><span id="line-8087">   *                   operations for multiple rows. Caller has to ensure that all rows are</span>
-<span class="source-line-no">8088</span><span id="line-8088">   *                   contained in this region.</span>
-<span class="source-line-no">8089</span><span id="line-8089">   * @param rowsToLock Rows to lock</span>
-<span class="source-line-no">8090</span><span id="line-8090">   * @param nonceGroup Optional nonce group of the operation (client Id)</span>
-<span class="source-line-no">8091</span><span id="line-8091">   * @param nonce      Optional nonce of the operation (unique random id to ensure "more</span>
-<span class="source-line-no">8092</span><span id="line-8092">   *                   idempotence") If multiple rows are locked care should be taken that</span>
-<span class="source-line-no">8093</span><span id="line-8093">   *                   &lt;code&gt;rowsToLock&lt;/code&gt; is sorted in order to avoid deadlocks.</span>
-<span class="source-line-no">8094</span><span id="line-8094">   */</span>
-<span class="source-line-no">8095</span><span id="line-8095">  @Override</span>
-<span class="source-line-no">8096</span><span id="line-8096">  public void mutateRowsWithLocks(Collection&lt;Mutation&gt; mutations, Collection&lt;byte[]&gt; rowsToLock,</span>
-<span class="source-line-no">8097</span><span id="line-8097">    long nonceGroup, long nonce) throws IOException {</span>
-<span class="source-line-no">8098</span><span id="line-8098">    batchMutate(new MutationBatchOperation(this, mutations.toArray(new Mutation[mutations.size()]),</span>
-<span class="source-line-no">8099</span><span id="line-8099">      true, nonceGroup, nonce) {</span>
-<span class="source-line-no">8100</span><span id="line-8100">      @Override</span>
-<span class="source-line-no">8101</span><span id="line-8101">      public MiniBatchOperationInProgress&lt;Mutation&gt;</span>
-<span class="source-line-no">8102</span><span id="line-8102">        lockRowsAndBuildMiniBatch(List&lt;RowLock&gt; acquiredRowLocks) throws IOException {</span>
-<span class="source-line-no">8103</span><span id="line-8103">        RowLock prevRowLock = null;</span>
-<span class="source-line-no">8104</span><span id="line-8104">        for (byte[] row : rowsToLock) {</span>
-<span class="source-line-no">8105</span><span id="line-8105">          try {</span>
-<span class="source-line-no">8106</span><span id="line-8106">            RowLock rowLock = region.getRowLock(row, false, prevRowLock); // write lock</span>
-<span class="source-line-no">8107</span><span id="line-8107">            if (rowLock != prevRowLock) {</span>
-<span class="source-line-no">8108</span><span id="line-8108">              acquiredRowLocks.add(rowLock);</span>
-<span class="source-line-no">8109</span><span id="line-8109">              prevRowLock = rowLock;</span>
-<span class="source-line-no">8110</span><span id="line-8110">            }</span>
-<span class="source-line-no">8111</span><span id="line-8111">          } catch (IOException ioe) {</span>
-<span class="source-line-no">8112</span><span id="line-8112">            LOG.warn("Failed getting lock, row={}, in region {}", Bytes.toStringBinary(row), this,</span>
-<span class="source-line-no">8113</span><span id="line-8113">              ioe);</span>
-<span class="source-line-no">8114</span><span id="line-8114">            throw ioe;</span>
-<span class="source-line-no">8115</span><span id="line-8115">          }</span>
-<span class="source-line-no">8116</span><span id="line-8116">        }</span>
-<span class="source-line-no">8117</span><span id="line-8117">        return createMiniBatch(size(), size());</span>
-<span class="source-line-no">8118</span><span id="line-8118">      }</span>
-<span class="source-line-no">8119</span><span id="line-8119">    });</span>
-<span class="source-line-no">8120</span><span id="line-8120">  }</span>
-<span class="source-line-no">8121</span><span id="line-8121"></span>
-<span class="source-line-no">8122</span><span id="line-8122">  /** Returns statistics about the current load of the region */</span>
-<span class="source-line-no">8123</span><span id="line-8123">  public ClientProtos.RegionLoadStats getLoadStatistics() {</span>
-<span class="source-line-no">8124</span><span id="line-8124">    if (!regionStatsEnabled) {</span>
-<span class="source-line-no">8125</span><span id="line-8125">      return null;</span>
-<span class="source-line-no">8126</span><span id="line-8126">    }</span>
-<span class="source-line-no">8127</span><span id="line-8127">    ClientProtos.RegionLoadStats.Builder stats = ClientProtos.RegionLoadStats.newBuilder();</span>
-<span class="source-line-no">8128</span><span id="line-8128">    stats.setMemStoreLoad((int) (Math.min(100,</span>
-<span class="source-line-no">8129</span><span id="line-8129">      (this.memStoreSizing.getMemStoreSize().getHeapSize() * 100) / this.memstoreFlushSize)));</span>
-<span class="source-line-no">8130</span><span id="line-8130">    if (rsServices.getHeapMemoryManager() != null) {</span>
-<span class="source-line-no">8131</span><span id="line-8131">      // the HeapMemoryManager uses -0.0 to signal a problem asking the JVM,</span>
-<span class="source-line-no">8132</span><span id="line-8132">      // so we could just do the calculation below and we'll get a 0.</span>
-<span class="source-line-no">8133</span><span id="line-8133">      // treating it as a special case analogous to no HMM instead so that it can be</span>
-<span class="source-line-no">8134</span><span id="line-8134">      // programatically treated different from using &lt;1% of heap.</span>
-<span class="source-line-no">8135</span><span id="line-8135">      final float occupancy = rsServices.getHeapMemoryManager().getHeapOccupancyPercent();</span>
-<span class="source-line-no">8136</span><span id="line-8136">      if (occupancy != HeapMemoryManager.HEAP_OCCUPANCY_ERROR_VALUE) {</span>
-<span class="source-line-no">8137</span><span id="line-8137">        stats.setHeapOccupancy((int) (occupancy * 100));</span>
-<span class="source-line-no">8138</span><span id="line-8138">      }</span>
+<span class="source-line-no">8054</span><span id="line-8054">    return results;</span>
+<span class="source-line-no">8055</span><span id="line-8055">  }</span>
+<span class="source-line-no">8056</span><span id="line-8056"></span>
+<span class="source-line-no">8057</span><span id="line-8057">  void metricsUpdateForGet() {</span>
+<span class="source-line-no">8058</span><span id="line-8058">    if (this.metricsRegion != null) {</span>
+<span class="source-line-no">8059</span><span id="line-8059">      this.metricsRegion.updateGet();</span>
+<span class="source-line-no">8060</span><span id="line-8060">    }</span>
+<span class="source-line-no">8061</span><span id="line-8061">    if (this.rsServices != null &amp;&amp; this.rsServices.getMetrics() != null) {</span>
+<span class="source-line-no">8062</span><span id="line-8062">      rsServices.getMetrics().updateReadQueryMeter(this, 1);</span>
+<span class="source-line-no">8063</span><span id="line-8063">    }</span>
+<span class="source-line-no">8064</span><span id="line-8064"></span>
+<span class="source-line-no">8065</span><span id="line-8065">  }</span>
+<span class="source-line-no">8066</span><span id="line-8066"></span>
+<span class="source-line-no">8067</span><span id="line-8067">  @Override</span>
+<span class="source-line-no">8068</span><span id="line-8068">  public Result mutateRow(RowMutations rm) throws IOException {</span>
+<span class="source-line-no">8069</span><span id="line-8069">    return mutateRow(rm, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
+<span class="source-line-no">8070</span><span id="line-8070">  }</span>
+<span class="source-line-no">8071</span><span id="line-8071"></span>
+<span class="source-line-no">8072</span><span id="line-8072">  public Result mutateRow(RowMutations rm, long nonceGroup, long nonce) throws IOException {</span>
+<span class="source-line-no">8073</span><span id="line-8073">    final List&lt;Mutation&gt; m = rm.getMutations();</span>
+<span class="source-line-no">8074</span><span id="line-8074">    OperationStatus[] statuses = batchMutate(m.toArray(new Mutation[0]), true, nonceGroup, nonce);</span>
+<span class="source-line-no">8075</span><span id="line-8075"></span>
+<span class="source-line-no">8076</span><span id="line-8076">    List&lt;Result&gt; results = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">8077</span><span id="line-8077">    for (OperationStatus status : statuses) {</span>
+<span class="source-line-no">8078</span><span id="line-8078">      if (status.getResult() != null) {</span>
+<span class="source-line-no">8079</span><span id="line-8079">        results.add(status.getResult());</span>
+<span class="source-line-no">8080</span><span id="line-8080">      }</span>
+<span class="source-line-no">8081</span><span id="line-8081">    }</span>
+<span class="source-line-no">8082</span><span id="line-8082"></span>
+<span class="source-line-no">8083</span><span id="line-8083">    if (results.isEmpty()) {</span>
+<span class="source-line-no">8084</span><span id="line-8084">      return null;</span>
+<span class="source-line-no">8085</span><span id="line-8085">    }</span>
+<span class="source-line-no">8086</span><span id="line-8086"></span>
+<span class="source-line-no">8087</span><span id="line-8087">    // Merge the results of the Increment/Append operations</span>
+<span class="source-line-no">8088</span><span id="line-8088">    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">8089</span><span id="line-8089">    for (Result result : results) {</span>
+<span class="source-line-no">8090</span><span id="line-8090">      if (result.rawCells() != null) {</span>
+<span class="source-line-no">8091</span><span id="line-8091">        cells.addAll(Arrays.asList(result.rawCells()));</span>
+<span class="source-line-no">8092</span><span id="line-8092">      }</span>
+<span class="source-line-no">8093</span><span id="line-8093">    }</span>
+<span class="source-line-no">8094</span><span id="line-8094">    return Result.create(cells);</span>
+<span class="source-line-no">8095</span><span id="line-8095">  }</span>
+<span class="source-line-no">8096</span><span id="line-8096"></span>
+<span class="source-line-no">8097</span><span id="line-8097">  /**</span>
+<span class="source-line-no">8098</span><span id="line-8098">   * Perform atomic (all or none) mutations within the region.</span>
+<span class="source-line-no">8099</span><span id="line-8099">   * @param mutations  The list of mutations to perform. &lt;code&gt;mutations&lt;/code&gt; can contain</span>
+<span class="source-line-no">8100</span><span id="line-8100">   *                   operations for multiple rows. Caller has to ensure that all rows are</span>
+<span class="source-line-no">8101</span><span id="line-8101">   *                   contained in this region.</span>
+<span class="source-line-no">8102</span><span id="line-8102">   * @param rowsToLock Rows to lock</span>
+<span class="source-line-no">8103</span><span id="line-8103">   * @param nonceGroup Optional nonce group of the operation (client Id)</span>
+<span class="source-line-no">8104</span><span id="line-8104">   * @param nonce      Optional nonce of the operation (unique random id to ensure "more</span>
+<span class="source-line-no">8105</span><span id="line-8105">   *                   idempotence") If multiple rows are locked care should be taken that</span>
+<span class="source-line-no">8106</span><span id="line-8106">   *                   &lt;code&gt;rowsToLock&lt;/code&gt; is sorted in order to avoid deadlocks.</span>
+<span class="source-line-no">8107</span><span id="line-8107">   */</span>
+<span class="source-line-no">8108</span><span id="line-8108">  @Override</span>
+<span class="source-line-no">8109</span><span id="line-8109">  public void mutateRowsWithLocks(Collection&lt;Mutation&gt; mutations, Collection&lt;byte[]&gt; rowsToLock,</span>
+<span class="source-line-no">8110</span><span id="line-8110">    long nonceGroup, long nonce) throws IOException {</span>
+<span class="source-line-no">8111</span><span id="line-8111">    batchMutate(new MutationBatchOperation(this, mutations.toArray(new Mutation[mutations.size()]),</span>
+<span class="source-line-no">8112</span><span id="line-8112">      true, nonceGroup, nonce) {</span>
+<span class="source-line-no">8113</span><span id="line-8113">      @Override</span>
+<span class="source-line-no">8114</span><span id="line-8114">      public MiniBatchOperationInProgress&lt;Mutation&gt;</span>
+<span class="source-line-no">8115</span><span id="line-8115">        lockRowsAndBuildMiniBatch(List&lt;RowLock&gt; acquiredRowLocks) throws IOException {</span>
+<span class="source-line-no">8116</span><span id="line-8116">        RowLock prevRowLock = null;</span>
+<span class="source-line-no">8117</span><span id="line-8117">        for (byte[] row : rowsToLock) {</span>
+<span class="source-line-no">8118</span><span id="line-8118">          try {</span>
+<span class="source-line-no">8119</span><span id="line-8119">            RowLock rowLock = region.getRowLock(row, false, prevRowLock); // write lock</span>
+<span class="source-line-no">8120</span><span id="line-8120">            if (rowLock != prevRowLock) {</span>
+<span class="source-line-no">8121</span><span id="line-8121">              acquiredRowLocks.add(rowLock);</span>
+<span class="source-line-no">8122</span><span id="line-8122">              prevRowLock = rowLock;</span>
+<span class="source-line-no">8123</span><span id="line-8123">            }</span>
+<span class="source-line-no">8124</span><span id="line-8124">          } catch (IOException ioe) {</span>
+<span class="source-line-no">8125</span><span id="line-8125">            LOG.warn("Failed getting lock, row={}, in region {}", Bytes.toStringBinary(row), this,</span>
+<span class="source-line-no">8126</span><span id="line-8126">              ioe);</span>
+<span class="source-line-no">8127</span><span id="line-8127">            throw ioe;</span>
+<span class="source-line-no">8128</span><span id="line-8128">          }</span>
+<span class="source-line-no">8129</span><span id="line-8129">        }</span>
+<span class="source-line-no">8130</span><span id="line-8130">        return createMiniBatch(size(), size());</span>
+<span class="source-line-no">8131</span><span id="line-8131">      }</span>
+<span class="source-line-no">8132</span><span id="line-8132">    });</span>
+<span class="source-line-no">8133</span><span id="line-8133">  }</span>
+<span class="source-line-no">8134</span><span id="line-8134"></span>
+<span class="source-line-no">8135</span><span id="line-8135">  /** Returns statistics about the current load of the region */</span>
+<span class="source-line-no">8136</span><span id="line-8136">  public ClientProtos.RegionLoadStats getLoadStatistics() {</span>
+<span class="source-line-no">8137</span><span id="line-8137">    if (!regionStatsEnabled) {</span>
+<span class="source-line-no">8138</span><span id="line-8138">      return null;</span>
 <span class="source-line-no">8139</span><span id="line-8139">    }</span>
-<span class="source-line-no">8140</span><span id="line-8140">    stats.setCompactionPressure((int) (rsServices.getCompactionPressure() * 100 &gt; 100</span>
-<span class="source-line-no">8141</span><span id="line-8141">      ? 100</span>
-<span class="source-line-no">8142</span><span id="line-8142">      : rsServices.getCompactionPressure() * 100));</span>
-<span class="source-line-no">8143</span><span id="line-8143">    return stats.build();</span>
-<span class="source-line-no">8144</span><span id="line-8144">  }</span>
-<span class="source-line-no">8145</span><span id="line-8145"></span>
-<span class="source-line-no">8146</span><span id="line-8146">  @Override</span>
-<span class="source-line-no">8147</span><span id="line-8147">  public Result append(Append append) throws IOException {</span>
-<span class="source-line-no">8148</span><span id="line-8148">    return append(append, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
-<span class="source-line-no">8149</span><span id="line-8149">  }</span>
-<span class="source-line-no">8150</span><span id="line-8150"></span>
-<span class="source-line-no">8151</span><span id="line-8151">  public Result append(Append append, long nonceGroup, long nonce) throws IOException {</span>
-<span class="source-line-no">8152</span><span id="line-8152">    return TraceUtil.trace(() -&gt; {</span>
-<span class="source-line-no">8153</span><span id="line-8153">      checkReadOnly();</span>
-<span class="source-line-no">8154</span><span id="line-8154">      checkResources();</span>
-<span class="source-line-no">8155</span><span id="line-8155">      startRegionOperation(Operation.APPEND);</span>
-<span class="source-line-no">8156</span><span id="line-8156">      try {</span>
-<span class="source-line-no">8157</span><span id="line-8157">        // All edits for the given row (across all column families) must happen atomically.</span>
-<span class="source-line-no">8158</span><span id="line-8158">        return mutate(append, true, nonceGroup, nonce).getResult();</span>
-<span class="source-line-no">8159</span><span id="line-8159">      } finally {</span>
-<span class="source-line-no">8160</span><span id="line-8160">        closeRegionOperation(Operation.APPEND);</span>
-<span class="source-line-no">8161</span><span id="line-8161">      }</span>
-<span class="source-line-no">8162</span><span id="line-8162">    }, () -&gt; createRegionSpan("Region.append"));</span>
-<span class="source-line-no">8163</span><span id="line-8163">  }</span>
-<span class="source-line-no">8164</span><span id="line-8164"></span>
-<span class="source-line-no">8165</span><span id="line-8165">  @Override</span>
-<span class="source-line-no">8166</span><span id="line-8166">  public Result increment(Increment increment) throws IOException {</span>
-<span class="source-line-no">8167</span><span id="line-8167">    return increment(increment, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
-<span class="source-line-no">8168</span><span id="line-8168">  }</span>
-<span class="source-line-no">8169</span><span id="line-8169"></span>
-<span class="source-line-no">8170</span><span id="line-8170">  public Result increment(Increment increment, long nonceGroup, long nonce) throws IOException {</span>
-<span class="source-line-no">8171</span><span id="line-8171">    return TraceUtil.trace(() -&gt; {</span>
-<span class="source-line-no">8172</span><span id="line-8172">      checkReadOnly();</span>
-<span class="source-line-no">8173</span><span id="line-8173">      checkResources();</span>
-<span class="source-line-no">8174</span><span id="line-8174">      startRegionOperation(Operation.INCREMENT);</span>
-<span class="source-line-no">8175</span><span id="line-8175">      try {</span>
-<span class="source-line-no">8176</span><span id="line-8176">        // All edits for the given row (across all column families) must happen atomically.</span>
-<span class="source-line-no">8177</span><span id="line-8177">        return mutate(increment, true, nonceGroup, nonce).getResult();</span>
-<span class="source-line-no">8178</span><span id="line-8178">      } finally {</span>
-<span class="source-line-no">8179</span><span id="line-8179">        closeRegionOperation(Operation.INCREMENT);</span>
-<span class="source-line-no">8180</span><span id="line-8180">      }</span>
-<span class="source-line-no">8181</span><span id="line-8181">    }, () -&gt; createRegionSpan("Region.increment"));</span>
-<span class="source-line-no">8182</span><span id="line-8182">  }</span>
-<span class="source-line-no">8183</span><span id="line-8183"></span>
-<span class="source-line-no">8184</span><span id="line-8184">  private WALKeyImpl createWALKeyForWALAppend(boolean isReplay, BatchOperation&lt;?&gt; batchOp, long now,</span>
-<span class="source-line-no">8185</span><span id="line-8185">    long nonceGroup, long nonce) {</span>
-<span class="source-line-no">8186</span><span id="line-8186">    WALKeyImpl walKey = isReplay</span>
-<span class="source-line-no">8187</span><span id="line-8187">      ? new WALKeyImpl(this.getRegionInfo().getEncodedNameAsBytes(),</span>
-<span class="source-line-no">8188</span><span id="line-8188">        this.htableDescriptor.getTableName(), SequenceId.NO_SEQUENCE_ID, now,</span>
-<span class="source-line-no">8189</span><span id="line-8189">        batchOp.getClusterIds(), nonceGroup, nonce, mvcc)</span>
-<span class="source-line-no">8190</span><span id="line-8190">      : new WALKeyImpl(this.getRegionInfo().getEncodedNameAsBytes(),</span>
-<span class="source-line-no">8191</span><span id="line-8191">        this.htableDescriptor.getTableName(), SequenceId.NO_SEQUENCE_ID, now,</span>
-<span class="source-line-no">8192</span><span id="line-8192">        batchOp.getClusterIds(), nonceGroup, nonce, mvcc, this.getReplicationScope());</span>
-<span class="source-line-no">8193</span><span id="line-8193">    if (isReplay) {</span>
-<span class="source-line-no">8194</span><span id="line-8194">      walKey.setOrigLogSeqNum(batchOp.getOrigLogSeqNum());</span>
-<span class="source-line-no">8195</span><span id="line-8195">    }</span>
-<span class="source-line-no">8196</span><span id="line-8196">    return walKey;</span>
-<span class="source-line-no">8197</span><span id="line-8197">  }</span>
-<span class="source-line-no">8198</span><span id="line-8198"></span>
-<span class="source-line-no">8199</span><span id="line-8199">  /** Returns writeEntry associated with this append */</span>
-<span class="source-line-no">8200</span><span id="line-8200">  private WriteEntry doWALAppend(WALEdit walEdit, BatchOperation&lt;?&gt; batchOp,</span>
-<span class="source-line-no">8201</span><span id="line-8201">    MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, long now, NonceKey nonceKey)</span>
-<span class="source-line-no">8202</span><span id="line-8202">    throws IOException {</span>
-<span class="source-line-no">8203</span><span id="line-8203">    Preconditions.checkArgument(walEdit != null &amp;&amp; !walEdit.isEmpty(), "WALEdit is null or empty!");</span>
-<span class="source-line-no">8204</span><span id="line-8204">    Preconditions.checkArgument(</span>
-<span class="source-line-no">8205</span><span id="line-8205">      !walEdit.isReplay() || batchOp.getOrigLogSeqNum() != SequenceId.NO_SEQUENCE_ID,</span>
-<span class="source-line-no">8206</span><span id="line-8206">      "Invalid replay sequence Id for replay WALEdit!");</span>
-<span class="source-line-no">8207</span><span id="line-8207"></span>
-<span class="source-line-no">8208</span><span id="line-8208">    WALKeyImpl walKey = createWALKeyForWALAppend(walEdit.isReplay(), batchOp, now,</span>
-<span class="source-line-no">8209</span><span id="line-8209">      nonceKey.getNonceGroup(), nonceKey.getNonce());</span>
-<span class="source-line-no">8210</span><span id="line-8210">    // don't call the coproc hook for writes to the WAL caused by</span>
-<span class="source-line-no">8211</span><span id="line-8211">    // system lifecycle events like flushes or compactions</span>
-<span class="source-line-no">8212</span><span id="line-8212">    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {</span>
-<span class="source-line-no">8213</span><span id="line-8213">      this.coprocessorHost.preWALAppend(walKey, walEdit);</span>
-<span class="source-line-no">8214</span><span id="line-8214">    }</span>
-<span class="source-line-no">8215</span><span id="line-8215">    try {</span>
-<span class="source-line-no">8216</span><span id="line-8216">      long txid = this.wal.appendData(this.getRegionInfo(), walKey, walEdit);</span>
-<span class="source-line-no">8217</span><span id="line-8217">      WriteEntry writeEntry = walKey.getWriteEntry();</span>
-<span class="source-line-no">8218</span><span id="line-8218">      // Call sync on our edit.</span>
-<span class="source-line-no">8219</span><span id="line-8219">      if (txid != 0) {</span>
-<span class="source-line-no">8220</span><span id="line-8220">        sync(txid, batchOp.durability);</span>
-<span class="source-line-no">8221</span><span id="line-8221">      }</span>
-<span class="source-line-no">8222</span><span id="line-8222">      /**</span>
-<span class="source-line-no">8223</span><span id="line-8223">       * If above {@link HRegion#sync} throws Exception, the RegionServer should be aborted and</span>
-<span class="source-line-no">8224</span><span id="line-8224">       * following {@link BatchOperation#writeMiniBatchOperationsToMemStore} will not be executed,</span>
-<span class="source-line-no">8225</span><span id="line-8225">       * so there is no need to replicate to secondary replica, for this reason here we attach the</span>
-<span class="source-line-no">8226</span><span id="line-8226">       * region replication action after the {@link HRegion#sync} is successful.</span>
-<span class="source-line-no">8227</span><span id="line-8227">       */</span>
-<span class="source-line-no">8228</span><span id="line-8228">      this.attachRegionReplicationInWALAppend(batchOp, miniBatchOp, walKey, walEdit, writeEntry);</span>
-<span class="source-line-no">8229</span><span id="line-8229">      return writeEntry;</span>
-<span class="source-line-no">8230</span><span id="line-8230">    } catch (IOException ioe) {</span>
-<span class="source-line-no">8231</span><span id="line-8231">      if (walKey.getWriteEntry() != null) {</span>
-<span class="source-line-no">8232</span><span id="line-8232">        mvcc.complete(walKey.getWriteEntry());</span>
-<span class="source-line-no">8233</span><span id="line-8233">      }</span>
-<span class="source-line-no">8234</span><span id="line-8234"></span>
+<span class="source-line-no">8140</span><span id="line-8140">    ClientProtos.RegionLoadStats.Builder stats = ClientProtos.RegionLoadStats.newBuilder();</span>
+<span class="source-line-no">8141</span><span id="line-8141">    stats.setMemStoreLoad((int) (Math.min(100,</span>
+<span class="source-line-no">8142</span><span id="line-8142">      (this.memStoreSizing.getMemStoreSize().getHeapSize() * 100) / this.memstoreFlushSize)));</span>
+<span class="source-line-no">8143</span><span id="line-8143">    if (rsServices.getHeapMemoryManager() != null) {</span>
+<span class="source-line-no">8144</span><span id="line-8144">      // the HeapMemoryManager uses -0.0 to signal a problem asking the JVM,</span>
+<span class="source-line-no">8145</span><span id="line-8145">      // so we could just do the calculation below and we'll get a 0.</span>
+<span class="source-line-no">8146</span><span id="line-8146">      // treating it as a special case analogous to no HMM instead so that it can be</span>
+<span class="source-line-no">8147</span><span id="line-8147">      // programatically treated different from using &lt;1% of heap.</span>
+<span class="source-line-no">8148</span><span id="line-8148">      final float occupancy = rsServices.getHeapMemoryManager().getHeapOccupancyPercent();</span>
+<span class="source-line-no">8149</span><span id="line-8149">      if (occupancy != HeapMemoryManager.HEAP_OCCUPANCY_ERROR_VALUE) {</span>
+<span class="source-line-no">8150</span><span id="line-8150">        stats.setHeapOccupancy((int) (occupancy * 100));</span>
+<span class="source-line-no">8151</span><span id="line-8151">      }</span>
+<span class="source-line-no">8152</span><span id="line-8152">    }</span>
+<span class="source-line-no">8153</span><span id="line-8153">    stats.setCompactionPressure((int) (rsServices.getCompactionPressure() * 100 &gt; 100</span>
+<span class="source-line-no">8154</span><span id="line-8154">      ? 100</span>
+<span class="source-line-no">8155</span><span id="line-8155">      : rsServices.getCompactionPressure() * 100));</span>
+<span class="source-line-no">8156</span><span id="line-8156">    return stats.build();</span>
+<span class="source-line-no">8157</span><span id="line-8157">  }</span>
+<span class="source-line-no">8158</span><span id="line-8158"></span>
+<span class="source-line-no">8159</span><span id="line-8159">  @Override</span>
+<span class="source-line-no">8160</span><span id="line-8160">  public Result append(Append append) throws IOException {</span>
+<span class="source-line-no">8161</span><span id="line-8161">    return append(append, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
+<span class="source-line-no">8162</span><span id="line-8162">  }</span>
+<span class="source-line-no">8163</span><span id="line-8163"></span>
+<span class="source-line-no">8164</span><span id="line-8164">  public Result append(Append append, long nonceGroup, long nonce) throws IOException {</span>
+<span class="source-line-no">8165</span><span id="line-8165">    return TraceUtil.trace(() -&gt; {</span>
+<span class="source-line-no">8166</span><span id="line-8166">      checkReadOnly();</span>
+<span class="source-line-no">8167</span><span id="line-8167">      checkResources();</span>
+<span class="source-line-no">8168</span><span id="line-8168">      startRegionOperation(Operation.APPEND);</span>
+<span class="source-line-no">8169</span><span id="line-8169">      try {</span>
+<span class="source-line-no">8170</span><span id="line-8170">        // All edits for the given row (across all column families) must happen atomically.</span>
+<span class="source-line-no">8171</span><span id="line-8171">        return mutate(append, true, nonceGroup, nonce).getResult();</span>
+<span class="source-line-no">8172</span><span id="line-8172">      } finally {</span>
+<span class="source-line-no">8173</span><span id="line-8173">        closeRegionOperation(Operation.APPEND);</span>
+<span class="source-line-no">8174</span><span id="line-8174">      }</span>
+<span class="source-line-no">8175</span><span id="line-8175">    }, () -&gt; createRegionSpan("Region.append"));</span>
+<span class="source-line-no">8176</span><span id="line-8176">  }</span>
+<span class="source-line-no">8177</span><span id="line-8177"></span>
+<span class="source-line-no">8178</span><span id="line-8178">  @Override</span>
+<span class="source-line-no">8179</span><span id="line-8179">  public Result increment(Increment increment) throws IOException {</span>
+<span class="source-line-no">8180</span><span id="line-8180">    return increment(increment, HConstants.NO_NONCE, HConstants.NO_NONCE);</span>
+<span class="source-line-no">8181</span><span id="line-8181">  }</span>
+<span class="source-line-no">8182</span><span id="line-8182"></span>
+<span class="source-line-no">8183</span><span id="line-8183">  public Result increment(Increment increment, long nonceGroup, long nonce) throws IOException {</span>
+<span class="source-line-no">8184</span><span id="line-8184">    return TraceUtil.trace(() -&gt; {</span>
+<span class="source-line-no">8185</span><span id="line-8185">      checkReadOnly();</span>
+<span class="source-line-no">8186</span><span id="line-8186">      checkResources();</span>
+<span class="source-line-no">8187</span><span id="line-8187">      startRegionOperation(Operation.INCREMENT);</span>
+<span class="source-line-no">8188</span><span id="line-8188">      try {</span>
+<span class="source-line-no">8189</span><span id="line-8189">        // All edits for the given row (across all column families) must happen atomically.</span>
+<span class="source-line-no">8190</span><span id="line-8190">        return mutate(increment, true, nonceGroup, nonce).getResult();</span>
+<span class="source-line-no">8191</span><span id="line-8191">      } finally {</span>
+<span class="source-line-no">8192</span><span id="line-8192">        closeRegionOperation(Operation.INCREMENT);</span>
+<span class="source-line-no">8193</span><span id="line-8193">      }</span>
+<span class="source-line-no">8194</span><span id="line-8194">    }, () -&gt; createRegionSpan("Region.increment"));</span>
+<span class="source-line-no">8195</span><span id="line-8195">  }</span>
+<span class="source-line-no">8196</span><span id="line-8196"></span>
+<span class="source-line-no">8197</span><span id="line-8197">  private WALKeyImpl createWALKeyForWALAppend(boolean isReplay, BatchOperation&lt;?&gt; batchOp, long now,</span>
+<span class="source-line-no">8198</span><span id="line-8198">    long nonceGroup, long nonce) {</span>
+<span class="source-line-no">8199</span><span id="line-8199">    WALKeyImpl walKey = isReplay</span>
+<span class="source-line-no">8200</span><span id="line-8200">      ? new WALKeyImpl(this.getRegionInfo().getEncodedNameAsBytes(),</span>
+<span class="source-line-no">8201</span><span id="line-8201">        this.htableDescriptor.getTableName(), SequenceId.NO_SEQUENCE_ID, now,</span>
+<span class="source-line-no">8202</span><span id="line-8202">        batchOp.getClusterIds(), nonceGroup, nonce, mvcc)</span>
+<span class="source-line-no">8203</span><span id="line-8203">      : new WALKeyImpl(this.getRegionInfo().getEncodedNameAsBytes(),</span>
+<span class="source-line-no">8204</span><span id="line-8204">        this.htableDescriptor.getTableName(), SequenceId.NO_SEQUENCE_ID, now,</span>
+<span class="source-line-no">8205</span><span id="line-8205">        batchOp.getClusterIds(), nonceGroup, nonce, mvcc, this.getReplicationScope());</span>
+<span class="source-line-no">8206</span><span id="line-8206">    if (isReplay) {</span>
+<span class="source-line-no">8207</span><span id="line-8207">      walKey.setOrigLogSeqNum(batchOp.getOrigLogSeqNum());</span>
+<span class="source-line-no">8208</span><span id="line-8208">    }</span>
+<span class="source-line-no">8209</span><span id="line-8209">    return walKey;</span>
+<span class="source-line-no">8210</span><span id="line-8210">  }</span>
+<span class="source-line-no">8211</span><span id="line-8211"></span>
+<span class="source-line-no">8212</span><span id="line-8212">  /** Returns writeEntry associated with this append */</span>
+<span class="source-line-no">8213</span><span id="line-8213">  private WriteEntry doWALAppend(WALEdit walEdit, BatchOperation&lt;?&gt; batchOp,</span>
+<span class="source-line-no">8214</span><span id="line-8214">    MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, long now, NonceKey nonceKey)</span>
+<span class="source-line-no">8215</span><span id="line-8215">    throws IOException {</span>
+<span class="source-line-no">8216</span><span id="line-8216">    Preconditions.checkArgument(walEdit != null &amp;&amp; !walEdit.isEmpty(), "WALEdit is null or empty!");</span>
+<span class="source-line-no">8217</span><span id="line-8217">    Preconditions.checkArgument(</span>
+<span class="source-line-no">8218</span><span id="line-8218">      !walEdit.isReplay() || batchOp.getOrigLogSeqNum() != SequenceId.NO_SEQUENCE_ID,</span>
+<span class="source-line-no">8219</span><span id="line-8219">      "Invalid replay sequence Id for replay WALEdit!");</span>
+<span class="source-line-no">8220</span><span id="line-8220"></span>
+<span class="source-line-no">8221</span><span id="line-8221">    WALKeyImpl walKey = createWALKeyForWALAppend(walEdit.isReplay(), batchOp, now,</span>
+<span class="source-line-no">8222</span><span id="line-8222">      nonceKey.getNonceGroup(), nonceKey.getNonce());</span>
+<span class="source-line-no">8223</span><span id="line-8223">    // don't call the coproc hook for writes to the WAL caused by</span>
+<span class="source-line-no">8224</span><span id="line-8224">    // system lifecycle events like flushes or compactions</span>
+<span class="source-line-no">8225</span><span id="line-8225">    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {</span>
+<span class="source-line-no">8226</span><span id="line-8226">      this.coprocessorHost.preWALAppend(walKey, walEdit);</span>
+<span class="source-line-no">8227</span><span id="line-8227">    }</span>
+<span class="source-line-no">8228</span><span id="line-8228">    try {</span>
+<span class="source-line-no">8229</span><span id="line-8229">      long txid = this.wal.appendData(this.getRegionInfo(), walKey, walEdit);</span>
+<span class="source-line-no">8230</span><span id="line-8230">      WriteEntry writeEntry = walKey.getWriteEntry();</span>
+<span class="source-line-no">8231</span><span id="line-8231">      // Call sync on our edit.</span>
+<span class="source-line-no">8232</span><span id="line-8232">      if (txid != 0) {</span>
+<span class="source-line-no">8233</span><span id="line-8233">        sync(txid, batchOp.durability);</span>
+<span class="source-line-no">8234</span><span id="line-8234">      }</span>
 <span class="source-line-no">8235</span><span id="line-8235">      /**</span>
-<span class="source-line-no">8236</span><span id="line-8236">       * If {@link WAL#sync} get a timeout exception, the only correct way is to abort the region</span>
-<span class="source-line-no">8237</span><span id="line-8237">       * server, as the design of {@link WAL#sync}, is to succeed or die, there is no 'failure'. It</span>
-<span class="source-line-no">8238</span><span id="line-8238">       * is usually not a big deal is because we set a very large default value(5 minutes) for</span>
-<span class="source-line-no">8239</span><span id="line-8239">       * {@link AbstractFSWAL#WAL_SYNC_TIMEOUT_MS}, usually the WAL system will abort the region</span>
-<span class="source-line-no">8240</span><span id="line-8240">       * server if it can not finish the sync within 5 minutes.</span>
-<span class="source-line-no">8241</span><span id="line-8241">       */</span>
-<span class="source-line-no">8242</span><span id="line-8242">      if (ioe instanceof WALSyncTimeoutIOException) {</span>
-<span class="source-line-no">8243</span><span id="line-8243">        if (rsServices != null) {</span>
-<span class="source-line-no">8244</span><span id="line-8244">          rsServices.abort("WAL sync timeout,forcing server shutdown", ioe);</span>
-<span class="source-line-no">8245</span><span id="line-8245">        }</span>
+<span class="source-line-no">8236</span><span id="line-8236">       * If above {@link HRegion#sync} throws Exception, the RegionServer should be aborted and</span>
+<span class="source-line-no">8237</span><span id="line-8237">       * following {@link BatchOperation#writeMiniBatchOperationsToMemStore} will not be executed,</span>
+<span class="source-line-no">8238</span><span id="line-8238">       * so there is no need to replicate to secondary replica, for this reason here we attach the</span>
+<span class="source-line-no">8239</span><span id="line-8239">       * region replication action after the {@link HRegion#sync} is successful.</span>
+<span class="source-line-no">8240</span><span id="line-8240">       */</span>
+<span class="source-line-no">8241</span><span id="line-8241">      this.attachRegionReplicationInWALAppend(batchOp, miniBatchOp, walKey, walEdit, writeEntry);</span>
+<span class="source-line-no">8242</span><span id="line-8242">      return writeEntry;</span>
+<span class="source-line-no">8243</span><span id="line-8243">    } catch (IOException ioe) {</span>
+<span class="source-line-no">8244</span><span id="line-8244">      if (walKey.getWriteEntry() != null) {</span>
+<span class="source-line-no">8245</span><span id="line-8245">        mvcc.complete(walKey.getWriteEntry());</span>
 <span class="source-line-no">8246</span><span id="line-8246">      }</span>
-<span class="source-line-no">8247</span><span id="line-8247">      throw ioe;</span>
-<span class="source-line-no">8248</span><span id="line-8248">    }</span>
-<span class="source-line-no">8249</span><span id="line-8249">  }</span>
-<span class="source-line-no">8250</span><span id="line-8250"></span>
-<span class="source-line-no">8251</span><span id="line-8251">  /**</span>
-<span class="source-line-no">8252</span><span id="line-8252">   * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for replicating to region</span>
-<span class="source-line-no">8253</span><span id="line-8253">   * replica.</span>
-<span class="source-line-no">8254</span><span id="line-8254">   */</span>
-<span class="source-line-no">8255</span><span id="line-8255">  private void attachRegionReplicationInWALAppend(BatchOperation&lt;?&gt; batchOp,</span>
-<span class="source-line-no">8256</span><span id="line-8256">    MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, WALKeyImpl walKey, WALEdit walEdit,</span>
-<span class="source-line-no">8257</span><span id="line-8257">    WriteEntry writeEntry) {</span>
-<span class="source-line-no">8258</span><span id="line-8258">    if (!regionReplicationSink.isPresent()) {</span>
-<span class="source-line-no">8259</span><span id="line-8259">      return;</span>
-<span class="source-line-no">8260</span><span id="line-8260">    }</span>
-<span class="source-line-no">8261</span><span id="line-8261">    /**</span>
-<span class="source-line-no">8262</span><span id="line-8262">     * If {@link HRegion#regionReplicationSink} is present,only {@link MutationBatchOperation} is</span>
-<span class="source-line-no">8263</span><span id="line-8263">     * used and {@link NonceKey} is all the same for {@link Mutation}s in</span>
-<span class="source-line-no">8264</span><span id="line-8264">     * {@link MutationBatchOperation},so for HBASE-26993 case 1,if</span>
-<span class="source-line-no">8265</span><span id="line-8265">     * {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} is not null and we could</span>
-<span class="source-line-no">8266</span><span id="line-8266">     * enter {@link HRegion#doWALAppend},that means partial {@link Mutation}s are</span>
-<span class="source-line-no">8267</span><span id="line-8267">     * {@link Durability#SKIP_WAL}, we use</span>
-<span class="source-line-no">8268</span><span id="line-8268">     * {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} to replicate to region</span>
-<span class="source-line-no">8269</span><span id="line-8269">     * replica,but if {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} is</span>
-<span class="source-line-no">8270</span><span id="line-8270">     * null,that means there is no {@link Mutation} is {@link Durability#SKIP_WAL},so we just use</span>
-<span class="source-line-no">8271</span><span id="line-8271">     * walEdit to replicate.</span>
-<span class="source-line-no">8272</span><span id="line-8272">     */</span>
-<span class="source-line-no">8273</span><span id="line-8273">    assert batchOp instanceof MutationBatchOperation;</span>
-<span class="source-line-no">8274</span><span id="line-8274">    WALEdit walEditToUse = miniBatchOp.getWalEditForReplicateIfExistsSkipWAL();</span>
-<span class="source-line-no">8275</span><span id="line-8275">    if (walEditToUse == null) {</span>
-<span class="source-line-no">8276</span><span id="line-8276">      walEditToUse = walEdit;</span>
-<span class="source-line-no">8277</span><span id="line-8277">    }</span>
-<span class="source-line-no">8278</span><span id="line-8278">    doAttachReplicateRegionReplicaAction(walKey, walEditToUse, writeEntry);</span>
-<span class="source-line-no">8279</span><span id="line-8279">  }</span>
-<span class="source-line-no">8280</span><span id="line-8280"></span>
-<span class="source-line-no">8281</span><span id="line-8281">  /**</span>
-<span class="source-line-no">8282</span><span id="line-8282">   * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for replicating to region</span>
-<span class="source-line-no">8283</span><span id="line-8283">   * replica.</span>
-<span class="source-line-no">8284</span><span id="line-8284">   */</span>
-<span class="source-line-no">8285</span><span id="line-8285">  private void doAttachReplicateRegionReplicaAction(WALKeyImpl walKey, WALEdit walEdit,</span>
-<span class="source-line-no">8286</span><span id="line-8286">    WriteEntry writeEntry) {</span>
-<span class="source-line-no">8287</span><span id="line-8287">    if (walEdit == null || walEdit.isEmpty()) {</span>
-<span class="source-line-no">8288</span><span id="line-8288">      return;</span>
-<span class="source-line-no">8289</span><span id="line-8289">    }</span>
-<span class="source-line-no">8290</span><span id="line-8290">    final ServerCall&lt;?&gt; rpcCall = RpcServer.getCurrentServerCallWithCellScanner().orElse(null);</span>
-<span class="source-line-no">8291</span><span id="line-8291">    regionReplicationSink.ifPresent(sink -&gt; writeEntry.attachCompletionAction(() -&gt; {</span>
-<span class="source-line-no">8292</span><span id="line-8292">      sink.add(walKey, walEdit, rpcCall);</span>
-<span class="source-line-no">8293</span><span id="line-8293">    }));</span>
-<span class="source-line-no">8294</span><span id="line-8294">  }</span>
-<span class="source-line-no">8295</span><span id="line-8295"></span>
-<span class="source-line-no">8296</span><span id="line-8296">  public static final long FIXED_OVERHEAD = ClassSize.estimateBase(HRegion.class, false);</span>
-<span class="source-line-no">8297</span><span id="line-8297"></span>
-<span class="source-line-no">8298</span><span id="line-8298">  // woefully out of date - currently missing:</span>
-<span class="source-line-no">8299</span><span id="line-8299">  // 1 x HashMap - coprocessorServiceHandlers</span>
-<span class="source-line-no">8300</span><span id="line-8300">  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,</span>
-<span class="source-line-no">8301</span><span id="line-8301">  // checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,</span>
-<span class="source-line-no">8302</span><span id="line-8302">  // writeRequestsCount, cpRequestsCount</span>
-<span class="source-line-no">8303</span><span id="line-8303">  // 1 x HRegion$WriteState - writestate</span>
-<span class="source-line-no">8304</span><span id="line-8304">  // 1 x RegionCoprocessorHost - coprocessorHost</span>
-<span class="source-line-no">8305</span><span id="line-8305">  // 1 x RegionSplitPolicy - splitPolicy</span>
-<span class="source-line-no">8306</span><span id="line-8306">  // 1 x MetricsRegion - metricsRegion</span>
-<span class="source-line-no">8307</span><span id="line-8307">  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper</span>
-<span class="source-line-no">8308</span><span id="line-8308">  // 1 x ReadPointCalculationLock - smallestReadPointCalcLock</span>
-<span class="source-line-no">8309</span><span id="line-8309">  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD + ClassSize.OBJECT + // closeLock</span>
-<span class="source-line-no">8310</span><span id="line-8310">    (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing</span>
-<span class="source-line-no">8311</span><span id="line-8311">    (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,</span>
-<span class="source-line-no">8312</span><span id="line-8312">                                  // compactionsFailed</span>
-<span class="source-line-no">8313</span><span id="line-8313">    (3 * ClassSize.CONCURRENT_HASHMAP) + // lockedRows, scannerReadPoints, regionLockHolders</span>
-<span class="source-line-no">8314</span><span id="line-8314">    WriteState.HEAP_SIZE + // writestate</span>
-<span class="source-line-no">8315</span><span id="line-8315">    ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores</span>
-<span class="source-line-no">8316</span><span id="line-8316">    (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock</span>
-<span class="source-line-no">8317</span><span id="line-8317">    MultiVersionConcurrencyControl.FIXED_SIZE // mvcc</span>
-<span class="source-line-no">8318</span><span id="line-8318">    + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes</span>
-<span class="source-line-no">8319</span><span id="line-8319">    + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress</span>
-<span class="source-line-no">8320</span><span id="line-8320">    + ClassSize.STORE_SERVICES // store services</span>
-<span class="source-line-no">8321</span><span id="line-8321">    + StoreHotnessProtector.FIXED_SIZE;</span>
-<span class="source-line-no">8322</span><span id="line-8322"></span>
-<span class="source-line-no">8323</span><span id="line-8323">  @Override</span>
-<span class="source-line-no">8324</span><span id="line-8324">  public long heapSize() {</span>
-<span class="source-line-no">8325</span><span id="line-8325">    // this does not take into account row locks, recent flushes, mvcc entries, and more</span>
-<span class="source-line-no">8326</span><span id="line-8326">    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();</span>
-<span class="source-line-no">8327</span><span id="line-8327">  }</span>
-<span class="source-line-no">8328</span><span id="line-8328"></span>
-<span class="source-line-no">8329</span><span id="line-8329">  /**</span>
-<span class="source-line-no">8330</span><span id="line-8330">   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to be</span>
-<span class="source-line-no">8331</span><span id="line-8331">   * available for handling {@link #execService(RpcController, CoprocessorServiceCall)} calls.</span>
-<span class="source-line-no">8332</span><span id="line-8332">   * &lt;p/&gt;</span>
-<span class="source-line-no">8333</span><span id="line-8333">   * Only a single instance may be registered per region for a given {@link Service} subclass (the</span>
-<span class="source-line-no">8334</span><span id="line-8334">   * instances are keyed on {@link ServiceDescriptor#getFullName()}.. After the first registration,</span>
-<span class="source-line-no">8335</span><span id="line-8335">   * subsequent calls with the same service name will fail with a return value of {@code false}.</span>
-<span class="source-line-no">8336</span><span id="line-8336">   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint</span>
-<span class="source-line-no">8337</span><span id="line-8337">   * @return {@code true} if the registration was successful, {@code false} otherwise</span>
-<span class="source-line-no">8338</span><span id="line-8338">   */</span>
-<span class="source-line-no">8339</span><span id="line-8339">  public boolean registerService(Service instance) {</span>
-<span class="source-line-no">8340</span><span id="line-8340">    // No stacking of instances is allowed for a single service name</span>
-<span class="source-line-no">8341</span><span id="line-8341">    ServiceDescriptor serviceDesc = instance.getDescriptorForType();</span>
-<span class="source-line-no">8342</span><span id="line-8342">    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);</span>
-<span class="source-line-no">8343</span><span id="line-8343">    if (coprocessorServiceHandlers.containsKey(serviceName)) {</span>
-<span class="source-line-no">8344</span><span id="line-8344">      LOG.error("Coprocessor service {} already registered, rejecting request from {} in region {}",</span>
-<span class="source-line-no">8345</span><span id="line-8345">        serviceName, instance, this);</span>
-<span class="source-line-no">8346</span><span id="line-8346">      return false;</span>
-<span class="source-line-no">8347</span><span id="line-8347">    }</span>
-<span class="source-line-no">8348</span><span id="line-8348"></span>
-<span class="source-line-no">8349</span><span id="line-8349">    coprocessorServiceHandlers.put(serviceName, instance);</span>
-<span class="source-line-no">8350</span><span id="line-8350">    if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">8351</span><span id="line-8351">      LOG.debug("Registered coprocessor service: region="</span>
-<span class="source-line-no">8352</span><span id="line-8352">        + Bytes.toStringBinary(getRegionInfo().getRegionName()) + " service=" + serviceName);</span>
-<span class="source-line-no">8353</span><span id="line-8353">    }</span>
-<span class="source-line-no">8354</span><span id="line-8354">    return true;</span>
-<span class="source-line-no">8355</span><span id="line-8355">  }</span>
-<span class="source-line-no">8356</span><span id="line-8356"></span>
-<span class="source-line-no">8357</span><span id="line-8357">  /**</span>
-<span class="source-line-no">8358</span><span id="line-8358">   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using the</span>
-<span class="source-line-no">8359</span><span id="line-8359">   * registered protocol handlers. {@link Service} implementations must be registered via the</span>
-<span class="source-line-no">8360</span><span id="line-8360">   * {@link #registerService(Service)} method before they are available.</span>
-<span class="source-line-no">8361</span><span id="line-8361">   * @param controller an {@code RpcContoller} implementation to pass to the invoked service</span>
-<span class="source-line-no">8362</span><span id="line-8362">   * @param call       a {@code CoprocessorServiceCall} instance identifying the service, method,</span>
-<span class="source-line-no">8363</span><span id="line-8363">   *                   and parameters for the method invocation</span>
-<span class="source-line-no">8364</span><span id="line-8364">   * @return a protocol buffer {@code Message} instance containing the method's result</span>
-<span class="source-line-no">8365</span><span id="line-8365">   * @throws IOException if no registered service handler is found or an error occurs during the</span>
-<span class="source-line-no">8366</span><span id="line-8366">   *                     invocation</span>
-<span class="source-line-no">8367</span><span id="line-8367">   * @see #registerService(Service)</span>
-<span class="source-line-no">8368</span><span id="line-8368">   */</span>
-<span class="source-line-no">8369</span><span id="line-8369">  public Message execService(RpcController controller, CoprocessorServiceCall call)</span>
-<span class="source-line-no">8370</span><span id="line-8370">    throws IOException {</span>
-<span class="source-line-no">8371</span><span id="line-8371">    String serviceName = call.getServiceName();</span>
-<span class="source-line-no">8372</span><span id="line-8372">    Service service = coprocessorServiceHandlers.get(serviceName);</span>
-<span class="source-line-no">8373</span><span id="line-8373">    if (service == null) {</span>
-<span class="source-line-no">8374</span><span id="line-8374">      throw new UnknownProtocolException(null, "No registered coprocessor service found for "</span>
-<span class="source-line-no">8375</span><span id="line-8375">        + serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));</span>
-<span class="source-line-no">8376</span><span id="line-8376">    }</span>
-<span class="source-line-no">8377</span><span id="line-8377">    ServiceDescriptor serviceDesc = service.getDescriptorForType();</span>
-<span class="source-line-no">8378</span><span id="line-8378"></span>
-<span class="source-line-no">8379</span><span id="line-8379">    cpRequestsCount.increment();</span>
-<span class="source-line-no">8380</span><span id="line-8380">    String methodName = call.getMethodName();</span>
-<span class="source-line-no">8381</span><span id="line-8381">    MethodDescriptor methodDesc = CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);</span>
-<span class="source-line-no">8382</span><span id="line-8382"></span>
-<span class="source-line-no">8383</span><span id="line-8383">    Message.Builder builder = service.getRequestPrototype(methodDesc).newBuilderForType();</span>
-<span class="source-line-no">8384</span><span id="line-8384"></span>
-<span class="source-line-no">8385</span><span id="line-8385">    ProtobufUtil.mergeFrom(builder, call.getRequest().toByteArray());</span>
-<span class="source-line-no">8386</span><span id="line-8386">    Message request = CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());</span>
-<span class="source-line-no">8387</span><span id="line-8387"></span>
-<span class="source-line-no">8388</span><span id="line-8388">    if (coprocessorHost != null) {</span>
-<span class="source-line-no">8389</span><span id="line-8389">      request = coprocessorHost.preEndpointInvocation(service, methodName, request);</span>
-<span class="source-line-no">8390</span><span id="line-8390">    }</span>
+<span class="source-line-no">8247</span><span id="line-8247"></span>
+<span class="source-line-no">8248</span><span id="line-8248">      /**</span>
+<span class="source-line-no">8249</span><span id="line-8249">       * If {@link WAL#sync} get a timeout exception, the only correct way is to abort the region</span>
+<span class="source-line-no">8250</span><span id="line-8250">       * server, as the design of {@link WAL#sync}, is to succeed or die, there is no 'failure'. It</span>
+<span class="source-line-no">8251</span><span id="line-8251">       * is usually not a big deal is because we set a very large default value(5 minutes) for</span>
+<span class="source-line-no">8252</span><span id="line-8252">       * {@link AbstractFSWAL#WAL_SYNC_TIMEOUT_MS}, usually the WAL system will abort the region</span>
+<span class="source-line-no">8253</span><span id="line-8253">       * server if it can not finish the sync within 5 minutes.</span>
+<span class="source-line-no">8254</span><span id="line-8254">       */</span>
+<span class="source-line-no">8255</span><span id="line-8255">      if (ioe instanceof WALSyncTimeoutIOException) {</span>
+<span class="source-line-no">8256</span><span id="line-8256">        if (rsServices != null) {</span>
+<span class="source-line-no">8257</span><span id="line-8257">          rsServices.abort("WAL sync timeout,forcing server shutdown", ioe);</span>
+<span class="source-line-no">8258</span><span id="line-8258">        }</span>
+<span class="source-line-no">8259</span><span id="line-8259">      }</span>
+<span class="source-line-no">8260</span><span id="line-8260">      throw ioe;</span>
+<span class="source-line-no">8261</span><span id="line-8261">    }</span>
+<span class="source-line-no">8262</span><span id="line-8262">  }</span>
+<span class="source-line-no">8263</span><span id="line-8263"></span>
+<span class="source-line-no">8264</span><span id="line-8264">  /**</span>
+<span class="source-line-no">8265</span><span id="line-8265">   * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for replicating to region</span>
+<span class="source-line-no">8266</span><span id="line-8266">   * replica.</span>
+<span class="source-line-no">8267</span><span id="line-8267">   */</span>
+<span class="source-line-no">8268</span><span id="line-8268">  private void attachRegionReplicationInWALAppend(BatchOperation&lt;?&gt; batchOp,</span>
+<span class="source-line-no">8269</span><span id="line-8269">    MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, WALKeyImpl walKey, WALEdit walEdit,</span>
+<span class="source-line-no">8270</span><span id="line-8270">    WriteEntry writeEntry) {</span>
+<span class="source-line-no">8271</span><span id="line-8271">    if (!regionReplicationSink.isPresent()) {</span>
+<span class="source-line-no">8272</span><span id="line-8272">      return;</span>
+<span class="source-line-no">8273</span><span id="line-8273">    }</span>
+<span class="source-line-no">8274</span><span id="line-8274">    /**</span>
+<span class="source-line-no">8275</span><span id="line-8275">     * If {@link HRegion#regionReplicationSink} is present,only {@link MutationBatchOperation} is</span>
+<span class="source-line-no">8276</span><span id="line-8276">     * used and {@link NonceKey} is all the same for {@link Mutation}s in</span>
+<span class="source-line-no">8277</span><span id="line-8277">     * {@link MutationBatchOperation},so for HBASE-26993 case 1,if</span>
+<span class="source-line-no">8278</span><span id="line-8278">     * {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} is not null and we could</span>
+<span class="source-line-no">8279</span><span id="line-8279">     * enter {@link HRegion#doWALAppend},that means partial {@link Mutation}s are</span>
+<span class="source-line-no">8280</span><span id="line-8280">     * {@link Durability#SKIP_WAL}, we use</span>
+<span class="source-line-no">8281</span><span id="line-8281">     * {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} to replicate to region</span>
+<span class="source-line-no">8282</span><span id="line-8282">     * replica,but if {@link MiniBatchOperationInProgress#getWalEditForReplicateSkipWAL} is</span>
+<span class="source-line-no">8283</span><span id="line-8283">     * null,that means there is no {@link Mutation} is {@link Durability#SKIP_WAL},so we just use</span>
+<span class="source-line-no">8284</span><span id="line-8284">     * walEdit to replicate.</span>
+<span class="source-line-no">8285</span><span id="line-8285">     */</span>
+<span class="source-line-no">8286</span><span id="line-8286">    assert batchOp instanceof MutationBatchOperation;</span>
+<span class="source-line-no">8287</span><span id="line-8287">    WALEdit walEditToUse = miniBatchOp.getWalEditForReplicateIfExistsSkipWAL();</span>
+<span class="source-line-no">8288</span><span id="line-8288">    if (walEditToUse == null) {</span>
+<span class="source-line-no">8289</span><span id="line-8289">      walEditToUse = walEdit;</span>
+<span class="source-line-no">8290</span><span id="line-8290">    }</span>
+<span class="source-line-no">8291</span><span id="line-8291">    doAttachReplicateRegionReplicaAction(walKey, walEditToUse, writeEntry);</span>
+<span class="source-line-no">8292</span><span id="line-8292">  }</span>
+<span class="source-line-no">8293</span><span id="line-8293"></span>
+<span class="source-line-no">8294</span><span id="line-8294">  /**</span>
+<span class="source-line-no">8295</span><span id="line-8295">   * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for replicating to region</span>
+<span class="source-line-no">8296</span><span id="line-8296">   * replica.</span>
+<span class="source-line-no">8297</span><span id="line-8297">   */</span>
+<span class="source-line-no">8298</span><span id="line-8298">  private void doAttachReplicateRegionReplicaAction(WALKeyImpl walKey, WALEdit walEdit,</span>
+<span class="source-line-no">8299</span><span id="line-8299">    WriteEntry writeEntry) {</span>
+<span class="source-line-no">8300</span><span id="line-8300">    if (walEdit == null || walEdit.isEmpty()) {</span>
+<span class="source-line-no">8301</span><span id="line-8301">      return;</span>
+<span class="source-line-no">8302</span><span id="line-8302">    }</span>
+<span class="source-line-no">8303</span><span id="line-8303">    final ServerCall&lt;?&gt; rpcCall = RpcServer.getCurrentServerCallWithCellScanner().orElse(null);</span>
+<span class="source-line-no">8304</span><span id="line-8304">    regionReplicationSink.ifPresent(sink -&gt; writeEntry.attachCompletionAction(() -&gt; {</span>
+<span class="source-line-no">8305</span><span id="line-8305">      sink.add(walKey, walEdit, rpcCall);</span>
+<span class="source-line-no">8306</span><span id="line-8306">    }));</span>
+<span class="source-line-no">8307</span><span id="line-8307">  }</span>
+<span class="source-line-no">8308</span><span id="line-8308"></span>
+<span class="source-line-no">8309</span><span id="line-8309">  public static final long FIXED_OVERHEAD = ClassSize.estimateBase(HRegion.class, false);</span>
+<span class="source-line-no">8310</span><span id="line-8310"></span>
+<span class="source-line-no">8311</span><span id="line-8311">  // woefully out of date - currently missing:</span>
+<span class="source-line-no">8312</span><span id="line-8312">  // 1 x HashMap - coprocessorServiceHandlers</span>
+<span class="source-line-no">8313</span><span id="line-8313">  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,</span>
+<span class="source-line-no">8314</span><span id="line-8314">  // checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,</span>
+<span class="source-line-no">8315</span><span id="line-8315">  // writeRequestsCount, cpRequestsCount</span>
+<span class="source-line-no">8316</span><span id="line-8316">  // 1 x HRegion$WriteState - writestate</span>
+<span class="source-line-no">8317</span><span id="line-8317">  // 1 x RegionCoprocessorHost - coprocessorHost</span>
+<span class="source-line-no">8318</span><span id="line-8318">  // 1 x RegionSplitPolicy - splitPolicy</span>
+<span class="source-line-no">8319</span><span id="line-8319">  // 1 x MetricsRegion - metricsRegion</span>
+<span class="source-line-no">8320</span><span id="line-8320">  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper</span>
+<span class="source-line-no">8321</span><span id="line-8321">  // 1 x ReadPointCalculationLock - smallestReadPointCalcLock</span>
+<span class="source-line-no">8322</span><span id="line-8322">  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD + ClassSize.OBJECT + // closeLock</span>
+<span class="source-line-no">8323</span><span id="line-8323">    (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing</span>
+<span class="source-line-no">8324</span><span id="line-8324">    (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,</span>
+<span class="source-line-no">8325</span><span id="line-8325">                                  // compactionsFailed</span>
+<span class="source-line-no">8326</span><span id="line-8326">    (3 * ClassSize.CONCURRENT_HASHMAP) + // lockedRows, scannerReadPoints, regionLockHolders</span>
+<span class="source-line-no">8327</span><span id="line-8327">    WriteState.HEAP_SIZE + // writestate</span>
+<span class="source-line-no">8328</span><span id="line-8328">    ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores</span>
+<span class="source-line-no">8329</span><span id="line-8329">    (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock</span>
+<span class="source-line-no">8330</span><span id="line-8330">    MultiVersionConcurrencyControl.FIXED_SIZE // mvcc</span>
+<span class="source-line-no">8331</span><span id="line-8331">    + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes</span>
+<span class="source-line-no">8332</span><span id="line-8332">    + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress</span>
+<span class="source-line-no">8333</span><span id="line-8333">    + ClassSize.STORE_SERVICES // store services</span>
+<span class="source-line-no">8334</span><span id="line-8334">    + StoreHotnessProtector.FIXED_SIZE;</span>
+<span class="source-line-no">8335</span><span id="line-8335"></span>
+<span class="source-line-no">8336</span><span id="line-8336">  @Override</span>
+<span class="source-line-no">8337</span><span id="line-8337">  public long heapSize() {</span>
+<span class="source-line-no">8338</span><span id="line-8338">    // this does not take into account row locks, recent flushes, mvcc entries, and more</span>
+<span class="source-line-no">8339</span><span id="line-8339">    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();</span>
+<span class="source-line-no">8340</span><span id="line-8340">  }</span>
+<span class="source-line-no">8341</span><span id="line-8341"></span>
+<span class="source-line-no">8342</span><span id="line-8342">  /**</span>
+<span class="source-line-no">8343</span><span id="line-8343">   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to be</span>
+<span class="source-line-no">8344</span><span id="line-8344">   * available for handling {@link #execService(RpcController, CoprocessorServiceCall)} calls.</span>
+<span class="source-line-no">8345</span><span id="line-8345">   * &lt;p/&gt;</span>
+<span class="source-line-no">8346</span><span id="line-8346">   * Only a single instance may be registered per region for a given {@link Service} subclass (the</span>
+<span class="source-line-no">8347</span><span id="line-8347">   * instances are keyed on {@link ServiceDescriptor#getFullName()}.. After the first registration,</span>
+<span class="source-line-no">8348</span><span id="line-8348">   * subsequent calls with the same service name will fail with a return value of {@code false}.</span>
+<span class="source-line-no">8349</span><span id="line-8349">   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint</span>
+<span class="source-line-no">8350</span><span id="line-8350">   * @return {@code true} if the registration was successful, {@code false} otherwise</span>
+<span class="source-line-no">8351</span><span id="line-8351">   */</span>
+<span class="source-line-no">8352</span><span id="line-8352">  public boolean registerService(Service instance) {</span>
+<span class="source-line-no">8353</span><span id="line-8353">    // No stacking of instances is allowed for a single service name</span>
+<span class="source-line-no">8354</span><span id="line-8354">    ServiceDescriptor serviceDesc = instance.getDescriptorForType();</span>
+<span class="source-line-no">8355</span><span id="line-8355">    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);</span>
+<span class="source-line-no">8356</span><span id="line-8356">    if (coprocessorServiceHandlers.containsKey(serviceName)) {</span>
+<span class="source-line-no">8357</span><span id="line-8357">      LOG.error("Coprocessor service {} already registered, rejecting request from {} in region {}",</span>
+<span class="source-line-no">8358</span><span id="line-8358">        serviceName, instance, this);</span>
+<span class="source-line-no">8359</span><span id="line-8359">      return false;</span>
+<span class="source-line-no">8360</span><span id="line-8360">    }</span>
+<span class="source-line-no">8361</span><span id="line-8361"></span>
+<span class="source-line-no">8362</span><span id="line-8362">    coprocessorServiceHandlers.put(serviceName, instance);</span>
+<span class="source-line-no">8363</span><span id="line-8363">    if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">8364</span><span id="line-8364">      LOG.debug("Registered coprocessor service: region="</span>
+<span class="source-line-no">8365</span><span id="line-8365">        + Bytes.toStringBinary(getRegionInfo().getRegionName()) + " service=" + serviceName);</span>
+<span class="source-line-no">8366</span><span id="line-8366">    }</span>
+<span class="source-line-no">8367</span><span id="line-8367">    return true;</span>
+<span class="source-line-no">8368</span><span id="line-8368">  }</span>
+<span class="source-line-no">8369</span><span id="line-8369"></span>
+<span class="source-line-no">8370</span><span id="line-8370">  /**</span>
+<span class="source-line-no">8371</span><span id="line-8371">   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using the</span>
+<span class="source-line-no">8372</span><span id="line-8372">   * registered protocol handlers. {@link Service} implementations must be registered via the</span>
+<span class="source-line-no">8373</span><span id="line-8373">   * {@link #registerService(Service)} method before they are available.</span>
+<span class="source-line-no">8374</span><span id="line-8374">   * @param controller an {@code RpcContoller} implementation to pass to the invoked service</span>
+<span class="source-line-no">8375</span><span id="line-8375">   * @param call       a {@code CoprocessorServiceCall} instance identifying the service, method,</span>
+<span class="source-line-no">8376</span><span id="line-8376">   *                   and parameters for the method invocation</span>
+<span class="source-line-no">8377</span><span id="line-8377">   * @return a protocol buffer {@code Message} instance containing the method's result</span>
+<span class="source-line-no">8378</span><span id="line-8378">   * @throws IOException if no registered service handler is found or an error occurs during the</span>
+<span class="source-line-no">8379</span><span id="line-8379">   *                     invocation</span>
+<span class="source-line-no">8380</span><span id="line-8380">   * @see #registerService(Service)</span>
+<span class="source-line-no">8381</span><span id="line-8381">   */</span>
+<span class="source-line-no">8382</span><span id="line-8382">  public Message execService(RpcController controller, CoprocessorServiceCall call)</span>
+<span class="source-line-no">8383</span><span id="line-8383">    throws IOException {</span>
+<span class="source-line-no">8384</span><span id="line-8384">    String serviceName = call.getServiceName();</span>
+<span class="source-line-no">8385</span><span id="line-8385">    Service service = coprocessorServiceHandlers.get(serviceName);</span>
+<span class="source-line-no">8386</span><span id="line-8386">    if (service == null) {</span>
+<span class="source-line-no">8387</span><span id="line-8387">      throw new UnknownProtocolException(null, "No registered coprocessor service found for "</span>
+<span class="source-line-no">8388</span><span id="line-8388">        + serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));</span>
+<span class="source-line-no">8389</span><span id="line-8389">    }</span>
+<span class="source-line-no">8390</span><span id="line-8390">    ServiceDescriptor serviceDesc = service.getDescriptorForType();</span>
 <span class="source-line-no">8391</span><span id="line-8391"></span>
-<span class="source-line-no">8392</span><span id="line-8392">    final Message.Builder responseBuilder =</span>
-<span class="source-line-no">8393</span><span id="line-8393">      service.getResponsePrototype(methodDesc).newBuilderForType();</span>
-<span class="source-line-no">8394</span><span id="line-8394">    service.callMethod(methodDesc, controller, request, new RpcCallback&lt;Message&gt;() {</span>
-<span class="source-line-no">8395</span><span id="line-8395">      @Override</span>
-<span class="source-line-no">8396</span><span id="line-8396">      public void run(Message message) {</span>
-<span class="source-line-no">8397</span><span id="line-8397">        if (message != null) {</span>
-<span class="source-line-no">8398</span><span id="line-8398">          responseBuilder.mergeFrom(message);</span>
-<span class="source-line-no">8399</span><span id="line-8399">        }</span>
-<span class="source-line-no">8400</span><span id="line-8400">      }</span>
-<span class="source-line-no">8401</span><span id="line-8401">    });</span>
-<span class="source-line-no">8402</span><span id="line-8402"></span>
-<span class="source-line-no">8403</span><span id="line-8403">    if (coprocessorHost != null) {</span>
-<span class="source-line-no">8404</span><span id="line-8404">      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);</span>
-<span class="source-line-no">8405</span><span id="line-8405">    }</span>
-<span class="source-line-no">8406</span><span id="line-8406">    IOException exception =</span>
-<span class="source-line-no">8407</span><span id="line-8407">      org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);</span>
-<span class="source-line-no">8408</span><span id="line-8408">    if (exception != null) {</span>
-<span class="source-line-no">8409</span><span id="line-8409">      throw exception;</span>
-<span class="source-line-no">8410</span><span id="line-8410">    }</span>
-<span class="source-line-no">8411</span><span id="line-8411"></span>
-<span class="source-line-no">8412</span><span id="line-8412">    return responseBuilder.build();</span>
-<span class="source-line-no">8413</span><span id="line-8413">  }</span>
-<span class="source-line-no">8414</span><span id="line-8414"></span>
-<span class="source-line-no">8415</span><span id="line-8415">  public Optional&lt;byte[]&gt; checkSplit() {</span>
-<span class="source-line-no">8416</span><span id="line-8416">    return checkSplit(false);</span>
-<span class="source-line-no">8417</span><span id="line-8417">  }</span>
-<span class="source-line-no">8418</span><span id="line-8418"></span>
-<span class="source-line-no">8419</span><span id="line-8419">  /**</span>
-<span class="source-line-no">8420</span><span id="line-8420">   * Return the split point. An empty result indicates the region isn't splittable.</span>
-<span class="source-line-no">8421</span><span id="line-8421">   */</span>
-<span class="source-line-no">8422</span><span id="line-8422">  public Optional&lt;byte[]&gt; checkSplit(boolean force) {</span>
-<span class="source-line-no">8423</span><span id="line-8423">    // Can't split META</span>
-<span class="source-line-no">8424</span><span id="line-8424">    if (this.getRegionInfo().isMetaRegion()) {</span>
-<span class="source-line-no">8425</span><span id="line-8425">      return Optional.empty();</span>
-<span class="source-line-no">8426</span><span id="line-8426">    }</span>
+<span class="source-line-no">8392</span><span id="line-8392">    cpRequestsCount.increment();</span>
+<span class="source-line-no">8393</span><span id="line-8393">    String methodName = call.getMethodName();</span>
+<span class="source-line-no">8394</span><span id="line-8394">    MethodDescriptor methodDesc = CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);</span>
+<span class="source-line-no">8395</span><span id="line-8395"></span>
+<span class="source-line-no">8396</span><span id="line-8396">    Message.Builder builder = service.getRequestPrototype(methodDesc).newBuilderForType();</span>
+<span class="source-line-no">8397</span><span id="line-8397"></span>
+<span class="source-line-no">8398</span><span id="line-8398">    ProtobufUtil.mergeFrom(builder, call.getRequest().toByteArray());</span>
+<span class="source-line-no">8399</span><span id="line-8399">    Message request = CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());</span>
+<span class="source-line-no">8400</span><span id="line-8400"></span>
+<span class="source-line-no">8401</span><span id="line-8401">    if (coprocessorHost != null) {</span>
+<span class="source-line-no">8402</span><span id="line-8402">      request = coprocessorHost.preEndpointInvocation(service, methodName, request);</span>
+<span class="source-line-no">8403</span><span id="line-8403">    }</span>
+<span class="source-line-no">8404</span><span id="line-8404"></span>
+<span class="source-line-no">8405</span><span id="line-8405">    final Message.Builder responseBuilder =</span>
+<span class="source-line-no">8406</span><span id="line-8406">      service.getResponsePrototype(methodDesc).newBuilderForType();</span>
+<span class="source-line-no">8407</span><span id="line-8407">    service.callMethod(methodDesc, controller, request, new RpcCallback&lt;Message&gt;() {</span>
+<span class="source-line-no">8408</span><span id="line-8408">      @Override</span>
+<span class="source-line-no">8409</span><span id="line-8409">      public void run(Message message) {</span>
+<span class="source-line-no">8410</span><span id="line-8410">        if (message != null) {</span>
+<span class="source-line-no">8411</span><span id="line-8411">          responseBuilder.mergeFrom(message);</span>
+<span class="source-line-no">8412</span><span id="line-8412">        }</span>
+<span class="source-line-no">8413</span><span id="line-8413">      }</span>
+<span class="source-line-no">8414</span><span id="line-8414">    });</span>
+<span class="source-line-no">8415</span><span id="line-8415"></span>
+<span class="source-line-no">8416</span><span id="line-8416">    if (coprocessorHost != null) {</span>
+<span class="source-line-no">8417</span><span id="line-8417">      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);</span>
+<span class="source-line-no">8418</span><span id="line-8418">    }</span>
+<span class="source-line-no">8419</span><span id="line-8419">    IOException exception =</span>
+<span class="source-line-no">8420</span><span id="line-8420">      org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);</span>
+<span class="source-line-no">8421</span><span id="line-8421">    if (exception != null) {</span>
+<span class="source-line-no">8422</span><span id="line-8422">      throw exception;</span>
+<span class="source-line-no">8423</span><span id="line-8423">    }</span>
+<span class="source-line-no">8424</span><span id="line-8424"></span>
+<span class="source-line-no">8425</span><span id="line-8425">    return responseBuilder.build();</span>
+<span class="source-line-no">8426</span><span id="line-8426">  }</span>
 <span class="source-line-no">8427</span><span id="line-8427"></span>
-<span class="source-line-no">8428</span><span id="line-8428">    // Can't split a region that is closing.</span>
-<span class="source-line-no">8429</span><span id="line-8429">    if (this.isClosing()) {</span>
-<span class="source-line-no">8430</span><span id="line-8430">      return Optional.empty();</span>
-<span class="source-line-no">8431</span><span id="line-8431">    }</span>
-<span class="source-line-no">8432</span><span id="line-8432"></span>
-<span class="source-line-no">8433</span><span id="line-8433">    if (!force &amp;&amp; !splitPolicy.shouldSplit()) {</span>
-<span class="source-line-no">8434</span><span id="line-8434">      return Optional.empty();</span>
-<span class="source-line-no">8435</span><span id="line-8435">    }</span>
-<span class="source-line-no">8436</span><span id="line-8436"></span>
-<span class="source-line-no">8437</span><span id="line-8437">    byte[] ret = splitPolicy.getSplitPoint();</span>
-<span class="source-line-no">8438</span><span id="line-8438">    if (ret != null &amp;&amp; ret.length &gt; 0) {</span>
-<span class="source-line-no">8439</span><span id="line-8439">      ret = splitRestriction.getRestrictedSplitPoint(ret);</span>
-<span class="source-line-no">8440</span><span id="line-8440">    }</span>
-<span class="source-line-no">8441</span><span id="line-8441"></span>
-<span class="source-line-no">8442</span><span id="line-8442">    if (ret != null) {</span>
-<span class="source-line-no">8443</span><span id="line-8443">      try {</span>
-<span class="source-line-no">8444</span><span id="line-8444">        checkRow(ret, "calculated split");</span>
-<span class="source-line-no">8445</span><span id="line-8445">      } catch (IOException e) {</span>
-<span class="source-line-no">8446</span><span id="line-8446">        LOG.error("Ignoring invalid split for region {}", this, e);</span>
-<span class="source-line-no">8447</span><span id="line-8447">        return Optional.empty();</span>
-<span class="source-line-no">8448</span><span id="line-8448">      }</span>
-<span class="source-line-no">8449</span><span id="line-8449">      return Optional.of(ret);</span>
-<span class="source-line-no">8450</span><span id="line-8450">    } else {</span>
-<span class="source-line-no">8451</span><span id="line-8451">      return Optional.empty();</span>
-<span class="source-line-no">8452</span><span id="line-8452">    }</span>
-<span class="source-line-no">8453</span><span id="line-8453">  }</span>
+<span class="source-line-no">8428</span><span id="line-8428">  public Optional&lt;byte[]&gt; checkSplit() {</span>
+<span class="source-line-no">8429</span><span id="line-8429">    return checkSplit(false);</span>
+<span class="source-line-no">8430</span><span id="line-8430">  }</span>
+<span class="source-line-no">8431</span><span id="line-8431"></span>
+<span class="source-line-no">8432</span><span id="line-8432">  /**</span>
+<span class="source-line-no">8433</span><span id="line-8433">   * Return the split point. An empty result indicates the region isn't splittable.</span>
+<span class="source-line-no">8434</span><span id="line-8434">   */</span>
+<span class="source-line-no">8435</span><span id="line-8435">  public Optional&lt;byte[]&gt; checkSplit(boolean force) {</span>
+<span class="source-line-no">8436</span><span id="line-8436">    // Can't split META</span>
+<span class="source-line-no">8437</span><span id="line-8437">    if (this.getRegionInfo().isMetaRegion()) {</span>
+<span class="source-line-no">8438</span><span id="line-8438">      return Optional.empty();</span>
+<span class="source-line-no">8439</span><span id="line-8439">    }</span>
+<span class="source-line-no">8440</span><span id="line-8440"></span>
+<span class="source-line-no">8441</span><span id="line-8441">    // Can't split a region that is closing.</span>
+<span class="source-line-no">8442</span><span id="line-8442">    if (this.isClosing()) {</span>
+<span class="source-line-no">8443</span><span id="line-8443">      return Optional.empty();</span>
+<span class="source-line-no">8444</span><span id="line-8444">    }</span>
+<span class="source-line-no">8445</span><span id="line-8445"></span>
+<span class="source-line-no">8446</span><span id="line-8446">    if (!force &amp;&amp; !splitPolicy.shouldSplit()) {</span>
+<span class="source-line-no">8447</span><span id="line-8447">      return Optional.empty();</span>
+<span class="source-line-no">8448</span><span id="line-8448">    }</span>
+<span class="source-line-no">8449</span><span id="line-8449"></span>
+<span class="source-line-no">8450</span><span id="line-8450">    byte[] ret = splitPolicy.getSplitPoint();</span>
+<span class="source-line-no">8451</span><span id="line-8451">    if (ret != null &amp;&amp; ret.length &gt; 0) {</span>
+<span class="source-line-no">8452</span><span id="line-8452">      ret = splitRestriction.getRestrictedSplitPoint(ret);</span>
+<span class="source-line-no">8453</span><span id="line-8453">    }</span>
 <span class="source-line-no">8454</span><span id="line-8454"></span>
-<span class="source-line-no">8455</span><span id="line-8455">  /** Returns The priority that this region should have in the compaction queue */</span>
-<span class="source-line-no">8456</span><span id="line-8456">  public int getCompactPriority() {</span>
-<span class="source-line-no">8457</span><span id="line-8457">    if (checkSplit().isPresent() &amp;&amp; conf.getBoolean(SPLIT_IGNORE_BLOCKING_ENABLED_KEY, false)) {</span>
-<span class="source-line-no">8458</span><span id="line-8458">      // if a region should split, split it before compact</span>
-<span class="source-line-no">8459</span><span id="line-8459">      return Store.PRIORITY_USER;</span>
-<span class="source-line-no">8460</span><span id="line-8460">    }</span>
-<span class="source-line-no">8461</span><span id="line-8461">    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()</span>
-<span class="source-line-no">8462</span><span id="line-8462">      .orElse(Store.NO_PRIORITY);</span>
-<span class="source-line-no">8463</span><span id="line-8463">  }</span>
-<span class="source-line-no">8464</span><span id="line-8464"></span>
-<span class="source-line-no">8465</span><span id="line-8465">  /** Returns the coprocessor host */</span>
-<span class="source-line-no">8466</span><span id="line-8466">  public RegionCoprocessorHost getCoprocessorHost() {</span>
-<span class="source-line-no">8467</span><span id="line-8467">    return coprocessorHost;</span>
-<span class="source-line-no">8468</span><span id="line-8468">  }</span>
-<span class="source-line-no">8469</span><span id="line-8469"></span>
-<span class="source-line-no">8470</span><span id="line-8470">  /** @param coprocessorHost the new coprocessor host */</span>
-<span class="source-line-no">8471</span><span id="line-8471">  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {</span>
-<span class="source-line-no">8472</span><span id="line-8472">    this.coprocessorHost = coprocessorHost;</span>
-<span class="source-line-no">8473</span><span id="line-8473">  }</span>
-<span class="source-line-no">8474</span><span id="line-8474"></span>
-<span class="source-line-no">8475</span><span id="line-8475">  @Override</span>
-<span class="source-line-no">8476</span><span id="line-8476">  public void startRegionOperation() throws IOException {</span>
-<span class="source-line-no">8477</span><span id="line-8477">    startRegionOperation(Operation.ANY);</span>
-<span class="source-line-no">8478</span><span id="line-8478">  }</span>
-<span class="source-line-no">8479</span><span id="line-8479"></span>
-<span class="source-line-no">8480</span><span id="line-8480">  @Override</span>
-<span class="source-line-no">8481</span><span id="line-8481">  public void startRegionOperation(Operation op) throws IOException {</span>
-<span class="source-line-no">8482</span><span id="line-8482">    boolean isInterruptableOp = false;</span>
-<span class="source-line-no">8483</span><span id="line-8483">    switch (op) {</span>
-<span class="source-line-no">8484</span><span id="line-8484">      case GET: // interruptible read operations</span>
-<span class="source-line-no">8485</span><span id="line-8485">      case SCAN:</span>
-<span class="source-line-no">8486</span><span id="line-8486">        isInterruptableOp = true;</span>
-<span class="source-line-no">8487</span><span id="line-8487">        checkReadsEnabled();</span>
-<span class="source-line-no">8488</span><span id="line-8488">        break;</span>
-<span class="source-line-no">8489</span><span id="line-8489">      case INCREMENT: // interruptible write operations</span>
-<span class="source-line-no">8490</span><span id="line-8490">      case APPEND:</span>
-<span class="source-line-no">8491</span><span id="line-8491">      case PUT:</span>
-<span class="source-line-no">8492</span><span id="line-8492">      case DELETE:</span>
-<span class="source-line-no">8493</span><span id="line-8493">      case BATCH_MUTATE:</span>
-<span class="source-line-no">8494</span><span id="line-8494">      case CHECK_AND_MUTATE:</span>
-<span class="source-line-no">8495</span><span id="line-8495">        isInterruptableOp = true;</span>
-<span class="source-line-no">8496</span><span id="line-8496">        break;</span>
-<span class="source-line-no">8497</span><span id="line-8497">      default: // all others</span>
-<span class="source-line-no">8498</span><span id="line-8498">        break;</span>
-<span class="source-line-no">8499</span><span id="line-8499">    }</span>
-<span class="source-line-no">8500</span><span id="line-8500">    if (</span>
-<span class="source-line-no">8501</span><span id="line-8501">      op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION || op == Operation.COMPACT_REGION</span>
-<span class="source-line-no">8502</span><span id="line-8502">        || op == Operation.COMPACT_SWITCH</span>
-<span class="source-line-no">8503</span><span id="line-8503">    ) {</span>
-<span class="source-line-no">8504</span><span id="line-8504">      // split, merge or compact region doesn't need to check the closing/closed state or lock the</span>
-<span class="source-line-no">8505</span><span id="line-8505">      // region</span>
-<span class="source-line-no">8506</span><span id="line-8506">      return;</span>
-<span class="source-line-no">8507</span><span id="line-8507">    }</span>
-<span class="source-line-no">8508</span><span id="line-8508">    if (this.closing.get()) {</span>
-<span class="source-line-no">8509</span><span id="line-8509">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");</span>
-<span class="source-line-no">8510</span><span id="line-8510">    }</span>
-<span class="source-line-no">8511</span><span id="line-8511">    lock(lock.readLock());</span>
-<span class="source-line-no">8512</span><span id="line-8512">    // Update regionLockHolders ONLY for any startRegionOperation call that is invoked from</span>
-<span class="source-line-no">8513</span><span id="line-8513">    // an RPC handler</span>
-<span class="source-line-no">8514</span><span id="line-8514">    Thread thisThread = Thread.currentThread();</span>
-<span class="source-line-no">8515</span><span id="line-8515">    if (isInterruptableOp) {</span>
-<span class="source-line-no">8516</span><span id="line-8516">      regionLockHolders.put(thisThread, true);</span>
-<span class="source-line-no">8517</span><span id="line-8517">    }</span>
-<span class="source-line-no">8518</span><span id="line-8518">    if (this.closed.get()) {</span>
-<span class="source-line-no">8519</span><span id="line-8519">      lock.readLock().unlock();</span>
-<span class="source-line-no">8520</span><span id="line-8520">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");</span>
-<span class="source-line-no">8521</span><span id="line-8521">    }</span>
-<span class="source-line-no">8522</span><span id="line-8522">    // The unit for snapshot is a region. So, all stores for this region must be</span>
-<span class="source-line-no">8523</span><span id="line-8523">    // prepared for snapshot operation before proceeding.</span>
-<span class="source-line-no">8524</span><span id="line-8524">    if (op == Operation.SNAPSHOT) {</span>
-<span class="source-line-no">8525</span><span id="line-8525">      stores.values().forEach(HStore::preSnapshotOperation);</span>
-<span class="source-line-no">8526</span><span id="line-8526">    }</span>
-<span class="source-line-no">8527</span><span id="line-8527">    try {</span>
-<span class="source-line-no">8528</span><span id="line-8528">      if (coprocessorHost != null) {</span>
-<span class="source-line-no">8529</span><span id="line-8529">        coprocessorHost.postStartRegionOperation(op);</span>
-<span class="source-line-no">8530</span><span id="line-8530">      }</span>
-<span class="source-line-no">8531</span><span id="line-8531">    } catch (Exception e) {</span>
-<span class="source-line-no">8532</span><span id="line-8532">      if (isInterruptableOp) {</span>
-<span class="source-line-no">8533</span><span id="line-8533">        // would be harmless to remove what we didn't add but we know by 'isInterruptableOp'</span>
-<span class="source-line-no">8534</span><span id="line-8534">        // if we added this thread to regionLockHolders</span>
-<span class="source-line-no">8535</span><span id="line-8535">        regionLockHolders.remove(thisThread);</span>
-<span class="source-line-no">8536</span><span id="line-8536">      }</span>
-<span class="source-line-no">8537</span><span id="line-8537">      lock.readLock().unlock();</span>
-<span class="source-line-no">8538</span><span id="line-8538">      throw new IOException(e);</span>
+<span class="source-line-no">8455</span><span id="line-8455">    if (ret != null) {</span>
+<span class="source-line-no">8456</span><span id="line-8456">      try {</span>
+<span class="source-line-no">8457</span><span id="line-8457">        checkRow(ret, "calculated split");</span>
+<span class="source-line-no">8458</span><span id="line-8458">      } catch (IOException e) {</span>
+<span class="source-line-no">8459</span><span id="line-8459">        LOG.error("Ignoring invalid split for region {}", this, e);</span>
+<span class="source-line-no">8460</span><span id="line-8460">        return Optional.empty();</span>
+<span class="source-line-no">8461</span><span id="line-8461">      }</span>
+<span class="source-line-no">8462</span><span id="line-8462">      return Optional.of(ret);</span>
+<span class="source-line-no">8463</span><span id="line-8463">    } else {</span>
+<span class="source-line-no">8464</span><span id="line-8464">      return Optional.empty();</span>
+<span class="source-line-no">8465</span><span id="line-8465">    }</span>
+<span class="source-line-no">8466</span><span id="line-8466">  }</span>
+<span class="source-line-no">8467</span><span id="line-8467"></span>
+<span class="source-line-no">8468</span><span id="line-8468">  /** Returns The priority that this region should have in the compaction queue */</span>
+<span class="source-line-no">8469</span><span id="line-8469">  public int getCompactPriority() {</span>
+<span class="source-line-no">8470</span><span id="line-8470">    if (checkSplit().isPresent() &amp;&amp; conf.getBoolean(SPLIT_IGNORE_BLOCKING_ENABLED_KEY, false)) {</span>
+<span class="source-line-no">8471</span><span id="line-8471">      // if a region should split, split it before compact</span>
+<span class="source-line-no">8472</span><span id="line-8472">      return Store.PRIORITY_USER;</span>
+<span class="source-line-no">8473</span><span id="line-8473">    }</span>
+<span class="source-line-no">8474</span><span id="line-8474">    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()</span>
+<span class="source-line-no">8475</span><span id="line-8475">      .orElse(Store.NO_PRIORITY);</span>
+<span class="source-line-no">8476</span><span id="line-8476">  }</span>
+<span class="source-line-no">8477</span><span id="line-8477"></span>
+<span class="source-line-no">8478</span><span id="line-8478">  /** Returns the coprocessor host */</span>
+<span class="source-line-no">8479</span><span id="line-8479">  public RegionCoprocessorHost getCoprocessorHost() {</span>
+<span class="source-line-no">8480</span><span id="line-8480">    return coprocessorHost;</span>
+<span class="source-line-no">8481</span><span id="line-8481">  }</span>
+<span class="source-line-no">8482</span><span id="line-8482"></span>
+<span class="source-line-no">8483</span><span id="line-8483">  /** @param coprocessorHost the new coprocessor host */</span>
+<span class="source-line-no">8484</span><span id="line-8484">  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {</span>
+<span class="source-line-no">8485</span><span id="line-8485">    this.coprocessorHost = coprocessorHost;</span>
+<span class="source-line-no">8486</span><span id="line-8486">  }</span>
+<span class="source-line-no">8487</span><span id="line-8487"></span>
+<span class="source-line-no">8488</span><span id="line-8488">  @Override</span>
+<span class="source-line-no">8489</span><span id="line-8489">  public void startRegionOperation() throws IOException {</span>
+<span class="source-line-no">8490</span><span id="line-8490">    startRegionOperation(Operation.ANY);</span>
+<span class="source-line-no">8491</span><span id="line-8491">  }</span>
+<span class="source-line-no">8492</span><span id="line-8492"></span>
+<span class="source-line-no">8493</span><span id="line-8493">  @Override</span>
+<span class="source-line-no">8494</span><span id="line-8494">  public void startRegionOperation(Operation op) throws IOException {</span>
+<span class="source-line-no">8495</span><span id="line-8495">    boolean isInterruptableOp = false;</span>
+<span class="source-line-no">8496</span><span id="line-8496">    switch (op) {</span>
+<span class="source-line-no">8497</span><span id="line-8497">      case GET: // interruptible read operations</span>
+<span class="source-line-no">8498</span><span id="line-8498">      case SCAN:</span>
+<span class="source-line-no">8499</span><span id="line-8499">        isInterruptableOp = true;</span>
+<span class="source-line-no">8500</span><span id="line-8500">        checkReadsEnabled();</span>
+<span class="source-line-no">8501</span><span id="line-8501">        break;</span>
+<span class="source-line-no">8502</span><span id="line-8502">      case INCREMENT: // interruptible write operations</span>
+<span class="source-line-no">8503</span><span id="line-8503">      case APPEND:</span>
+<span class="source-line-no">8504</span><span id="line-8504">      case PUT:</span>
+<span class="source-line-no">8505</span><span id="line-8505">      case DELETE:</span>
+<span class="source-line-no">8506</span><span id="line-8506">      case BATCH_MUTATE:</span>
+<span class="source-line-no">8507</span><span id="line-8507">      case CHECK_AND_MUTATE:</span>
+<span class="source-line-no">8508</span><span id="line-8508">        isInterruptableOp = true;</span>
+<span class="source-line-no">8509</span><span id="line-8509">        break;</span>
+<span class="source-line-no">8510</span><span id="line-8510">      default: // all others</span>
+<span class="source-line-no">8511</span><span id="line-8511">        break;</span>
+<span class="source-line-no">8512</span><span id="line-8512">    }</span>
+<span class="source-line-no">8513</span><span id="line-8513">    if (</span>
+<span class="source-line-no">8514</span><span id="line-8514">      op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION || op == Operation.COMPACT_REGION</span>
+<span class="source-line-no">8515</span><span id="line-8515">        || op == Operation.COMPACT_SWITCH</span>
+<span class="source-line-no">8516</span><span id="line-8516">    ) {</span>
+<span class="source-line-no">8517</span><span id="line-8517">      // split, merge or compact region doesn't need to check the closing/closed state or lock the</span>
+<span class="source-line-no">8518</span><span id="line-8518">      // region</span>
+<span class="source-line-no">8519</span><span id="line-8519">      return;</span>
+<span class="source-line-no">8520</span><span id="line-8520">    }</span>
+<span class="source-line-no">8521</span><span id="line-8521">    if (this.closing.get()) {</span>
+<span class="source-line-no">8522</span><span id="line-8522">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");</span>
+<span class="source-line-no">8523</span><span id="line-8523">    }</span>
+<span class="source-line-no">8524</span><span id="line-8524">    lock(lock.readLock());</span>
+<span class="source-line-no">8525</span><span id="line-8525">    // Update regionLockHolders ONLY for any startRegionOperation call that is invoked from</span>
+<span class="source-line-no">8526</span><span id="line-8526">    // an RPC handler</span>
+<span class="source-line-no">8527</span><span id="line-8527">    Thread thisThread = Thread.currentThread();</span>
+<span class="source-line-no">8528</span><span id="line-8528">    if (isInterruptableOp) {</span>
+<span class="source-line-no">8529</span><span id="line-8529">      regionLockHolders.put(thisThread, true);</span>
+<span class="source-line-no">8530</span><span id="line-8530">    }</span>
+<span class="source-line-no">8531</span><span id="line-8531">    if (this.closed.get()) {</span>
+<span class="source-line-no">8532</span><span id="line-8532">      lock.readLock().unlock();</span>
+<span class="source-line-no">8533</span><span id="line-8533">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");</span>
+<span class="source-line-no">8534</span><span id="line-8534">    }</span>
+<span class="source-line-no">8535</span><span id="line-8535">    // The unit for snapshot is a region. So, all stores for this region must be</span>
+<span class="source-line-no">8536</span><span id="line-8536">    // prepared for snapshot operation before proceeding.</span>
+<span class="source-line-no">8537</span><span id="line-8537">    if (op == Operation.SNAPSHOT) {</span>
+<span class="source-line-no">8538</span><span id="line-8538">      stores.values().forEach(HStore::preSnapshotOperation);</span>
 <span class="source-line-no">8539</span><span id="line-8539">    }</span>
-<span class="source-line-no">8540</span><span id="line-8540">  }</span>
-<span class="source-line-no">8541</span><span id="line-8541"></span>
-<span class="source-line-no">8542</span><span id="line-8542">  @Override</span>
-<span class="source-line-no">8543</span><span id="line-8543">  public void closeRegionOperation() throws IOException {</span>
-<span class="source-line-no">8544</span><span id="line-8544">    closeRegionOperation(Operation.ANY);</span>
-<span class="source-line-no">8545</span><span id="line-8545">  }</span>
-<span class="source-line-no">8546</span><span id="line-8546"></span>
-<span class="source-line-no">8547</span><span id="line-8547">  @Override</span>
-<span class="source-line-no">8548</span><span id="line-8548">  public void closeRegionOperation(Operation operation) throws IOException {</span>
-<span class="source-line-no">8549</span><span id="line-8549">    if (operation == Operation.SNAPSHOT) {</span>
-<span class="source-line-no">8550</span><span id="line-8550">      stores.values().forEach(HStore::postSnapshotOperation);</span>
-<span class="source-line-no">8551</span><span id="line-8551">    }</span>
-<span class="source-line-no">8552</span><span id="line-8552">    Thread thisThread = Thread.currentThread();</span>
-<span class="source-line-no">8553</span><span id="line-8553">    regionLockHolders.remove(thisThread);</span>
-<span class="source-line-no">8554</span><span id="line-8554">    lock.readLock().unlock();</span>
-<span class="source-line-no">8555</span><span id="line-8555">    if (coprocessorHost != null) {</span>
-<span class="source-line-no">8556</span><span id="line-8556">      coprocessorHost.postCloseRegionOperation(operation);</span>
-<span class="source-line-no">8557</span><span id="line-8557">    }</span>
+<span class="source-line-no">8540</span><span id="line-8540">    try {</span>
+<span class="source-line-no">8541</span><span id="line-8541">      if (coprocessorHost != null) {</span>
+<span class="source-line-no">8542</span><span id="line-8542">        coprocessorHost.postStartRegionOperation(op);</span>
+<span class="source-line-no">8543</span><span id="line-8543">      }</span>
+<span class="source-line-no">8544</span><span id="line-8544">    } catch (Exception e) {</span>
+<span class="source-line-no">8545</span><span id="line-8545">      if (isInterruptableOp) {</span>
+<span class="source-line-no">8546</span><span id="line-8546">        // would be harmless to remove what we didn't add but we know by 'isInterruptableOp'</span>
+<span class="source-line-no">8547</span><span id="line-8547">        // if we added this thread to regionLockHolders</span>
+<span class="source-line-no">8548</span><span id="line-8548">        regionLockHolders.remove(thisThread);</span>
+<span class="source-line-no">8549</span><span id="line-8549">      }</span>
+<span class="source-line-no">8550</span><span id="line-8550">      lock.readLock().unlock();</span>
+<span class="source-line-no">8551</span><span id="line-8551">      throw new IOException(e);</span>
+<span class="source-line-no">8552</span><span id="line-8552">    }</span>
+<span class="source-line-no">8553</span><span id="line-8553">  }</span>
+<span class="source-line-no">8554</span><span id="line-8554"></span>
+<span class="source-line-no">8555</span><span id="line-8555">  @Override</span>
+<span class="source-line-no">8556</span><span id="line-8556">  public void closeRegionOperation() throws IOException {</span>
+<span class="source-line-no">8557</span><span id="line-8557">    closeRegionOperation(Operation.ANY);</span>
 <span class="source-line-no">8558</span><span id="line-8558">  }</span>
 <span class="source-line-no">8559</span><span id="line-8559"></span>
-<span class="source-line-no">8560</span><span id="line-8560">  /**</span>
-<span class="source-line-no">8561</span><span id="line-8561">   * This method needs to be called before any public call that reads or modifies stores in bulk. It</span>
-<span class="source-line-no">8562</span><span id="line-8562">   * has to be called just before a try. #closeBulkRegionOperation needs to be called in the try's</span>
-<span class="source-line-no">8563</span><span id="line-8563">   * finally block Acquires a writelock and checks if the region is closing or closed.</span>
-<span class="source-line-no">8564</span><span id="line-8564">   * @throws NotServingRegionException when the region is closing or closed</span>
-<span class="source-line-no">8565</span><span id="line-8565">   * @throws RegionTooBusyException    if failed to get the lock in time</span>
-<span class="source-line-no">8566</span><span id="line-8566">   * @throws InterruptedIOException    if interrupted while waiting for a lock</span>
-<span class="source-line-no">8567</span><span id="line-8567">   */</span>
-<span class="source-line-no">8568</span><span id="line-8568">  private void startBulkRegionOperation(boolean writeLockNeeded) throws IOException {</span>
-<span class="source-line-no">8569</span><span id="line-8569">    if (this.closing.get()) {</span>
-<span class="source-line-no">8570</span><span id="line-8570">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");</span>
-<span class="source-line-no">8571</span><span id="line-8571">    }</span>
-<span class="source-line-no">8572</span><span id="line-8572">    if (writeLockNeeded) lock(lock.writeLock());</span>
-<span class="source-line-no">8573</span><span id="line-8573">    else lock(lock.readLock());</span>
-<span class="source-line-no">8574</span><span id="line-8574">    if (this.closed.get()) {</span>
-<span class="source-line-no">8575</span><span id="line-8575">      if (writeLockNeeded) lock.writeLock().unlock();</span>
-<span class="source-line-no">8576</span><span id="line-8576">      else lock.readLock().unlock();</span>
-<span class="source-line-no">8577</span><span id="line-8577">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");</span>
-<span class="source-line-no">8578</span><span id="line-8578">    }</span>
-<span class="source-line-no">8579</span><span id="line-8579">    regionLockHolders.put(Thread.currentThread(), true);</span>
-<span class="source-line-no">8580</span><span id="line-8580">  }</span>
-<span class="source-line-no">8581</span><span id="line-8581"></span>
-<span class="source-line-no">8582</span><span id="line-8582">  /**</span>
-<span class="source-line-no">8583</span><span id="line-8583">   * Closes the lock. This needs to be called in the finally block corresponding to the try block of</span>
-<span class="source-line-no">8584</span><span id="line-8584">   * #startRegionOperation</span>
-<span class="source-line-no">8585</span><span id="line-8585">   */</span>
-<span class="source-line-no">8586</span><span id="line-8586">  private void closeBulkRegionOperation() {</span>
-<span class="source-line-no">8587</span><span id="line-8587">    regionLockHolders.remove(Thread.currentThread());</span>
-<span class="source-line-no">8588</span><span id="line-8588">    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();</span>
-<span class="source-line-no">8589</span><span id="line-8589">    else lock.readLock().unlock();</span>
-<span class="source-line-no">8590</span><span id="line-8590">  }</span>
-<span class="source-line-no">8591</span><span id="line-8591"></span>
-<span class="source-line-no">8592</span><span id="line-8592">  /**</span>
-<span class="source-line-no">8593</span><span id="line-8593">   * Update LongAdders for number of puts without wal and the size of possible data loss. These</span>
-<span class="source-line-no">8594</span><span id="line-8594">   * information are exposed by the region server metrics.</span>
-<span class="source-line-no">8595</span><span id="line-8595">   */</span>
-<span class="source-line-no">8596</span><span id="line-8596">  private void recordMutationWithoutWal(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {</span>
-<span class="source-line-no">8597</span><span id="line-8597">    numMutationsWithoutWAL.increment();</span>
-<span class="source-line-no">8598</span><span id="line-8598">    if (numMutationsWithoutWAL.sum() &lt;= 1) {</span>
-<span class="source-line-no">8599</span><span id="line-8599">      LOG.info("writing data to region " + this</span>
-<span class="source-line-no">8600</span><span id="line-8600">        + " with WAL disabled. Data may be lost in the event of a crash.");</span>
-<span class="source-line-no">8601</span><span id="line-8601">    }</span>
-<span class="source-line-no">8602</span><span id="line-8602"></span>
-<span class="source-line-no">8603</span><span id="line-8603">    long mutationSize = 0;</span>
-<span class="source-line-no">8604</span><span id="line-8604">    for (List&lt;Cell&gt; cells : familyMap.values()) {</span>
-<span class="source-line-no">8605</span><span id="line-8605">      // Optimization: 'foreach' loop is not used. See:</span>
-<span class="source-line-no">8606</span><span id="line-8606">      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects</span>
-<span class="source-line-no">8607</span><span id="line-8607">      assert cells instanceof RandomAccess;</span>
-<span class="source-line-no">8608</span><span id="line-8608">      int listSize = cells.size();</span>
-<span class="source-line-no">8609</span><span id="line-8609">      for (int i = 0; i &lt; listSize; i++) {</span>
-<span class="source-line-no">8610</span><span id="line-8610">        Cell cell = cells.get(i);</span>
-<span class="source-line-no">8611</span><span id="line-8611">        mutationSize += cell.getSerializedSize();</span>
-<span class="source-line-no">8612</span><span id="line-8612">      }</span>
-<span class="source-line-no">8613</span><span id="line-8613">    }</span>
-<span class="source-line-no">8614</span><span id="line-8614"></span>
-<span class="source-line-no">8615</span><span id="line-8615">    dataInMemoryWithoutWAL.add(mutationSize);</span>
-<span class="source-line-no">8616</span><span id="line-8616">  }</span>
-<span class="source-line-no">8617</span><span id="line-8617"></span>
-<span class="source-line-no">8618</span><span id="line-8618">  private void lock(final Lock lock) throws IOException {</span>
-<span class="source-line-no">8619</span><span id="line-8619">    lock(lock, 1);</span>
-<span class="source-line-no">8620</span><span id="line-8620">  }</span>
-<span class="source-line-no">8621</span><span id="line-8621"></span>
-<span class="source-line-no">8622</span><span id="line-8622">  /**</span>
-<span class="source-line-no">8623</span><span id="line-8623">   * Try to acquire a lock. Throw RegionTooBusyException if failed to get the lock in time. Throw</span>
-<span class="source-line-no">8624</span><span id="line-8624">   * InterruptedIOException if interrupted while waiting for the lock.</span>
-<span class="source-line-no">8625</span><span id="line-8625">   */</span>
-<span class="source-line-no">8626</span><span id="line-8626">  private void lock(final Lock lock, final int multiplier) throws IOException {</span>
-<span class="source-line-no">8627</span><span id="line-8627">    try {</span>
-<span class="source-line-no">8628</span><span id="line-8628">      final long waitTime = Math.min(maxBusyWaitDuration,</span>
-<span class="source-line-no">8629</span><span id="line-8629">        busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));</span>
-<span class="source-line-no">8630</span><span id="line-8630">      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {</span>
-<span class="source-line-no">8631</span><span id="line-8631">        // Don't print millis. Message is used as a key over in</span>
-<span class="source-line-no">8632</span><span id="line-8632">        // RetriesExhaustedWithDetailsException processing.</span>
-<span class="source-line-no">8633</span><span id="line-8633">        final String regionName =</span>
-<span class="source-line-no">8634</span><span id="line-8634">          this.getRegionInfo() == null ? "unknown" : this.getRegionInfo().getRegionNameAsString();</span>
-<span class="source-line-no">8635</span><span id="line-8635">        final String serverName = this.getRegionServerServices() == null</span>
-<span class="source-line-no">8636</span><span id="line-8636">          ? "unknown"</span>
-<span class="source-line-no">8637</span><span id="line-8637">          : (this.getRegionServerServices().getServerName() == null</span>
-<span class="source-line-no">8638</span><span id="line-8638">            ? "unknown"</span>
-<span class="source-line-no">8639</span><span id="line-8639">            : this.getRegionServerServices().getServerName().toString());</span>
-<span class="source-line-no">8640</span><span id="line-8640">        RegionTooBusyException rtbe = new RegionTooBusyException(</span>
-<span class="source-line-no">8641</span><span id="line-8641">          "Failed to obtain lock; regionName=" + regionName + ", server=" + serverName);</span>
-<span class="source-line-no">8642</span><span id="line-8642">        LOG.warn("Region is too busy to allow lock acquisition.", rtbe);</span>
-<span class="source-line-no">8643</span><span id="line-8643">        throw rtbe;</span>
-<span class="source-line-no">8644</span><span id="line-8644">      }</span>
-<span class="source-line-no">8645</span><span id="line-8645">    } catch (InterruptedException ie) {</span>
-<span class="source-line-no">8646</span><span id="line-8646">      if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">8647</span><span id="line-8647">        LOG.debug("Interrupted while waiting for a lock in region {}", this);</span>
-<span class="source-line-no">8648</span><span id="line-8648">      }</span>
-<span class="source-line-no">8649</span><span id="line-8649">      throw throwOnInterrupt(ie);</span>
-<span class="source-line-no">8650</span><span id="line-8650">    }</span>
-<span class="source-line-no">8651</span><span id="line-8651">  }</span>
-<span class="source-line-no">8652</span><span id="line-8652"></span>
-<span class="source-line-no">8653</span><span id="line-8653">  /**</span>
-<span class="source-line-no">8654</span><span id="line-8654">   * Calls sync with the given transaction ID</span>
-<span class="source-line-no">8655</span><span id="line-8655">   * @param txid should sync up to which transaction</span>
-<span class="source-line-no">8656</span><span id="line-8656">   * @throws IOException If anything goes wrong with DFS</span>
-<span class="source-line-no">8657</span><span id="line-8657">   */</span>
-<span class="source-line-no">8658</span><span id="line-8658">  private void sync(long txid, Durability durability) throws IOException {</span>
-<span class="source-line-no">8659</span><span id="line-8659">    if (this.getRegionInfo().isMetaRegion()) {</span>
-<span class="source-line-no">8660</span><span id="line-8660">      this.wal.sync(txid);</span>
-<span class="source-line-no">8661</span><span id="line-8661">    } else {</span>
-<span class="source-line-no">8662</span><span id="line-8662">      switch (durability) {</span>
-<span class="source-line-no">8663</span><span id="line-8663">        case USE_DEFAULT:</span>
-<span class="source-line-no">8664</span><span id="line-8664">          // do what table defaults to</span>
-<span class="source-line-no">8665</span><span id="line-8665">          if (shouldSyncWAL()) {</span>
-<span class="source-line-no">8666</span><span id="line-8666">            this.wal.sync(txid);</span>
-<span class="source-line-no">8667</span><span id="line-8667">          }</span>
-<span class="source-line-no">8668</span><span id="line-8668">          break;</span>
-<span class="source-line-no">8669</span><span id="line-8669">        case SKIP_WAL:</span>
-<span class="source-line-no">8670</span><span id="line-8670">          // nothing do to</span>
-<span class="source-line-no">8671</span><span id="line-8671">          break;</span>
-<span class="source-line-no">8672</span><span id="line-8672">        case ASYNC_WAL:</span>
-<span class="source-line-no">8673</span><span id="line-8673">          // nothing do to</span>
-<span class="source-line-no">8674</span><span id="line-8674">          break;</span>
-<span class="source-line-no">8675</span><span id="line-8675">        case SYNC_WAL:</span>
-<span class="source-line-no">8676</span><span id="line-8676">          this.wal.sync(txid, false);</span>
-<span class="source-line-no">8677</span><span id="line-8677">          break;</span>
-<span class="source-line-no">8678</span><span id="line-8678">        case FSYNC_WAL:</span>
-<span class="source-line-no">8679</span><span id="line-8679">          this.wal.sync(txid, true);</span>
-<span class="source-line-no">8680</span><span id="line-8680">          break;</span>
-<span class="source-line-no">8681</span><span id="line-8681">        default:</span>
-<span class="source-line-no">8682</span><span id="line-8682">          throw new RuntimeException("Unknown durability " + durability);</span>
-<span class="source-line-no">8683</span><span id="line-8683">      }</span>
-<span class="source-line-no">8684</span><span id="line-8684">    }</span>
-<span class="source-line-no">8685</span><span id="line-8685">  }</span>
-<span class="source-line-no">8686</span><span id="line-8686"></span>
-<span class="source-line-no">8687</span><span id="line-8687">  /**</span>
-<span class="source-line-no">8688</span><span id="line-8688">   * Check whether we should sync the wal from the table's durability settings</span>
-<span class="source-line-no">8689</span><span id="line-8689">   */</span>
-<span class="source-line-no">8690</span><span id="line-8690">  private boolean shouldSyncWAL() {</span>
-<span class="source-line-no">8691</span><span id="line-8691">    return regionDurability.ordinal() &gt; Durability.ASYNC_WAL.ordinal();</span>
-<span class="source-line-no">8692</span><span id="line-8692">  }</span>
-<span class="source-line-no">8693</span><span id="line-8693"></span>
-<span class="source-line-no">8694</span><span id="line-8694">  /** Returns the latest sequence number that was read from storage when this region was opened */</span>
-<span class="source-line-no">8695</span><span id="line-8695">  public long getOpenSeqNum() {</span>
-<span class="source-line-no">8696</span><span id="line-8696">    return this.openSeqNum;</span>
-<span class="source-line-no">8697</span><span id="line-8697">  }</span>
-<span class="source-line-no">8698</span><span id="line-8698"></span>
-<span class="source-line-no">8699</span><span id="line-8699">  @Override</span>
-<span class="source-line-no">8700</span><span id="line-8700">  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {</span>
-<span class="source-line-no">8701</span><span id="line-8701">    return this.maxSeqIdInStores;</span>
-<span class="source-line-no">8702</span><span id="line-8702">  }</span>
-<span class="source-line-no">8703</span><span id="line-8703"></span>
-<span class="source-line-no">8704</span><span id="line-8704">  public long getOldestSeqIdOfStore(byte[] familyName) {</span>
-<span class="source-line-no">8705</span><span id="line-8705">    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);</span>
-<span class="source-line-no">8706</span><span id="line-8706">  }</span>
-<span class="source-line-no">8707</span><span id="line-8707"></span>
-<span class="source-line-no">8708</span><span id="line-8708">  @Override</span>
-<span class="source-line-no">8709</span><span id="line-8709">  public CompactionState getCompactionState() {</span>
-<span class="source-line-no">8710</span><span id="line-8710">    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;</span>
-<span class="source-line-no">8711</span><span id="line-8711">    return (hasMajor</span>
-<span class="source-line-no">8712</span><span id="line-8712">      ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)</span>
-<span class="source-line-no">8713</span><span id="line-8713">      : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));</span>
-<span class="source-line-no">8714</span><span id="line-8714">  }</span>
-<span class="source-line-no">8715</span><span id="line-8715"></span>
-<span class="source-line-no">8716</span><span id="line-8716">  public void reportCompactionRequestStart(boolean isMajor) {</span>
-<span class="source-line-no">8717</span><span id="line-8717">    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();</span>
-<span class="source-line-no">8718</span><span id="line-8718">  }</span>
-<span class="source-line-no">8719</span><span id="line-8719"></span>
-<span class="source-line-no">8720</span><span id="line-8720">  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {</span>
-<span class="source-line-no">8721</span><span id="line-8721">    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();</span>
-<span class="source-line-no">8722</span><span id="line-8722"></span>
-<span class="source-line-no">8723</span><span id="line-8723">    // metrics</span>
-<span class="source-line-no">8724</span><span id="line-8724">    compactionsFinished.increment();</span>
-<span class="source-line-no">8725</span><span id="line-8725">    compactionNumFilesCompacted.add(numFiles);</span>
-<span class="source-line-no">8726</span><span id="line-8726">    compactionNumBytesCompacted.add(filesSizeCompacted);</span>
-<span class="source-line-no">8727</span><span id="line-8727"></span>
-<span class="source-line-no">8728</span><span id="line-8728">    assert newValue &gt;= 0;</span>
-<span class="source-line-no">8729</span><span id="line-8729">  }</span>
-<span class="source-line-no">8730</span><span id="line-8730"></span>
-<span class="source-line-no">8731</span><span id="line-8731">  public void reportCompactionRequestFailure() {</span>
-<span class="source-line-no">8732</span><span id="line-8732">    compactionsFailed.increment();</span>
-<span class="source-line-no">8733</span><span id="line-8733">  }</span>
-<span class="source-line-no">8734</span><span id="line-8734"></span>
-<span class="source-line-no">8735</span><span id="line-8735">  public void incrementCompactionsQueuedCount() {</span>
-<span class="source-line-no">8736</span><span id="line-8736">    compactionsQueued.increment();</span>
-<span class="source-line-no">8737</span><span id="line-8737">  }</span>
-<span class="source-line-no">8738</span><span id="line-8738"></span>
-<span class="source-line-no">8739</span><span id="line-8739">  public void decrementCompactionsQueuedCount() {</span>
-<span class="source-line-no">8740</span><span id="line-8740">    compactionsQueued.decrement();</span>
-<span class="source-line-no">8741</span><span id="line-8741">  }</span>
-<span class="source-line-no">8742</span><span id="line-8742"></span>
-<span class="source-line-no">8743</span><span id="line-8743">  public void incrementFlushesQueuedCount() {</span>
-<span class="source-line-no">8744</span><span id="line-8744">    flushesQueued.increment();</span>
-<span class="source-line-no">8745</span><span id="line-8745">  }</span>
-<span class="source-line-no">8746</span><span id="line-8746"></span>
-<span class="source-line-no">8747</span><span id="line-8747">  protected void decrementFlushesQueuedCount() {</span>
-<span class="source-line-no">8748</span><span id="line-8748">    flushesQueued.decrement();</span>
-<span class="source-line-no">8749</span><span id="line-8749">  }</span>
-<span class="source-line-no">8750</span><span id="line-8750"></span>
-<span class="source-line-no">8751</span><span id="line-8751">  /**</span>
-<span class="source-line-no">8752</span><span id="line-8752">   * If a handler thread is eligible for interrupt, make it ineligible. Should be paired with</span>
-<span class="source-line-no">8753</span><span id="line-8753">   * {{@link #enableInterrupts()}.</span>
-<span class="source-line-no">8754</span><span id="line-8754">   */</span>
-<span class="source-line-no">8755</span><span id="line-8755">  void disableInterrupts() {</span>
-<span class="source-line-no">8756</span><span id="line-8756">    regionLockHolders.computeIfPresent(Thread.currentThread(), (t, b) -&gt; false);</span>
-<span class="source-line-no">8757</span><span id="line-8757">  }</span>
-<span class="source-line-no">8758</span><span id="line-8758"></span>
-<span class="source-line-no">8759</span><span id="line-8759">  /**</span>
-<span class="source-line-no">8760</span><span id="line-8760">   * If a handler thread was made ineligible for interrupt via {{@link #disableInterrupts()}, make</span>
-<span class="source-line-no">8761</span><span id="line-8761">   * it eligible again. No-op if interrupts are already enabled.</span>
-<span class="source-line-no">8762</span><span id="line-8762">   */</span>
-<span class="source-line-no">8763</span><span id="line-8763">  void enableInterrupts() {</span>
-<span class="source-line-no">8764</span><span id="line-8764">    regionLockHolders.computeIfPresent(Thread.currentThread(), (t, b) -&gt; true);</span>
-<span class="source-line-no">8765</span><span id="line-8765">  }</span>
-<span class="source-line-no">8766</span><span id="line-8766"></span>
-<span class="source-line-no">8767</span><span id="line-8767">  /**</span>
-<span class="source-line-no">8768</span><span id="line-8768">   * Interrupt any region options that have acquired the region lock via</span>
-<span class="source-line-no">8769</span><span id="line-8769">   * {@link #startRegionOperation(org.apache.hadoop.hbase.regionserver.Region.Operation)}, or</span>
-<span class="source-line-no">8770</span><span id="line-8770">   * {@link #startBulkRegionOperation(boolean)}.</span>
-<span class="source-line-no">8771</span><span id="line-8771">   */</span>
-<span class="source-line-no">8772</span><span id="line-8772">  private void interruptRegionOperations() {</span>
-<span class="source-line-no">8773</span><span id="line-8773">    for (Map.Entry&lt;Thread, Boolean&gt; entry : regionLockHolders.entrySet()) {</span>
-<span class="source-line-no">8774</span><span id="line-8774">      // An entry in this map will have a boolean value indicating if it is currently</span>
-<span class="source-line-no">8775</span><span id="line-8775">      // eligible for interrupt; if so, we should interrupt it.</span>
-<span class="source-line-no">8776</span><span id="line-8776">      if (entry.getValue().booleanValue()) {</span>
-<span class="source-line-no">8777</span><span id="line-8777">        entry.getKey().interrupt();</span>
-<span class="source-line-no">8778</span><span id="line-8778">      }</span>
-<span class="source-line-no">8779</span><span id="line-8779">    }</span>
-<span class="source-line-no">8780</span><span id="line-8780">  }</span>
-<span class="source-line-no">8781</span><span id="line-8781"></span>
-<span class="source-line-no">8782</span><span id="line-8782">  /**</span>
-<span class="source-line-no">8783</span><span id="line-8783">   * Check thread interrupt status and throw an exception if interrupted.</span>
-<span class="source-line-no">8784</span><span id="line-8784">   * @throws NotServingRegionException if region is closing</span>
-<span class="source-line-no">8785</span><span id="line-8785">   * @throws InterruptedIOException    if interrupted but region is not closing</span>
-<span class="source-line-no">8786</span><span id="line-8786">   */</span>
-<span class="source-line-no">8787</span><span id="line-8787">  // Package scope for tests</span>
-<span class="source-line-no">8788</span><span id="line-8788">  void checkInterrupt() throws NotServingRegionException, InterruptedIOException {</span>
-<span class="source-line-no">8789</span><span id="line-8789">    if (Thread.interrupted()) {</span>
-<span class="source-line-no">8790</span><span id="line-8790">      if (this.closing.get()) {</span>
-<span class="source-line-no">8791</span><span id="line-8791">        throw new NotServingRegionException(</span>
-<span class="source-line-no">8792</span><span id="line-8792">          getRegionInfo().getRegionNameAsString() + " is closing");</span>
-<span class="source-line-no">8793</span><span id="line-8793">      }</span>
-<span class="source-line-no">8794</span><span id="line-8794">      throw new InterruptedIOException();</span>
-<span class="source-line-no">8795</span><span id="line-8795">    }</span>
-<span class="source-line-no">8796</span><span id="line-8796">  }</span>
-<span class="source-line-no">8797</span><span id="line-8797"></span>
-<span class="source-line-no">8798</span><span id="line-8798">  /**</span>
-<span class="source-line-no">8799</span><span id="line-8799">   * Throw the correct exception upon interrupt</span>
-<span class="source-line-no">8800</span><span id="line-8800">   * @param t cause</span>
-<span class="source-line-no">8801</span><span id="line-8801">   */</span>
-<span class="source-line-no">8802</span><span id="line-8802">  // Package scope for tests</span>
-<span class="source-line-no">8803</span><span id="line-8803">  IOException throwOnInterrupt(Throwable t) {</span>
-<span class="source-line-no">8804</span><span id="line-8804">    if (this.closing.get()) {</span>
-<span class="source-line-no">8805</span><span id="line-8805">      return (NotServingRegionException) new NotServingRegionException(</span>
-<span class="source-line-no">8806</span><span id="line-8806">        getRegionInfo().getRegionNameAsString() + " is closing").initCause(t);</span>
-<span class="source-line-no">8807</span><span id="line-8807">    }</span>
-<span class="source-line-no">8808</span><span id="line-8808">    return (InterruptedIOException) new InterruptedIOException().initCause(t);</span>
+<span class="source-line-no">8560</span><span id="line-8560">  @Override</span>
+<span class="source-line-no">8561</span><span id="line-8561">  public void closeRegionOperation(Operation operation) throws IOException {</span>
+<span class="source-line-no">8562</span><span id="line-8562">    if (operation == Operation.SNAPSHOT) {</span>
+<span class="source-line-no">8563</span><span id="line-8563">      stores.values().forEach(HStore::postSnapshotOperation);</span>
+<span class="source-line-no">8564</span><span id="line-8564">    }</span>
+<span class="source-line-no">8565</span><span id="line-8565">    Thread thisThread = Thread.currentThread();</span>
+<span class="source-line-no">8566</span><span id="line-8566">    regionLockHolders.remove(thisThread);</span>
+<span class="source-line-no">8567</span><span id="line-8567">    lock.readLock().unlock();</span>
+<span class="source-line-no">8568</span><span id="line-8568">    if (coprocessorHost != null) {</span>
+<span class="source-line-no">8569</span><span id="line-8569">      coprocessorHost.postCloseRegionOperation(operation);</span>
+<span class="source-line-no">8570</span><span id="line-8570">    }</span>
+<span class="source-line-no">8571</span><span id="line-8571">  }</span>
+<span class="source-line-no">8572</span><span id="line-8572"></span>
+<span class="source-line-no">8573</span><span id="line-8573">  /**</span>
+<span class="source-line-no">8574</span><span id="line-8574">   * This method needs to be called before any public call that reads or modifies stores in bulk. It</span>
+<span class="source-line-no">8575</span><span id="line-8575">   * has to be called just before a try. #closeBulkRegionOperation needs to be called in the try's</span>
+<span class="source-line-no">8576</span><span id="line-8576">   * finally block Acquires a writelock and checks if the region is closing or closed.</span>
+<span class="source-line-no">8577</span><span id="line-8577">   * @throws NotServingRegionException when the region is closing or closed</span>
+<span class="source-line-no">8578</span><span id="line-8578">   * @throws RegionTooBusyException    if failed to get the lock in time</span>
+<span class="source-line-no">8579</span><span id="line-8579">   * @throws InterruptedIOException    if interrupted while waiting for a lock</span>
+<span class="source-line-no">8580</span><span id="line-8580">   */</span>
+<span class="source-line-no">8581</span><span id="line-8581">  private void startBulkRegionOperation(boolean writeLockNeeded) throws IOException {</span>
+<span class="source-line-no">8582</span><span id="line-8582">    if (this.closing.get()) {</span>
+<span class="source-line-no">8583</span><span id="line-8583">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");</span>
+<span class="source-line-no">8584</span><span id="line-8584">    }</span>
+<span class="source-line-no">8585</span><span id="line-8585">    if (writeLockNeeded) lock(lock.writeLock());</span>
+<span class="source-line-no">8586</span><span id="line-8586">    else lock(lock.readLock());</span>
+<span class="source-line-no">8587</span><span id="line-8587">    if (this.closed.get()) {</span>
+<span class="source-line-no">8588</span><span id="line-8588">      if (writeLockNeeded) lock.writeLock().unlock();</span>
+<span class="source-line-no">8589</span><span id="line-8589">      else lock.readLock().unlock();</span>
+<span class="source-line-no">8590</span><span id="line-8590">      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");</span>
+<span class="source-line-no">8591</span><span id="line-8591">    }</span>
+<span class="source-line-no">8592</span><span id="line-8592">    regionLockHolders.put(Thread.currentThread(), true);</span>
+<span class="source-line-no">8593</span><span id="line-8593">  }</span>
+<span class="source-line-no">8594</span><span id="line-8594"></span>
+<span class="source-line-no">8595</span><span id="line-8595">  /**</span>
+<span class="source-line-no">8596</span><span id="line-8596">   * Closes the lock. This needs to be called in the finally block corresponding to the try block of</span>
+<span class="source-line-no">8597</span><span id="line-8597">   * #startRegionOperation</span>
+<span class="source-line-no">8598</span><span id="line-8598">   */</span>
+<span class="source-line-no">8599</span><span id="line-8599">  private void closeBulkRegionOperation() {</span>
+<span class="source-line-no">8600</span><span id="line-8600">    regionLockHolders.remove(Thread.currentThread());</span>
+<span class="source-line-no">8601</span><span id="line-8601">    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();</span>
+<span class="source-line-no">8602</span><span id="line-8602">    else lock.readLock().unlock();</span>
+<span class="source-line-no">8603</span><span id="line-8603">  }</span>
+<span class="source-line-no">8604</span><span id="line-8604"></span>
+<span class="source-line-no">8605</span><span id="line-8605">  /**</span>
+<span class="source-line-no">8606</span><span id="line-8606">   * Update LongAdders for number of puts without wal and the size of possible data loss. These</span>
+<span class="source-line-no">8607</span><span id="line-8607">   * information are exposed by the region server metrics.</span>
+<span class="source-line-no">8608</span><span id="line-8608">   */</span>
+<span class="source-line-no">8609</span><span id="line-8609">  private void recordMutationWithoutWal(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {</span>
+<span class="source-line-no">8610</span><span id="line-8610">    numMutationsWithoutWAL.increment();</span>
+<span class="source-line-no">8611</span><span id="line-8611">    if (numMutationsWithoutWAL.sum() &lt;= 1) {</span>
+<span class="source-line-no">8612</span><span id="line-8612">      LOG.info("writing data to region " + this</span>
+<span class="source-line-no">8613</span><span id="line-8613">        + " with WAL disabled. Data may be lost in the event of a crash.");</span>
+<span class="source-line-no">8614</span><span id="line-8614">    }</span>
+<span class="source-line-no">8615</span><span id="line-8615"></span>
+<span class="source-line-no">8616</span><span id="line-8616">    long mutationSize = 0;</span>
+<span class="source-line-no">8617</span><span id="line-8617">    for (List&lt;Cell&gt; cells : familyMap.values()) {</span>
+<span class="source-line-no">8618</span><span id="line-8618">      // Optimization: 'foreach' loop is not used. See:</span>
+<span class="source-line-no">8619</span><span id="line-8619">      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects</span>
+<span class="source-line-no">8620</span><span id="line-8620">      assert cells instanceof RandomAccess;</span>
+<span class="source-line-no">8621</span><span id="line-8621">      int listSize = cells.size();</span>
+<span class="source-line-no">8622</span><span id="line-8622">      for (int i = 0; i &lt; listSize; i++) {</span>
+<span class="source-line-no">8623</span><span id="line-8623">        Cell cell = cells.get(i);</span>
+<span class="source-line-no">8624</span><span id="line-8624">        mutationSize += cell.getSerializedSize();</span>
+<span class="source-line-no">8625</span><span id="line-8625">      }</span>
+<span class="source-line-no">8626</span><span id="line-8626">    }</span>
+<span class="source-line-no">8627</span><span id="line-8627"></span>
+<span class="source-line-no">8628</span><span id="line-8628">    dataInMemoryWithoutWAL.add(mutationSize);</span>
+<span class="source-line-no">8629</span><span id="line-8629">  }</span>
+<span class="source-line-no">8630</span><span id="line-8630"></span>
+<span class="source-line-no">8631</span><span id="line-8631">  private void lock(final Lock lock) throws IOException {</span>
+<span class="source-line-no">8632</span><span id="line-8632">    lock(lock, 1);</span>
+<span class="source-line-no">8633</span><span id="line-8633">  }</span>
+<span class="source-line-no">8634</span><span id="line-8634"></span>
+<span class="source-line-no">8635</span><span id="line-8635">  /**</span>
+<span class="source-line-no">8636</span><span id="line-8636">   * Try to acquire a lock. Throw RegionTooBusyException if failed to get the lock in time. Throw</span>
+<span class="source-line-no">8637</span><span id="line-8637">   * InterruptedIOException if interrupted while waiting for the lock.</span>
+<span class="source-line-no">8638</span><span id="line-8638">   */</span>
+<span class="source-line-no">8639</span><span id="line-8639">  private void lock(final Lock lock, final int multiplier) throws IOException {</span>
+<span class="source-line-no">8640</span><span id="line-8640">    try {</span>
+<span class="source-line-no">8641</span><span id="line-8641">      final long waitTime = Math.min(maxBusyWaitDuration,</span>
+<span class="source-line-no">8642</span><span id="line-8642">        busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));</span>
+<span class="source-line-no">8643</span><span id="line-8643">      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {</span>
+<span class="source-line-no">8644</span><span id="line-8644">        // Don't print millis. Message is used as a key over in</span>
+<span class="source-line-no">8645</span><span id="line-8645">        // RetriesExhaustedWithDetailsException processing.</span>
+<span class="source-line-no">8646</span><span id="line-8646">        final String regionName =</span>
+<span class="source-line-no">8647</span><span id="line-8647">          this.getRegionInfo() == null ? "unknown" : this.getRegionInfo().getRegionNameAsString();</span>
+<span class="source-line-no">8648</span><span id="line-8648">        final String serverName = this.getRegionServerServices() == null</span>
+<span class="source-line-no">8649</span><span id="line-8649">          ? "unknown"</span>
+<span class="source-line-no">8650</span><span id="line-8650">          : (this.getRegionServerServices().getServerName() == null</span>
+<span class="source-line-no">8651</span><span id="line-8651">            ? "unknown"</span>
+<span class="source-line-no">8652</span><span id="line-8652">            : this.getRegionServerServices().getServerName().toString());</span>
+<span class="source-line-no">8653</span><span id="line-8653">        RegionTooBusyException rtbe = new RegionTooBusyException(</span>
+<span class="source-line-no">8654</span><span id="line-8654">          "Failed to obtain lock; regionName=" + regionName + ", server=" + serverName);</span>
+<span class="source-line-no">8655</span><span id="line-8655">        LOG.warn("Region is too busy to allow lock acquisition.", rtbe);</span>
+<span class="source-line-no">8656</span><span id="line-8656">        throw rtbe;</span>
+<span class="source-line-no">8657</span><span id="line-8657">      }</span>
+<span class="source-line-no">8658</span><span id="line-8658">    } catch (InterruptedException ie) {</span>
+<span class="source-line-no">8659</span><span id="line-8659">      if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">8660</span><span id="line-8660">        LOG.debug("Interrupted while waiting for a lock in region {}", this);</span>
+<span class="source-line-no">8661</span><span id="line-8661">      }</span>
+<span class="source-line-no">8662</span><span id="line-8662">      throw throwOnInterrupt(ie);</span>
+<span class="source-line-no">8663</span><span id="line-8663">    }</span>
+<span class="source-line-no">8664</span><span id="line-8664">  }</span>
+<span class="source-line-no">8665</span><span id="line-8665"></span>
+<span class="source-line-no">8666</span><span id="line-8666">  /**</span>
+<span class="source-line-no">8667</span><span id="line-8667">   * Calls sync with the given transaction ID</span>
+<span class="source-line-no">8668</span><span id="line-8668">   * @param txid should sync up to which transaction</span>
+<span class="source-line-no">8669</span><span id="line-8669">   * @throws IOException If anything goes wrong with DFS</span>
+<span class="source-line-no">8670</span><span id="line-8670">   */</span>
+<span class="source-line-no">8671</span><span id="line-8671">  private void sync(long txid, Durability durability) throws IOException {</span>
+<span class="source-line-no">8672</span><span id="line-8672">    if (this.getRegionInfo().isMetaRegion()) {</span>
+<span class="source-line-no">8673</span><span id="line-8673">      this.wal.sync(txid);</span>
+<span class="source-line-no">8674</span><span id="line-8674">    } else {</span>
+<span class="source-line-no">8675</span><span id="line-8675">      switch (durability) {</span>
+<span class="source-line-no">8676</span><span id="line-8676">        case USE_DEFAULT:</span>
+<span class="source-line-no">8677</span><span id="line-8677">          // do what table defaults to</span>
+<span class="source-line-no">8678</span><span id="line-8678">          if (shouldSyncWAL()) {</span>
+<span class="source-line-no">8679</span><span id="line-8679">            this.wal.sync(txid);</span>
+<span class="source-line-no">8680</span><span id="line-8680">          }</span>
+<span class="source-line-no">8681</span><span id="line-8681">          break;</span>
+<span class="source-line-no">8682</span><span id="line-8682">        case SKIP_WAL:</span>
+<span class="source-line-no">8683</span><span id="line-8683">          // nothing do to</span>
+<span class="source-line-no">8684</span><span id="line-8684">          break;</span>
+<span class="source-line-no">8685</span><span id="line-8685">        case ASYNC_WAL:</span>
+<span class="source-line-no">8686</span><span id="line-8686">          // nothing do to</span>
+<span class="source-line-no">8687</span><span id="line-8687">          break;</span>
+<span class="source-line-no">8688</span><span id="line-8688">        case SYNC_WAL:</span>
+<span class="source-line-no">8689</span><span id="line-8689">          this.wal.sync(txid, false);</span>
+<span class="source-line-no">8690</span><span id="line-8690">          break;</span>
+<span class="source-line-no">8691</span><span id="line-8691">        case FSYNC_WAL:</span>
+<span class="source-line-no">8692</span><span id="line-8692">          this.wal.sync(txid, true);</span>
+<span class="source-line-no">8693</span><span id="line-8693">          break;</span>
+<span class="source-line-no">8694</span><span id="line-8694">        default:</span>
+<span class="source-line-no">8695</span><span id="line-8695">          throw new RuntimeException("Unknown durability " + durability);</span>
+<span class="source-line-no">8696</span><span id="line-8696">      }</span>
+<span class="source-line-no">8697</span><span id="line-8697">    }</span>
+<span class="source-line-no">8698</span><span id="line-8698">  }</span>
+<span class="source-line-no">8699</span><span id="line-8699"></span>
+<span class="source-line-no">8700</span><span id="line-8700">  /**</span>
+<span class="source-line-no">8701</span><span id="line-8701">   * Check whether we should sync the wal from the table's durability settings</span>
+<span class="source-line-no">8702</span><span id="line-8702">   */</span>
+<span class="source-line-no">8703</span><span id="line-8703">  private boolean shouldSyncWAL() {</span>
+<span class="source-line-no">8704</span><span id="line-8704">    return regionDurability.ordinal() &gt; Durability.ASYNC_WAL.ordinal();</span>
+<span class="source-line-no">8705</span><span id="line-8705">  }</span>
+<span class="source-line-no">8706</span><span id="line-8706"></span>
+<span class="source-line-no">8707</span><span id="line-8707">  /** Returns the latest sequence number that was read from storage when this region was opened */</span>
+<span class="source-line-no">8708</span><span id="line-8708">  public long getOpenSeqNum() {</span>
+<span class="source-line-no">8709</span><span id="line-8709">    return this.openSeqNum;</span>
+<span class="source-line-no">8710</span><span id="line-8710">  }</span>
+<span class="source-line-no">8711</span><span id="line-8711"></span>
+<span class="source-line-no">8712</span><span id="line-8712">  @Override</span>
+<span class="source-line-no">8713</span><span id="line-8713">  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {</span>
+<span class="source-line-no">8714</span><span id="line-8714">    return this.maxSeqIdInStores;</span>
+<span class="source-line-no">8715</span><span id="line-8715">  }</span>
+<span class="source-line-no">8716</span><span id="line-8716"></span>
+<span class="source-line-no">8717</span><span id="line-8717">  public long getOldestSeqIdOfStore(byte[] familyName) {</span>
+<span class="source-line-no">8718</span><span id="line-8718">    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);</span>
+<span class="source-line-no">8719</span><span id="line-8719">  }</span>
+<span class="source-line-no">8720</span><span id="line-8720"></span>
+<span class="source-line-no">8721</span><span id="line-8721">  @Override</span>
+<span class="source-line-no">8722</span><span id="line-8722">  public CompactionState getCompactionState() {</span>
+<span class="source-line-no">8723</span><span id="line-8723">    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;</span>
+<span class="source-line-no">8724</span><span id="line-8724">    return (hasMajor</span>
+<span class="source-line-no">8725</span><span id="line-8725">      ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)</span>
+<span class="source-line-no">8726</span><span id="line-8726">      : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));</span>
+<span class="source-line-no">8727</span><span id="line-8727">  }</span>
+<span class="source-line-no">8728</span><span id="line-8728"></span>
+<span class="source-line-no">8729</span><span id="line-8729">  public void reportCompactionRequestStart(boolean isMajor) {</span>
+<span class="source-line-no">8730</span><span id="line-8730">    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();</span>
+<span class="source-line-no">8731</span><span id="line-8731">  }</span>
+<span class="source-line-no">8732</span><span id="line-8732"></span>
+<span class="source-line-no">8733</span><span id="line-8733">  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {</span>
+<span class="source-line-no">8734</span><span id="line-8734">    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();</span>
+<span class="source-line-no">8735</span><span id="line-8735"></span>
+<span class="source-line-no">8736</span><span id="line-8736">    // metrics</span>
+<span class="source-line-no">8737</span><span id="line-8737">    compactionsFinished.increment();</span>
+<span class="source-line-no">8738</span><span id="line-8738">    compactionNumFilesCompacted.add(numFiles);</span>
+<span class="source-line-no">8739</span><span id="line-8739">    compactionNumBytesCompacted.add(filesSizeCompacted);</span>
+<span class="source-line-no">8740</span><span id="line-8740"></span>
+<span class="source-line-no">8741</span><span id="line-8741">    assert newValue &gt;= 0;</span>
+<span class="source-line-no">8742</span><span id="line-8742">  }</span>
+<span class="source-line-no">8743</span><span id="line-8743"></span>
+<span class="source-line-no">8744</span><span id="line-8744">  public void reportCompactionRequestFailure() {</span>
+<span class="source-line-no">8745</span><span id="line-8745">    compactionsFailed.increment();</span>
+<span class="source-line-no">8746</span><span id="line-8746">  }</span>
+<span class="source-line-no">8747</span><span id="line-8747"></span>
+<span class="source-line-no">8748</span><span id="line-8748">  public void incrementCompactionsQueuedCount() {</span>
+<span class="source-line-no">8749</span><span id="line-8749">    compactionsQueued.increment();</span>
+<span class="source-line-no">8750</span><span id="line-8750">  }</span>
+<span class="source-line-no">8751</span><span id="line-8751"></span>
+<span class="source-line-no">8752</span><span id="line-8752">  public void decrementCompactionsQueuedCount() {</span>
+<span class="source-line-no">8753</span><span id="line-8753">    compactionsQueued.decrement();</span>
+<span class="source-line-no">8754</span><span id="line-8754">  }</span>
+<span class="source-line-no">8755</span><span id="line-8755"></span>
+<span class="source-line-no">8756</span><span id="line-8756">  public void incrementFlushesQueuedCount() {</span>
+<span class="source-line-no">8757</span><span id="line-8757">    flushesQueued.increment();</span>
+<span class="source-line-no">8758</span><span id="line-8758">  }</span>
+<span class="source-line-no">8759</span><span id="line-8759"></span>
+<span class="source-line-no">8760</span><span id="line-8760">  protected void decrementFlushesQueuedCount() {</span>
+<span class="source-line-no">8761</span><span id="line-8761">    flushesQueued.decrement();</span>
+<span class="source-line-no">8762</span><span id="line-8762">  }</span>
+<span class="source-line-no">8763</span><span id="line-8763"></span>
+<span class="source-line-no">8764</span><span id="line-8764">  /**</span>
+<span class="source-line-no">8765</span><span id="line-8765">   * If a handler thread is eligible for interrupt, make it ineligible. Should be paired with</span>
+<span class="source-line-no">8766</span><span id="line-8766">   * {{@link #enableInterrupts()}.</span>
+<span class="source-line-no">8767</span><span id="line-8767">   */</span>
+<span class="source-line-no">8768</span><span id="line-8768">  void disableInterrupts() {</span>
+<span class="source-line-no">8769</span><span id="line-8769">    regionLockHolders.computeIfPresent(Thread.currentThread(), (t, b) -&gt; false);</span>
+<span class="source-line-no">8770</span><span id="line-8770">  }</span>
+<span class="source-line-no">8771</span><span id="line-8771"></span>
+<span class="source-line-no">8772</span><span id="line-8772">  /**</span>
+<span class="source-line-no">8773</span><span id="line-8773">   * If a handler thread was made ineligible for interrupt via {{@link #disableInterrupts()}, make</span>
+<span class="source-line-no">8774</span><span id="line-8774">   * it eligible again. No-op if interrupts are already enabled.</span>
+<span class="source-line-no">8775</span><span id="line-8775">   */</span>
+<span class="source-line-no">8776</span><span id="line-8776">  void enableInterrupts() {</span>
+<span class="source-line-no">8777</span><span id="line-8777">    regionLockHolders.computeIfPresent(Thread.currentThread(), (t, b) -&gt; true);</span>
+<span class="source-line-no">8778</span><span id="line-8778">  }</span>
+<span class="source-line-no">8779</span><span id="line-8779"></span>
+<span class="source-line-no">8780</span><span id="line-8780">  /**</span>
+<span class="source-line-no">8781</span><span id="line-8781">   * Interrupt any region options that have acquired the region lock via</span>
+<span class="source-line-no">8782</span><span id="line-8782">   * {@link #startRegionOperation(org.apache.hadoop.hbase.regionserver.Region.Operation)}, or</span>
+<span class="source-line-no">8783</span><span id="line-8783">   * {@link #startBulkRegionOperation(boolean)}.</span>
+<span class="source-line-no">8784</span><span id="line-8784">   */</span>
+<span class="source-line-no">8785</span><span id="line-8785">  private void interruptRegionOperations() {</span>
+<span class="source-line-no">8786</span><span id="line-8786">    for (Map.Entry&lt;Thread, Boolean&gt; entry : regionLockHolders.entrySet()) {</span>
+<span class="source-line-no">8787</span><span id="line-8787">      // An entry in this map will have a boolean value indicating if it is currently</span>
+<span class="source-line-no">8788</span><span id="line-8788">      // eligible for interrupt; if so, we should interrupt it.</span>
+<span class="source-line-no">8789</span><span id="line-8789">      if (entry.getValue().booleanValue()) {</span>
+<span class="source-line-no">8790</span><span id="line-8790">        entry.getKey().interrupt();</span>
+<span class="source-line-no">8791</span><span id="line-8791">      }</span>
+<span class="source-line-no">8792</span><span id="line-8792">    }</span>
+<span class="source-line-no">8793</span><span id="line-8793">  }</span>
+<span class="source-line-no">8794</span><span id="line-8794"></span>
+<span class="source-line-no">8795</span><span id="line-8795">  /**</span>
+<span class="source-line-no">8796</span><span id="line-8796">   * Check thread interrupt status and throw an exception if interrupted.</span>
+<span class="source-line-no">8797</span><span id="line-8797">   * @throws NotServingRegionException if region is closing</span>
+<span class="source-line-no">8798</span><span id="line-8798">   * @throws InterruptedIOException    if interrupted but region is not closing</span>
+<span class="source-line-no">8799</span><span id="line-8799">   */</span>
+<span class="source-line-no">8800</span><span id="line-8800">  // Package scope for tests</span>
+<span class="source-line-no">8801</span><span id="line-8801">  void checkInterrupt() throws NotServingRegionException, InterruptedIOException {</span>
+<span class="source-line-no">8802</span><span id="line-8802">    if (Thread.interrupted()) {</span>
+<span class="source-line-no">8803</span><span id="line-8803">      if (this.closing.get()) {</span>
+<span class="source-line-no">8804</span><span id="line-8804">        throw new NotServingRegionException(</span>
+<span class="source-line-no">8805</span><span id="line-8805">          getRegionInfo().getRegionNameAsString() + " is closing");</span>
+<span class="source-line-no">8806</span><span id="line-8806">      }</span>
+<span class="source-line-no">8807</span><span id="line-8807">      throw new InterruptedIOException();</span>
+<span class="source-line-no">8808</span><span id="line-8808">    }</span>
 <span class="source-line-no">8809</span><span id="line-8809">  }</span>
 <span class="source-line-no">8810</span><span id="line-8810"></span>
 <span class="source-line-no">8811</span><span id="line-8811">  /**</span>
-<span class="source-line-no">8812</span><span id="line-8812">   * {@inheritDoc}</span>
-<span class="source-line-no">8813</span><span id="line-8813">   */</span>
-<span class="source-line-no">8814</span><span id="line-8814">  @Override</span>
-<span class="source-line-no">8815</span><span id="line-8815">  public void onConfigurationChange(Configuration conf) {</span>
-<span class="source-line-no">8816</span><span id="line-8816">    this.storeHotnessProtector.update(conf);</span>
-<span class="source-line-no">8817</span><span id="line-8817">    // update coprocessorHost if the configuration has changed.</span>
-<span class="source-line-no">8818</span><span id="line-8818">    if (</span>
-<span class="source-line-no">8819</span><span id="line-8819">      CoprocessorConfigurationUtil.checkConfigurationChange(getReadOnlyConfiguration(), conf,</span>
-<span class="source-line-no">8820</span><span id="line-8820">        CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,</span>
-<span class="source-line-no">8821</span><span id="line-8821">        CoprocessorHost.USER_REGION_COPROCESSOR_CONF_KEY)</span>
-<span class="source-line-no">8822</span><span id="line-8822">    ) {</span>
-<span class="source-line-no">8823</span><span id="line-8823">      LOG.info("Update the system coprocessors because the configuration has changed");</span>
-<span class="source-line-no">8824</span><span id="line-8824">      decorateRegionConfiguration(conf);</span>
-<span class="source-line-no">8825</span><span id="line-8825">      this.coprocessorHost = new RegionCoprocessorHost(this, rsServices, conf);</span>
-<span class="source-line-no">8826</span><span id="line-8826">    }</span>
-<span class="source-line-no">8827</span><span id="line-8827">  }</span>
-<span class="source-line-no">8828</span><span id="line-8828"></span>
-<span class="source-line-no">8829</span><span id="line-8829">  /**</span>
-<span class="source-line-no">8830</span><span id="line-8830">   * {@inheritDoc}</span>
-<span class="source-line-no">8831</span><span id="line-8831">   */</span>
-<span class="source-line-no">8832</span><span id="line-8832">  @Override</span>
-<span class="source-line-no">8833</span><span id="line-8833">  public void registerChildren(ConfigurationManager manager) {</span>
-<span class="source-line-no">8834</span><span id="line-8834">    configurationManager = manager;</span>
-<span class="source-line-no">8835</span><span id="line-8835">    stores.values().forEach(manager::registerObserver);</span>
-<span class="source-line-no">8836</span><span id="line-8836">  }</span>
-<span class="source-line-no">8837</span><span id="line-8837"></span>
-<span class="source-line-no">8838</span><span id="line-8838">  /**</span>
-<span class="source-line-no">8839</span><span id="line-8839">   * {@inheritDoc}</span>
-<span class="source-line-no">8840</span><span id="line-8840">   */</span>
-<span class="source-line-no">8841</span><span id="line-8841">  @Override</span>
-<span class="source-line-no">8842</span><span id="line-8842">  public void deregisterChildren(ConfigurationManager manager) {</span>
-<span class="source-line-no">8843</span><span id="line-8843">    stores.values().forEach(configurationManager::deregisterObserver);</span>
-<span class="source-line-no">8844</span><span id="line-8844">  }</span>
-<span class="source-line-no">8845</span><span id="line-8845"></span>
-<span class="source-line-no">8846</span><span id="line-8846">  @Override</span>
-<span class="source-line-no">8847</span><span id="line-8847">  public CellComparator getCellComparator() {</span>
-<span class="source-line-no">8848</span><span id="line-8848">    return cellComparator;</span>
+<span class="source-line-no">8812</span><span id="line-8812">   * Throw the correct exception upon interrupt</span>
+<span class="source-line-no">8813</span><span id="line-8813">   * @param t cause</span>
+<span class="source-line-no">8814</span><span id="line-8814">   */</span>
+<span class="source-line-no">8815</span><span id="line-8815">  // Package scope for tests</span>
+<span class="source-line-no">8816</span><span id="line-8816">  IOException throwOnInterrupt(Throwable t) {</span>
+<span class="source-line-no">8817</span><span id="line-8817">    if (this.closing.get()) {</span>
+<span class="source-line-no">8818</span><span id="line-8818">      return (NotServingRegionException) new NotServingRegionException(</span>
+<span class="source-line-no">8819</span><span id="line-8819">        getRegionInfo().getRegionNameAsString() + " is closing").initCause(t);</span>
+<span class="source-line-no">8820</span><span id="line-8820">    }</span>
+<span class="source-line-no">8821</span><span id="line-8821">    return (InterruptedIOException) new InterruptedIOException().initCause(t);</span>
+<span class="source-line-no">8822</span><span id="line-8822">  }</span>
+<span class="source-line-no">8823</span><span id="line-8823"></span>
+<span class="source-line-no">8824</span><span id="line-8824">  /**</span>
+<span class="source-line-no">8825</span><span id="line-8825">   * {@inheritDoc}</span>
+<span class="source-line-no">8826</span><span id="line-8826">   */</span>
+<span class="source-line-no">8827</span><span id="line-8827">  @Override</span>
+<span class="source-line-no">8828</span><span id="line-8828">  public void onConfigurationChange(Configuration conf) {</span>
+<span class="source-line-no">8829</span><span id="line-8829">    this.storeHotnessProtector.update(conf);</span>
+<span class="source-line-no">8830</span><span id="line-8830">    // update coprocessorHost if the configuration has changed.</span>
+<span class="source-line-no">8831</span><span id="line-8831">    if (</span>
+<span class="source-line-no">8832</span><span id="line-8832">      CoprocessorConfigurationUtil.checkConfigurationChange(getReadOnlyConfiguration(), conf,</span>
+<span class="source-line-no">8833</span><span id="line-8833">        CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,</span>
+<span class="source-line-no">8834</span><span id="line-8834">        CoprocessorHost.USER_REGION_COPROCESSOR_CONF_KEY)</span>
+<span class="source-line-no">8835</span><span id="line-8835">    ) {</span>
+<span class="source-line-no">8836</span><span id="line-8836">      LOG.info("Update the system coprocessors because the configuration has changed");</span>
+<span class="source-line-no">8837</span><span id="line-8837">      decorateRegionConfiguration(conf);</span>
+<span class="source-line-no">8838</span><span id="line-8838">      this.coprocessorHost = new RegionCoprocessorHost(this, rsServices, conf);</span>
+<span class="source-line-no">8839</span><span id="line-8839">    }</span>
+<span class="source-line-no">8840</span><span id="line-8840">  }</span>
+<span class="source-line-no">8841</span><span id="line-8841"></span>
+<span class="source-line-no">8842</span><span id="line-8842">  /**</span>
+<span class="source-line-no">8843</span><span id="line-8843">   * {@inheritDoc}</span>
+<span class="source-line-no">8844</span><span id="line-8844">   */</span>
+<span class="source-line-no">8845</span><span id="line-8845">  @Override</span>
+<span class="source-line-no">8846</span><span id="line-8846">  public void registerChildren(ConfigurationManager manager) {</span>
+<span class="source-line-no">8847</span><span id="line-8847">    configurationManager = manager;</span>
+<span class="source-line-no">8848</span><span id="line-8848">    stores.values().forEach(manager::registerObserver);</span>
 <span class="source-line-no">8849</span><span id="line-8849">  }</span>
 <span class="source-line-no">8850</span><span id="line-8850"></span>
-<span class="source-line-no">8851</span><span id="line-8851">  public long getMemStoreFlushSize() {</span>
-<span class="source-line-no">8852</span><span id="line-8852">    return this.memstoreFlushSize;</span>
-<span class="source-line-no">8853</span><span id="line-8853">  }</span>
-<span class="source-line-no">8854</span><span id="line-8854"></span>
-<span class="source-line-no">8855</span><span id="line-8855">  //// method for debugging tests</span>
-<span class="source-line-no">8856</span><span id="line-8856">  void throwException(String title, String regionName) {</span>
-<span class="source-line-no">8857</span><span id="line-8857">    StringBuilder buf = new StringBuilder();</span>
-<span class="source-line-no">8858</span><span id="line-8858">    buf.append(title + ", ");</span>
-<span class="source-line-no">8859</span><span id="line-8859">    buf.append(getRegionInfo().toString());</span>
-<span class="source-line-no">8860</span><span id="line-8860">    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");</span>
-<span class="source-line-no">8861</span><span id="line-8861">    buf.append("stores: ");</span>
-<span class="source-line-no">8862</span><span id="line-8862">    for (HStore s : stores.values()) {</span>
-<span class="source-line-no">8863</span><span id="line-8863">      buf.append(s.getColumnFamilyDescriptor().getNameAsString());</span>
-<span class="source-line-no">8864</span><span id="line-8864">      buf.append(" size: ");</span>
-<span class="source-line-no">8865</span><span id="line-8865">      buf.append(s.getMemStoreSize().getDataSize());</span>
-<span class="source-line-no">8866</span><span id="line-8866">      buf.append(" ");</span>
-<span class="source-line-no">8867</span><span id="line-8867">    }</span>
-<span class="source-line-no">8868</span><span id="line-8868">    buf.append("end-of-stores");</span>
-<span class="source-line-no">8869</span><span id="line-8869">    buf.append(", memstore size ");</span>
-<span class="source-line-no">8870</span><span id="line-8870">    buf.append(getMemStoreDataSize());</span>
-<span class="source-line-no">8871</span><span id="line-8871">    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {</span>
-<span class="source-line-no">8872</span><span id="line-8872">      throw new RuntimeException(buf.toString());</span>
-<span class="source-line-no">8873</span><span id="line-8873">    }</span>
-<span class="source-line-no">8874</span><span id="line-8874">  }</span>
-<span class="source-line-no">8875</span><span id="line-8875"></span>
-<span class="source-line-no">8876</span><span id="line-8876">  @Override</span>
-<span class="source-line-no">8877</span><span id="line-8877">  public void requestCompaction(String why, int priority, boolean major,</span>
-<span class="source-line-no">8878</span><span id="line-8878">    CompactionLifeCycleTracker tracker) throws IOException {</span>
-<span class="source-line-no">8879</span><span id="line-8879">    if (major) {</span>
-<span class="source-line-no">8880</span><span id="line-8880">      stores.values().forEach(HStore::triggerMajorCompaction);</span>
-<span class="source-line-no">8881</span><span id="line-8881">    }</span>
-<span class="source-line-no">8882</span><span id="line-8882">    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,</span>
-<span class="source-line-no">8883</span><span id="line-8883">      RpcServer.getRequestUser().orElse(null));</span>
-<span class="source-line-no">8884</span><span id="line-8884">  }</span>
-<span class="source-line-no">8885</span><span id="line-8885"></span>
-<span class="source-line-no">8886</span><span id="line-8886">  @Override</span>
-<span class="source-line-no">8887</span><span id="line-8887">  public void requestCompaction(byte[] family, String why, int priority, boolean major,</span>
-<span class="source-line-no">8888</span><span id="line-8888">    CompactionLifeCycleTracker tracker) throws IOException {</span>
-<span class="source-line-no">8889</span><span id="line-8889">    HStore store = stores.get(family);</span>
-<span class="source-line-no">8890</span><span id="line-8890">    if (store == null) {</span>
-<span class="source-line-no">8891</span><span id="line-8891">      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family)</span>
-<span class="source-line-no">8892</span><span id="line-8892">        + " does not exist in region " + getRegionInfo().getRegionNameAsString());</span>
-<span class="source-line-no">8893</span><span id="line-8893">    }</span>
-<span class="source-line-no">8894</span><span id="line-8894">    if (major) {</span>
-<span class="source-line-no">8895</span><span id="line-8895">      store.triggerMajorCompaction();</span>
-<span class="source-line-no">8896</span><span id="line-8896">    }</span>
-<span class="source-line-no">8897</span><span id="line-8897">    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,</span>
-<span class="source-line-no">8898</span><span id="line-8898">      RpcServer.getRequestUser().orElse(null));</span>
-<span class="source-line-no">8899</span><span id="line-8899">  }</span>
-<span class="source-line-no">8900</span><span id="line-8900"></span>
-<span class="source-line-no">8901</span><span id="line-8901">  private void requestFlushIfNeeded() throws RegionTooBusyException {</span>
-<span class="source-line-no">8902</span><span id="line-8902">    if (isFlushSize(this.memStoreSizing.getMemStoreSize())) {</span>
-<span class="source-line-no">8903</span><span id="line-8903">      requestFlush();</span>
-<span class="source-line-no">8904</span><span id="line-8904">    }</span>
-<span class="source-line-no">8905</span><span id="line-8905">  }</span>
-<span class="source-line-no">8906</span><span id="line-8906"></span>
-<span class="source-line-no">8907</span><span id="line-8907">  private void requestFlush() {</span>
-<span class="source-line-no">8908</span><span id="line-8908">    if (this.rsServices == null) {</span>
-<span class="source-line-no">8909</span><span id="line-8909">      return;</span>
-<span class="source-line-no">8910</span><span id="line-8910">    }</span>
-<span class="source-line-no">8911</span><span id="line-8911">    requestFlush0(FlushLifeCycleTracker.DUMMY);</span>
+<span class="source-line-no">8851</span><span id="line-8851">  /**</span>
+<span class="source-line-no">8852</span><span id="line-8852">   * {@inheritDoc}</span>
+<span class="source-line-no">8853</span><span id="line-8853">   */</span>
+<span class="source-line-no">8854</span><span id="line-8854">  @Override</span>
+<span class="source-line-no">8855</span><span id="line-8855">  public void deregisterChildren(ConfigurationManager manager) {</span>
+<span class="source-line-no">8856</span><span id="line-8856">    stores.values().forEach(configurationManager::deregisterObserver);</span>
+<span class="source-line-no">8857</span><span id="line-8857">  }</span>
+<span class="source-line-no">8858</span><span id="line-8858"></span>
+<span class="source-line-no">8859</span><span id="line-8859">  @Override</span>
+<span class="source-line-no">8860</span><span id="line-8860">  public CellComparator getCellComparator() {</span>
+<span class="source-line-no">8861</span><span id="line-8861">    return cellComparator;</span>
+<span class="source-line-no">8862</span><span id="line-8862">  }</span>
+<span class="source-line-no">8863</span><span id="line-8863"></span>
+<span class="source-line-no">8864</span><span id="line-8864">  public long getMemStoreFlushSize() {</span>
+<span class="source-line-no">8865</span><span id="line-8865">    return this.memstoreFlushSize;</span>
+<span class="source-line-no">8866</span><span id="line-8866">  }</span>
+<span class="source-line-no">8867</span><span id="line-8867"></span>
+<span class="source-line-no">8868</span><span id="line-8868">  //// method for debugging tests</span>
+<span class="source-line-no">8869</span><span id="line-8869">  void throwException(String title, String regionName) {</span>
+<span class="source-line-no">8870</span><span id="line-8870">    StringBuilder buf = new StringBuilder();</span>
+<span class="source-line-no">8871</span><span id="line-8871">    buf.append(title + ", ");</span>
+<span class="source-line-no">8872</span><span id="line-8872">    buf.append(getRegionInfo().toString());</span>
+<span class="source-line-no">8873</span><span id="line-8873">    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");</span>
+<span class="source-line-no">8874</span><span id="line-8874">    buf.append("stores: ");</span>
+<span class="source-line-no">8875</span><span id="line-8875">    for (HStore s : stores.values()) {</span>
+<span class="source-line-no">8876</span><span id="line-8876">      buf.append(s.getColumnFamilyDescriptor().getNameAsString());</span>
+<span class="source-line-no">8877</span><span id="line-8877">      buf.append(" size: ");</span>
+<span class="source-line-no">8878</span><span id="line-8878">      buf.append(s.getMemStoreSize().getDataSize());</span>
+<span class="source-line-no">8879</span><span id="line-8879">      buf.append(" ");</span>
+<span class="source-line-no">8880</span><span id="line-8880">    }</span>
+<span class="source-line-no">8881</span><span id="line-8881">    buf.append("end-of-stores");</span>
+<span class="source-line-no">8882</span><span id="line-8882">    buf.append(", memstore size ");</span>
+<span class="source-line-no">8883</span><span id="line-8883">    buf.append(getMemStoreDataSize());</span>
+<span class="source-line-no">8884</span><span id="line-8884">    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {</span>
+<span class="source-line-no">8885</span><span id="line-8885">      throw new RuntimeException(buf.toString());</span>
+<span class="source-line-no">8886</span><span id="line-8886">    }</span>
+<span class="source-line-no">8887</span><span id="line-8887">  }</span>
+<span class="source-line-no">8888</span><span id="line-8888"></span>
+<span class="source-line-no">8889</span><span id="line-8889">  @Override</span>
+<span class="source-line-no">8890</span><span id="line-8890">  public void requestCompaction(String why, int priority, boolean major,</span>
+<span class="source-line-no">8891</span><span id="line-8891">    CompactionLifeCycleTracker tracker) throws IOException {</span>
+<span class="source-line-no">8892</span><span id="line-8892">    if (major) {</span>
+<span class="source-line-no">8893</span><span id="line-8893">      stores.values().forEach(HStore::triggerMajorCompaction);</span>
+<span class="source-line-no">8894</span><span id="line-8894">    }</span>
+<span class="source-line-no">8895</span><span id="line-8895">    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,</span>
+<span class="source-line-no">8896</span><span id="line-8896">      RpcServer.getRequestUser().orElse(null));</span>
+<span class="source-line-no">8897</span><span id="line-8897">  }</span>
+<span class="source-line-no">8898</span><span id="line-8898"></span>
+<span class="source-line-no">8899</span><span id="line-8899">  @Override</span>
+<span class="source-line-no">8900</span><span id="line-8900">  public void requestCompaction(byte[] family, String why, int priority, boolean major,</span>
+<span class="source-line-no">8901</span><span id="line-8901">    CompactionLifeCycleTracker tracker) throws IOException {</span>
+<span class="source-line-no">8902</span><span id="line-8902">    HStore store = stores.get(family);</span>
+<span class="source-line-no">8903</span><span id="line-8903">    if (store == null) {</span>
+<span class="source-line-no">8904</span><span id="line-8904">      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family)</span>
+<span class="source-line-no">8905</span><span id="line-8905">        + " does not exist in region " + getRegionInfo().getRegionNameAsString());</span>
+<span class="source-line-no">8906</span><span id="line-8906">    }</span>
+<span class="source-line-no">8907</span><span id="line-8907">    if (major) {</span>
+<span class="source-line-no">8908</span><span id="line-8908">      store.triggerMajorCompaction();</span>
+<span class="source-line-no">8909</span><span id="line-8909">    }</span>
+<span class="source-line-no">8910</span><span id="line-8910">    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,</span>
+<span class="source-line-no">8911</span><span id="line-8911">      RpcServer.getRequestUser().orElse(null));</span>
 <span class="source-line-no">8912</span><span id="line-8912">  }</span>
 <span class="source-line-no">8913</span><span id="line-8913"></span>
-<span class="source-line-no">8914</span><span id="line-8914">  private void requestFlush0(FlushLifeCycleTracker tracker) {</span>
-<span class="source-line-no">8915</span><span id="line-8915">    boolean shouldFlush = false;</span>
-<span class="source-line-no">8916</span><span id="line-8916">    synchronized (writestate) {</span>
-<span class="source-line-no">8917</span><span id="line-8917">      if (!this.writestate.isFlushRequested()) {</span>
-<span class="source-line-no">8918</span><span id="line-8918">        shouldFlush = true;</span>
-<span class="source-line-no">8919</span><span id="line-8919">        writestate.flushRequested = true;</span>
-<span class="source-line-no">8920</span><span id="line-8920">      }</span>
-<span class="source-line-no">8921</span><span id="line-8921">    }</span>
-<span class="source-line-no">8922</span><span id="line-8922">    if (shouldFlush) {</span>
-<span class="source-line-no">8923</span><span id="line-8923">      // Make request outside of synchronize block; HBASE-818.</span>
-<span class="source-line-no">8924</span><span id="line-8924">      this.rsServices.getFlushRequester().requestFlush(this, tracker);</span>
-<span class="source-line-no">8925</span><span id="line-8925">      if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">8926</span><span id="line-8926">        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());</span>
-<span class="source-line-no">8927</span><span id="line-8927">      }</span>
-<span class="source-line-no">8928</span><span id="line-8928">    } else {</span>
... 210805 lines suppressed ...