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> </dd>
+<dt>postWALRestore(ObserverContext<? extends RegionCoprocessorEnvironment>, 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> </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<? extends RegionCoprocessorEnvironment>, 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.hbase.wal.WALKey logKey,
org.apache.hadoop.hbase.wal.WALEdit 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.RegionInfo 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.TableDescriptor desc,
- org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preCreateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.TableDescriptor desc,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.TableDescriptor desc,
+ org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegions<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMergeRegionsAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo[] 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><org.apache.hadoop.hbase.client.Mutation> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo region,
org.apache.hadoop.hbase.ServerName srcServer,
org.apache.hadoop.hbase.ServerName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.fs.Path 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> namespace,
org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.client.RegionInfo[] 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
+ org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegionAction<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUnassign<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.RegionInfo 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
@@ -2271,9 +2287,21 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
org.apache.hadoop.fs.Path edits)</code></div>
<div class="col-last even-row-color"> </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 info,
- org.apache.hadoop.fs.Path 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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit logEdit)</code></div>
<div class="col-last odd-row-color"> </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 info,
+ org.apache.hadoop.fs.Path edits)</code></div>
+<div class="col-last even-row-color"> </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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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 info,
byte[] 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
org.apache.hadoop.fs.Path oldPath,
org.apache.hadoop.fs.Path 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.hbase.wal.WALKey logKey,
org.apache.hadoop.hbase.wal.WALEdit 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
long 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> peerId,
org.apache.hadoop.hbase.replication.ReplicationPeerConfig 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append append,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.RpcCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RpcCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.ConnectionHeader 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.BalanceRequest 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> groupName,
org.apache.hadoop.hbase.client.BalanceRequest 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress<org.apache.hadoop.hbase.client.Mutation> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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><org.apache.hadoop.hbase.util.Pair<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>>> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -1239,24 +1247,24 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -1264,38 +1272,38 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
<a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a> checkAndMutate,
org.apache.hadoop.hbase.client.CheckAndMutateResult 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
<a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a> checkAndMutate,
org.apache.hadoop.hbase.client.CheckAndMutateResult 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -1303,24 +1311,24 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -1328,780 +1336,780 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Put put,
boolean 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preClearRegionBlockCache<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.SnapshotDescription snapshot,
org.apache.hadoop.hbase.client.TableDescriptor 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
byte[] 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><org.apache.hadoop.hbase.util.Pair<org.apache.hadoop.fs.Path,<wbr>org.apache.hadoop.fs.Path>> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner scanner,
org.apache.hadoop.hbase.regionserver.ScanType scanType,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker tracker,
org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanType scanType,
org.apache.hadoop.hbase.regionserver.ScanOptions options,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker tracker,
org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store 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><? extends org.apache.hadoop.hbase.regionserver.StoreFile> candidates,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.NamespaceDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.TableDescriptor desc,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.TableDescriptor desc,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.TableDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.ServerName> servers,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.SnapshotDescription 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.SnapshotDescription 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preDeleteTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preDisableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preEnableTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hbase.thirdparty.com.google.protobuf.Service 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> methodName,
org.apache.hbase.thirdparty.com.google.protobuf.Message 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Get get,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner scanner,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions options,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
- org.apache.hadoop.hbase.client.Get 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><org.apache.hadoop.hbase.Cell> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+ org.apache.hadoop.hbase.client.Get 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><org.apache.hadoop.hbase.Cell> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.net.Address 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.net.Address 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preGetRSGroupInfoOfTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.TableName> 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><org.apache.hadoop.hbase.client.TableDescriptor> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.client.TableDescriptor> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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> namespace,
org.apache.hadoop.hbase.TableName tableName,
byte[] family,
byte[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.security.access.UserPermission userPermission,
boolean 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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><org.apache.hadoop.hbase.security.access.Permission> permissions)</code></div>
-<div class="col-last odd-row-color"> </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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+<div class="col-last even-row-color"> </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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment increment,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.NamespaceDescriptor> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><<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>> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.NamespaceDescriptor> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><<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>> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.SnapshotDescription 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.SnapshotDescription 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
- org.apache.hadoop.hbase.regionserver.Store 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+ org.apache.hadoop.hbase.regionserver.Store 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo[] 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><org.apache.hadoop.hbase.client.Mutation> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName tableName,
byte[] 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.NamespaceDescriptor currentNsDescriptor,
org.apache.hadoop.hbase.NamespaceDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.client.TableDescriptor currentDescriptor,
org.apache.hadoop.hbase.client.TableDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.client.TableDescriptor currentDescriptor,
org.apache.hadoop.hbase.client.TableDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo region,
org.apache.hadoop.hbase.ServerName srcServer,
org.apache.hadoop.hbase.ServerName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.net.Address> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServers<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.net.Address> 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><org.apache.hadoop.hbase.TableName> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preMoveServersAndTables<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.net.Address> 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><org.apache.hadoop.hbase.TableName> 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> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.TableName> 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> 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+<div class="col-second odd-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Mutation mutation,
org.apache.hadoop.hbase.Cell cell,
byte[] byteNow,
org.apache.hadoop.hbase.client.Get 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.ServerName 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><byte[]> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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><org.apache.hadoop.hbase.net.Address> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.fs.Path 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WALEntry walEntry,
org.apache.hadoop.hbase.client.Mutation 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> namespace,
org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.client.RegionInfo[] 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> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.SnapshotDescription snapshot,
org.apache.hadoop.hbase.client.TableDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.security.access.UserPermission 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.InternalScanner 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.InternalScanner 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><org.apache.hadoop.hbase.client.Result> result,
int limit,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Scan 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> namespace,
org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> regionServer,
org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
boolean newValue,
org.apache.hadoop.hbase.client.MasterSwitchType 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName tableName,
- org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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> namespace,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSetTableQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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> namespace,
org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> userName,
- org.apache.hadoop.hbase.TableName tableName,
org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> userName,
+ org.apache.hadoop.hbase.TableName tableName,
+ org.apache.hadoop.hbase.quotas.GlobalQuotaSettings 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.SnapshotDescription snapshot,
org.apache.hadoop.hbase.client.TableDescriptor 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
org.apache.hadoop.hbase.TableName tableName,
byte[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
org.apache.hadoop.hbase.TableName tableName,
byte[] 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
byte[] 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><org.apache.hadoop.hbase.client.Mutation> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.fs.FileSystem fs,
org.apache.hadoop.fs.Path p,
org.apache.hadoop.hbase.io.FSDataInputStreamWrapper in,
@@ -2109,106 +2117,114 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.io.hfile.CacheConfig cacheConf,
org.apache.hadoop.hbase.io.Reference r,
org.apache.hadoop.hbase.regionserver.StoreFileReader 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- boolean 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preSwitchExceedThrottleQuota<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
boolean 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ boolean 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> peerId,
- org.apache.hadoop.hbase.replication.SyncReplicationState 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
- org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> peerId,
+ org.apache.hadoop.hbase.replication.SyncReplicationState 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateRegion<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> c,
+ org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">MasterObserver.</span><code>preTruncateTable<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.TableName 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
- org.apache.hadoop.conf.Configuration 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo 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<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">MasterObserver.</span><code>preUpdateMasterConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
org.apache.hadoop.conf.Configuration 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionServerObserver.</span><code>preUpdateRegionServerConfiguration<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment> ctx,
+ org.apache.hadoop.conf.Configuration 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> peerId,
org.apache.hadoop.hbase.replication.ReplicationPeerConfig 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment> 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> 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><<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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.wal.WALKey key,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
org.apache.hadoop.fs.Path 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
- org.apache.hadoop.hbase.client.Append 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+ org.apache.hadoop.hbase.client.Append 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append append,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress<org.apache.hadoop.hbase.client.Mutation> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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><org.apache.hadoop.hbase.util.Pair<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>>> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -464,24 +472,24 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -489,38 +497,38 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Delete delete,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
<a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a> checkAndMutate,
org.apache.hadoop.hbase.client.CheckAndMutateResult 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
<a href="../../client/CheckAndMutate.html" title="class in org.apache.hadoop.hbase.client">CheckAndMutate</a> checkAndMutate,
org.apache.hadoop.hbase.client.CheckAndMutateResult 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -528,24 +536,24 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
byte[] family,
byte[] qualifier,
@@ -553,242 +561,242 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.filter.ByteArrayComparable comparator,
org.apache.hadoop.hbase.client.Put put,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
byte[] row,
org.apache.hadoop.hbase.filter.Filter filter,
org.apache.hadoop.hbase.client.Put put,
boolean 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
byte[] 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><org.apache.hadoop.hbase.util.Pair<org.apache.hadoop.fs.Path,<wbr>org.apache.hadoop.fs.Path>> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner scanner,
org.apache.hadoop.hbase.regionserver.ScanType scanType,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker tracker,
org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanType scanType,
org.apache.hadoop.hbase.regionserver.ScanOptions options,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker tracker,
org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store 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><? extends org.apache.hadoop.hbase.regionserver.StoreFile> candidates,
org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hbase.thirdparty.com.google.protobuf.Service 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> methodName,
org.apache.hbase.thirdparty.com.google.protobuf.Message 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Get get,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner scanner,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions options,
org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Get 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><org.apache.hadoop.hbase.Cell> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment increment,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.InternalScanner 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
+<div class="col-second even-row-color"><span class="type-name-label">BulkLoadObserver.</span><code>prePrepareBulkLoad<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Mutation mutation,
org.apache.hadoop.hbase.Cell cell,
byte[] byteNow,
org.apache.hadoop.hbase.client.Get 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.fs.Path 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.InternalScanner 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.regionserver.InternalScanner 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><org.apache.hadoop.hbase.client.Result> result,
int limit,
boolean 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Scan 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.fs.FileSystem fs,
org.apache.hadoop.fs.Path p,
org.apache.hadoop.hbase.io.FSDataInputStreamWrapper in,
@@ -796,25 +804,33 @@ loadScripts(document, 'script');</script>
org.apache.hadoop.hbase.io.hfile.CacheConfig cacheConf,
org.apache.hadoop.hbase.io.Reference r,
org.apache.hadoop.hbase.regionserver.StoreFileReader 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.regionserver.Store store,
org.apache.hadoop.hbase.regionserver.ScanOptions 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.wal.WALKey key,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.hbase.wal.WALKey logKey,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Append append,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Delete delete,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Increment increment,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> c,
org.apache.hadoop.hbase.client.Put put,
org.apache.hadoop.hbase.wal.WALEdit edit,
org.apache.hadoop.hbase.client.Durability 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.wal.WALKey key,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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 put,
org.apache.hadoop.hbase.wal.WALEdit edit)</code></div>
<div class="col-last odd-row-color"> </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 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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit logEdit)</code></div>
+<div class="col-last even-row-color"> </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 append,
+ org.apache.hadoop.hbase.wal.WALEdit 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 delete,
org.apache.hadoop.hbase.wal.WALEdit 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 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 increment,
org.apache.hadoop.hbase.wal.WALEdit 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 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 put,
org.apache.hadoop.hbase.wal.WALEdit 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 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 key,
org.apache.hadoop.hbase.wal.WALEdit edit)</code></div>
-<div class="col-last odd-row-color">
+<div class="col-last odd-row-color"> </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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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 key,
- org.apache.hadoop.hbase.wal.WALEdit edit)</code></div>
-<div class="col-last even-row-color"> </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 index,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+<div class="col-second even-row-color"><span class="type-name-label">RegionObserver.</span><code>postWALRestore<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo info,
org.apache.hadoop.hbase.wal.WALKey logKey,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+<div class="col-second odd-row-color"><span class="type-name-label">WALObserver.</span><code>postWALWrite<wbr>(org.apache.hadoop.hbase.coprocessor.ObserverContext<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.wal.WALKey key,
org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment> ctx,
+ org.apache.hadoop.hbase.client.RegionInfo info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment> ctx,
org.apache.hadoop.hbase.client.RegionInfo 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 key,
- org.apache.hadoop.hbase.wal.WALEdit 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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit logEdit)</code></div>
<div class="col-last even-row-color"> </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 key,
+ org.apache.hadoop.hbase.wal.WALEdit edit)</code></div>
+<div class="col-last odd-row-color"> </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 info,
+ org.apache.hadoop.hbase.wal.WALKey logKey,
+ org.apache.hadoop.hbase.wal.WALEdit 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1423</span><span id="line-1423"> List<Pair<byte[], String>> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1434</span><span id="line-1434"> byte[] family, List<Pair<Path, Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1457</span><span id="line-1457"> List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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 <a href="https://issues.apache.org/jira/browse/HBASE-21643">HBASE-21643</a></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<? extends RegionCoprocessorEnvironment> 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<Pair<Cell, Cell>> postIncrementBeforeWAL(</span>
-<span class="source-line-no">1542</span><span id="line-1542"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
-<span class="source-line-no">1543</span><span id="line-1543"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
-<span class="source-line-no">1544</span><span id="line-1544"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
-<span class="source-line-no">1545</span><span id="line-1545"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
-<span class="source-line-no">1546</span><span id="line-1546"> resultPairs.add(new Pair<>(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<Pair<Cell, Cell>> postAppendBeforeWAL(</span>
-<span class="source-line-no">1562</span><span id="line-1562"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
-<span class="source-line-no">1563</span><span id="line-1563"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
-<span class="source-line-no">1564</span><span id="line-1564"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
-<span class="source-line-no">1565</span><span id="line-1565"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
-<span class="source-line-no">1566</span><span id="line-1566"> resultPairs.add(new Pair<>(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"> * <p></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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1439</span><span id="line-1439"> List<Pair<byte[], String>> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1450</span><span id="line-1450"> byte[] family, List<Pair<Path, Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1473</span><span id="line-1473"> List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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 <a href="https://issues.apache.org/jira/browse/HBASE-21643">HBASE-21643</a></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<? extends RegionCoprocessorEnvironment> 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<Pair<Cell, Cell>> postIncrementBeforeWAL(</span>
+<span class="source-line-no">1558</span><span id="line-1558"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
+<span class="source-line-no">1559</span><span id="line-1559"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
+<span class="source-line-no">1560</span><span id="line-1560"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
+<span class="source-line-no">1561</span><span id="line-1561"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
+<span class="source-line-no">1562</span><span id="line-1562"> resultPairs.add(new Pair<>(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<Pair<Cell, Cell>> postAppendBeforeWAL(</span>
+<span class="source-line-no">1578</span><span id="line-1578"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
+<span class="source-line-no">1579</span><span id="line-1579"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
+<span class="source-line-no">1580</span><span id="line-1580"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
+<span class="source-line-no">1581</span><span id="line-1581"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
+<span class="source-line-no">1582</span><span id="line-1582"> resultPairs.add(new Pair<>(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"> * <p></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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1423</span><span id="line-1423"> List<Pair<byte[], String>> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1434</span><span id="line-1434"> byte[] family, List<Pair<Path, Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
-<span class="source-line-no">1457</span><span id="line-1457"> List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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 <a href="https://issues.apache.org/jira/browse/HBASE-21643">HBASE-21643</a></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<? extends RegionCoprocessorEnvironment> 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<Pair<Cell, Cell>> postIncrementBeforeWAL(</span>
-<span class="source-line-no">1542</span><span id="line-1542"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
-<span class="source-line-no">1543</span><span id="line-1543"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
-<span class="source-line-no">1544</span><span id="line-1544"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
-<span class="source-line-no">1545</span><span id="line-1545"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
-<span class="source-line-no">1546</span><span id="line-1546"> resultPairs.add(new Pair<>(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<Pair<Cell, Cell>> postAppendBeforeWAL(</span>
-<span class="source-line-no">1562</span><span id="line-1562"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
-<span class="source-line-no">1563</span><span id="line-1563"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
-<span class="source-line-no">1564</span><span id="line-1564"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
-<span class="source-line-no">1565</span><span id="line-1565"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
-<span class="source-line-no">1566</span><span id="line-1566"> resultPairs.add(new Pair<>(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"> * <p></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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1439</span><span id="line-1439"> List<Pair<byte[], String>> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1450</span><span id="line-1450"> byte[] family, List<Pair<Path, Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> ctx,</span>
+<span class="source-line-no">1473</span><span id="line-1473"> List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> 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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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 <a href="https://issues.apache.org/jira/browse/HBASE-21643">HBASE-21643</a></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<? extends RegionCoprocessorEnvironment> 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<Pair<Cell, Cell>> postIncrementBeforeWAL(</span>
+<span class="source-line-no">1558</span><span id="line-1558"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
+<span class="source-line-no">1559</span><span id="line-1559"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
+<span class="source-line-no">1560</span><span id="line-1560"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
+<span class="source-line-no">1561</span><span id="line-1561"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
+<span class="source-line-no">1562</span><span id="line-1562"> resultPairs.add(new Pair<>(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<Pair<Cell, Cell>> postAppendBeforeWAL(</span>
+<span class="source-line-no">1578</span><span id="line-1578"> ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,</span>
+<span class="source-line-no">1579</span><span id="line-1579"> List<Pair<Cell, Cell>> cellPairs) throws IOException {</span>
+<span class="source-line-no">1580</span><span id="line-1580"> List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());</span>
+<span class="source-line-no">1581</span><span id="line-1581"> for (Pair<Cell, Cell> pair : cellPairs) {</span>
+<span class="source-line-no">1582</span><span id="line-1582"> resultPairs.add(new Pair<>(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"> * <p></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<? extends RegionCoprocessorEnvironment> 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<? extends RegionCoprocessorEnvironment> 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() > 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 && !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"> <= maxSeqIdInStores.get(store.getColumnFamilyDescriptor().getName())</span>
+<span class="source-line-no">5807</span><span id="line-5807"> checkRowWithinBoundary && !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"> <= 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 & 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 && !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 < 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 < 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 & 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 && !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 < 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 < 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<HStore> getStoresToFlush(FlushDescriptor flushDesc) {</span>
-<span class="source-line-no">5981</span><span id="line-5981"> List<HStore> storesToFlush = new ArrayList<>();</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<HStore> 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<HStore> getStoresToFlush(FlushDescriptor flushDesc) {</span>
+<span class="source-line-no">5994</span><span id="line-5994"> List<HStore> storesToFlush = new ArrayList<>();</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() < 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() > 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() < 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 < 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 < 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() < 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() < 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<HStore> 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() < 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() > 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() < 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 < 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 < 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() < 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() < 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<String> 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<HStore> 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 && 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 && 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 >= 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<String> 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<HStore> 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 && 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 && 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 >= 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 > 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 > 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 <= 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 <= 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<String> 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 <= 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 > 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<String> 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 <= 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 > 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() >= 0</span>
-<span class="source-line-no">6561</span><span id="line-6561"> && this.lastReplayedOpenRegionSeqId >= 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<StoreFileInfo> 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() >= 0</span>
+<span class="source-line-no">6574</span><span id="line-6574"> && this.lastReplayedOpenRegionSeqId >= 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() > 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"> * <p/></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"> * <ol></span>
-<span class="source-line-no">6609</span><span id="line-6609"> * <li>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</li></span>
-<span class="source-line-no">6611</span><span id="line-6611"> * <li>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.</li></span>
-<span class="source-line-no">6613</span><span id="line-6613"> * <li>We do not need to write WAL.</li></span>
-<span class="source-line-no">6614</span><span id="line-6614"> * <li>We will advance MVCC in the caller directly.</li></span>
-<span class="source-line-no">6615</span><span id="line-6615"> * </ol></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<byte[], List<ExtendedCell>> 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<byte[], List<ExtendedCell>> 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"> * <p/></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<HStore> 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<StoreFileInfo> 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() > 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"> * <p/></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"> * <ol></span>
+<span class="source-line-no">6622</span><span id="line-6622"> * <li>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</li></span>
+<span class="source-line-no">6624</span><span id="line-6624"> * <li>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.</li></span>
+<span class="source-line-no">6626</span><span id="line-6626"> * <li>We do not need to write WAL.</li></span>
+<span class="source-line-no">6627</span><span id="line-6627"> * <li>We will advance MVCC in the caller directly.</li></span>
+<span class="source-line-no">6628</span><span id="line-6628"> * </ol></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<byte[], List<ExtendedCell>> 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<byte[], List<ExtendedCell>> 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"> * <p/></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<HStore> 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"> * <p/></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<RpcCall> 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 < 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 <= 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 > 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 >= 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 < 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<byte[], List<ExtendedCell>> family2Cells = new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">6768</span><span id="line-6768"> for (int i = 0; i < 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 -> new ArrayList<>())</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<byte[], StoreFlushContext> 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() > 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 && 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"> * <p/></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<RpcCall> 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 < 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 <= 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 > 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 >= 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 < 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<byte[], List<ExtendedCell>> family2Cells = new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">6781</span><span id="line-6781"> for (int i = 0; i < 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 -> new ArrayList<>())</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<byte[], StoreFlushContext> 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() > 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<HStore, Long> map = new HashMap<>();</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 && 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 < 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 > 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 <= 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 < 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<HStore, Long> 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 > 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 -> s.getStorefiles() != null)</span>
-<span class="source-line-no">6938</span><span id="line-6938"> .flatMap(s -> s.getStorefiles().stream())</span>
-<span class="source-line-no">6939</span><span id="line-6939"> .forEachOrdered(sf -> 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"> && 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() > 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) < 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<HStore, Long> map = new HashMap<>();</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 < 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 > 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 <= 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 < 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<HStore, Long> 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 > 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 -> s.getStorefiles() != null)</span>
+<span class="source-line-no">6951</span><span id="line-6951"> .flatMap(s -> s.getStorefiles().stream())</span>
+<span class="source-line-no">6952</span><span id="line-6952"> .forEachOrdered(sf -> 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"> && 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() > 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 -> CellUtil.matchingFamily(cell, e.getKey()))</span>
-<span class="source-line-no">7014</span><span id="line-7014"> .map(e -> 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<HStore> getStores() {</span>
-<span class="source-line-no">7019</span><span id="line-7019"> return new ArrayList<>(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<String> getStoreFileList(byte[][] columns) throws IllegalArgumentException {</span>
-<span class="source-line-no">7024</span><span id="line-7024"> List<String> storeFileNames = new ArrayList<>();</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<HStoreFile> 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, () -> 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"> && (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<RpcCall> 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 < 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 <= 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 <= 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 && 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(() -> getRowLockInternal(row, readLock, prevRowLock),</span>
-<span class="source-line-no">7166</span><span id="line-7166"> () -> 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<RowLock> 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) < 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 -> CellUtil.matchingFamily(cell, e.getKey()))</span>
+<span class="source-line-no">7027</span><span id="line-7027"> .map(e -> 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<HStore> getStores() {</span>
+<span class="source-line-no">7032</span><span id="line-7032"> return new ArrayList<>(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<String> getStoreFileList(byte[][] columns) throws IllegalArgumentException {</span>
+<span class="source-line-no">7037</span><span id="line-7037"> List<String> storeFileNames = new ArrayList<>();</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<HStoreFile> 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, () -> 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"> && (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<RpcCall> 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 < 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 <= 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 <= 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 && 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(() -> getRowLockInternal(row, readLock, prevRowLock),</span>
+<span class="source-line-no">7179</span><span id="line-7179"> () -> 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<HashedBytes, RowLockContext> 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 <= 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() <= 0 && 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<RowLock> 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<HashedBytes, RowLockContext> 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 <= 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() <= 0 && 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<Pair<byte[], String>> 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<byte[], String> 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&lt;byte[] column family, String hfilePath&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<byte[], List<Path>> bulkLoadHFiles(Collection<Pair<byte[], String>> 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&lt;byte[] column family, String hfilePath&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<byte[], List<Path>> bulkLoadHFiles(Collection<Pair<byte[], String>> 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<String> 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<byte[], List<Path>> storeFiles = new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">7353</span><span id="line-7353"> Map<String, Long> storeFilesSizes = new HashMap<>();</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<Pair<byte[], String>> failures = new ArrayList<>();</span>
-<span class="source-line-no">7366</span><span id="line-7366"> for (Pair<byte[], String> 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<byte[], String> 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<byte[], List<Pair<Path, Path>>> familyWithFinalPath =</span>
-<span class="source-line-no">7428</span><span id="line-7428"> new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">7429</span><span id="line-7429"> for (Pair<byte[], String> 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<>());</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<Pair<Path, Path>> 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<Path, Path> 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<>(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<byte[], List<Pair<Path, Path>>> 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<byte[], List<Pair<Path, Path>>> 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<Path, Path> 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<Path> storeFileNames = new ArrayList<>();</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 -> {</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 && 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 && !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 && 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<? extends HRegion> regionClass =</span>
-<span class="source-line-no">7604</span><span id="line-7604"> (Class<? extends HRegion>) 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<? extends HRegion> 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<Pair<byte[], String>> 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<byte[], String> 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&lt;byte[] column family, String hfilePath&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<byte[], List<Path>> bulkLoadHFiles(Collection<Pair<byte[], String>> 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&lt;byte[] column family, String hfilePath&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<byte[], List<Path>> bulkLoadHFiles(Collection<Pair<byte[], String>> 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<String> 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<byte[], List<Path>> storeFiles = new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">7366</span><span id="line-7366"> Map<String, Long> storeFilesSizes = new HashMap<>();</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<Pair<byte[], String>> failures = new ArrayList<>();</span>
+<span class="source-line-no">7379</span><span id="line-7379"> for (Pair<byte[], String> 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<byte[], String> 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<byte[], List<Pair<Path, Path>>> familyWithFinalPath =</span>
+<span class="source-line-no">7441</span><span id="line-7441"> new TreeMap<>(Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">7442</span><span id="line-7442"> for (Pair<byte[], String> 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<>());</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<Pair<Path, Path>> 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<Path, Path> 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<>(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<byte[], List<Pair<Path, Path>>> 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<byte[], List<Pair<Path, Path>>> 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<Path, Path> 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<Path> storeFileNames = new ArrayList<>();</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 -> {</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 && 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 && !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 && 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<? extends HRegion> regionClass =</span>
+<span class="source-line-no">7617</span><span id="line-7617"> (Class<? extends HRegion>) 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<? extends HRegion> 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<byte[], Integer> 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"> * <p/></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 <code>this</code></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 && getRegionServerServices() != null</span>
-<span class="source-line-no">7877</span><span id="line-7877"> && 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() <= 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) <= 0))</span>
-<span class="source-line-no">7962</span><span id="line-7962"> && ((info.getEndKey().length == 0) || (Bytes.compareTo(info.getEndKey(), row) > 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"> <= 0))</span>
-<span class="source-line-no">7970</span><span id="line-7970"> && ((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"> > 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<Cell> 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<Cell> 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<Cell> 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(() -> getInternal(get, withCoprocessor, nonceGroup, nonce),</span>
-<span class="source-line-no">8005</span><span id="line-8005"> () -> 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<Cell> 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<Cell> results = new ArrayList<>();</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 && (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<Cell> tmp = new ArrayList<>();</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 && (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 && 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<byte[], Integer> 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"> * <p/></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 <code>this</code></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 && getRegionServerServices() != null</span>
+<span class="source-line-no">7890</span><span id="line-7890"> && 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() <= 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) <= 0))</span>
+<span class="source-line-no">7975</span><span id="line-7975"> && ((info.getEndKey().length == 0) || (Bytes.compareTo(info.getEndKey(), row) > 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"> <= 0))</span>
+<span class="source-line-no">7983</span><span id="line-7983"> && ((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"> > 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<Cell> 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<Cell> 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<Cell> 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(() -> getInternal(get, withCoprocessor, nonceGroup, nonce),</span>
+<span class="source-line-no">8018</span><span id="line-8018"> () -> 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<Cell> 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<Cell> results = new ArrayList<>();</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 && (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<Cell> tmp = new ArrayList<>();</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 && (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<Mutation> 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<Result> results = new ArrayList<>();</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<Cell> cells = new ArrayList<>();</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. <code>mutations</code> 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"> * <code>rowsToLock</code> 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<Mutation> mutations, Collection<byte[]> 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<Mutation></span>
-<span class="source-line-no">8102</span><span id="line-8102"> lockRowsAndBuildMiniBatch(List<RowLock> 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 <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 && 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<Mutation> 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<Result> results = new ArrayList<>();</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<Cell> cells = new ArrayList<>();</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. <code>mutations</code> 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"> * <code>rowsToLock</code> 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<Mutation> mutations, Collection<byte[]> 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<Mutation></span>
+<span class="source-line-no">8115</span><span id="line-8115"> lockRowsAndBuildMiniBatch(List<RowLock> 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 > 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(() -> {</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"> }, () -> 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(() -> {</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"> }, () -> 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<?> 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<?> batchOp,</span>
-<span class="source-line-no">8201</span><span id="line-8201"> MiniBatchOperationInProgress<Mutation> 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 && !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 && !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 <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 > 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(() -> {</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"> }, () -> 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(() -> {</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"> }, () -> 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<?> 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<?> batchOp,</span>
+<span class="source-line-no">8214</span><span id="line-8214"> MiniBatchOperationInProgress<Mutation> 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 && !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 && !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<?> batchOp,</span>
-<span class="source-line-no">8256</span><span id="line-8256"> MiniBatchOperationInProgress<Mutation> 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<?> rpcCall = RpcServer.getCurrentServerCallWithCellScanner().orElse(null);</span>
-<span class="source-line-no">8291</span><span id="line-8291"> regionReplicationSink.ifPresent(sink -> writeEntry.attachCompletionAction(() -> {</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"> * <p/></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<?> batchOp,</span>
+<span class="source-line-no">8269</span><span id="line-8269"> MiniBatchOperationInProgress<Mutation> 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<?> rpcCall = RpcServer.getCurrentServerCallWithCellScanner().orElse(null);</span>
+<span class="source-line-no">8304</span><span id="line-8304"> regionReplicationSink.ifPresent(sink -> writeEntry.attachCompletionAction(() -> {</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"> * <p/></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<Message>() {</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<byte[]> 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<byte[]> 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<Message>() {</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 && !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 && ret.length > 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<byte[]> 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<byte[]> 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 && !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 && ret.length > 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() && 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() && 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<byte[], List<Cell>> 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() <= 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<Cell> 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 < 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() > 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<byte[], Long> 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() > 0, hasMinor = minorInProgress.get() > 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 >= 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) -> 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) -> 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<Thread, Boolean> 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<byte[], List<Cell>> 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() <= 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<Cell> 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 < 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() > 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<byte[], Long> 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() > 0, hasMinor = minorInProgress.get() > 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 >= 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) -> 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) -> 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<Thread, Boolean> 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 ...