From 836d36006f07ab1a357bc3504d812f77e292e44c Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 5 Mar 2019 17:28:39 +0800 Subject: [PATCH] HBASE-21977 Skip replay WAL and update seqid when open regions restored from snapshot --- .../hbase/client/ClientSideRegionScanner.java | 1 + .../apache/hadoop/hbase/regionserver/HRegion.java | 30 ++++++++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java index 23a2399..a23cede 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java @@ -60,6 +60,7 @@ public class ClientSideRegionScanner extends AbstractClientScanner { // open region from the snapshot directory region = HRegion.newHRegion(FSUtils.getTableDir(rootDir, htd.getTableName()), null, fs, conf, hri, htd, null); + region.setRestoredRegion(true); // we won't initialize the MobFileCache when not running in RS process. so provided an // initialized cache. Consider the case: an CF was set from an mob to non-mob. if we only // initialize cache for MOB region, NPE from HMobStore will still happen. So Initialize the diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index a553750..629f54e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -340,6 +340,13 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi private Path regionDir; private FileSystem walFS; + // mark if the region is restored from snapshot + private boolean isRestoredRegion = false; + + public void setRestoredRegion(boolean restoredRegion) { + isRestoredRegion = restoredRegion; + } + // The internal wait duration to acquire a lock before read/update // from the region. It is not per row. The purpose of this wait time // is to avoid waiting a long time while the region is busy, so that @@ -953,7 +960,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi status.setStatus("Initializing all the Stores"); long maxSeqId = initializeStores(reporter, status); this.mvcc.advanceTo(maxSeqId); - if (ServerRegionReplicaUtil.shouldReplayRecoveredEdits(this)) { + if (!isRestoredRegion && ServerRegionReplicaUtil.shouldReplayRecoveredEdits(this)) { Collection stores = this.stores.values(); try { // update the stores that we are replaying @@ -1006,15 +1013,18 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi // Use maximum of log sequenceid or that which was found in stores // (particularly if no recovered edits, seqid will be -1). - long maxSeqIdFromFile = - WALSplitter.getMaxRegionSequenceId(getWalFileSystem(), getWALRegionDirOfDefaultReplica()); - long nextSeqId = Math.max(maxSeqId, maxSeqIdFromFile) + 1; - // The openSeqNum will always be increase even for read only region, as we rely on it to - // determine whether a region has been successfully reopend, so here we always need to update - // the max sequence id file. - if (RegionReplicaUtil.isDefaultReplica(getRegionInfo())) { - LOG.debug("writing seq id for {}", this.getRegionInfo().getEncodedName()); - WALSplitter.writeRegionSequenceIdFile(getWalFileSystem(), getWALRegionDir(), nextSeqId - 1); + long nextSeqId = maxSeqId + 1; + if (!isRestoredRegion) { + long maxSeqIdFromFile = + WALSplitter.getMaxRegionSequenceId(getWalFileSystem(), getWALRegionDirOfDefaultReplica()); + nextSeqId = Math.max(maxSeqId, maxSeqIdFromFile) + 1; + // The openSeqNum will always be increase even for read only region, as we rely on it to + // determine whether a region has been successfully reopend, so here we always need to update + // the max sequence id file. + if (RegionReplicaUtil.isDefaultReplica(getRegionInfo())) { + LOG.debug("writing seq id for {}", this.getRegionInfo().getEncodedName()); + WALSplitter.writeRegionSequenceIdFile(getWalFileSystem(), getWALRegionDir(), nextSeqId - 1); + } } LOG.info("Opened {}; next sequenceid={}", this.getRegionInfo().getShortNameToLog(), nextSeqId); -- 2.7.4