HBASE-20163 Forbid major compaction when standby cluster replay the remote wals
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/97b961cd Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/97b961cd Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/97b961cd Branch: refs/heads/HBASE-19064 Commit: 97b961cd603d4f710b5dcb3b4112dfa18e855c7f Parents: cd978d8 Author: Guanghao Zhang <zg...@apache.org> Authored: Thu Apr 12 14:44:25 2018 +0800 Committer: zhangduo <zhang...@apache.org> Committed: Wed May 9 17:38:13 2018 +0800 ---------------------------------------------------------------------- .../hadoop/hbase/regionserver/HRegion.java | 18 ++++++++ .../hbase/regionserver/HRegionServer.java | 2 +- .../regionserver/RegionServerServices.java | 5 +++ .../ForbidMajorCompactionChecker.java | 44 ++++++++++++++++++++ .../hadoop/hbase/MockRegionServerServices.java | 6 +++ .../hadoop/hbase/master/MockRegionServer.java | 6 +++ 6 files changed, 80 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java ---------------------------------------------------------------------- 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 ea72cfe..1865144 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 @@ -144,6 +144,7 @@ import org.apache.hadoop.hbase.regionserver.ScannerContext.LimitScope; import org.apache.hadoop.hbase.regionserver.ScannerContext.NextState; import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext; import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker; +import org.apache.hadoop.hbase.regionserver.compactions.ForbidMajorCompactionChecker; import org.apache.hadoop.hbase.regionserver.throttle.CompactionThroughputControllerFactory; import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController; import org.apache.hadoop.hbase.regionserver.throttle.StoreHotnessProtector; @@ -1977,6 +1978,14 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi return compact(compaction, store, throughputController, null); } + private boolean shouldForbidMajorCompaction() { + if (rsServices != null && rsServices.getReplicationSourceService() != null) { + return rsServices.getReplicationSourceService().getSyncReplicationPeerInfoProvider() + .checkState(getRegionInfo(), ForbidMajorCompactionChecker.get()); + } + return false; + } + public boolean compact(CompactionContext compaction, HStore store, ThroughputController throughputController, User user) throws IOException { assert compaction != null && compaction.hasSelection(); @@ -1986,6 +1995,15 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi store.cancelRequestedCompaction(compaction); return false; } + + if (compaction.getRequest().isAllFiles() && shouldForbidMajorCompaction()) { + LOG.warn("Skipping major compaction on " + this + + " because this cluster is transiting sync replication state" + + " from STANDBY to DOWNGRADE_ACTIVE"); + store.cancelRequestedCompaction(compaction); + return false; + } + MonitoredTask status = null; boolean requestNeedsCancellation = true; /* http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index af2f3b5..440a838 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -2472,7 +2472,7 @@ public class HRegionServer extends HasThread implements * @return Return the object that implements the replication * source executorService. */ - @VisibleForTesting + @Override public ReplicationSourceService getReplicationSourceService() { return replicationSourceHandler; } http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java index 00f4077..7c4362c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java @@ -262,4 +262,9 @@ public interface RegionServerServices extends Server, MutableOnlineRegions, Favo * @return True if cluster is up; false if cluster is not up (we are shutting down). */ boolean isClusterUp(); + + /** + * @return Return the object that implements the replication source executorService. + */ + ReplicationSourceService getReplicationSourceService(); } http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/ForbidMajorCompactionChecker.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/ForbidMajorCompactionChecker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/ForbidMajorCompactionChecker.java new file mode 100644 index 0000000..eecc780 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/ForbidMajorCompactionChecker.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.regionserver.compactions; + +import java.util.function.BiPredicate; + +import org.apache.hadoop.hbase.replication.SyncReplicationState; +import org.apache.yetus.audience.InterfaceAudience; + +/** + * Check whether forbid major compaction for region. + */ +@InterfaceAudience.Private +public class ForbidMajorCompactionChecker + implements BiPredicate<SyncReplicationState, SyncReplicationState> { + + private static final ForbidMajorCompactionChecker INST = new ForbidMajorCompactionChecker(); + + @Override + public boolean test(SyncReplicationState state, SyncReplicationState newState) { + // Forbid major compaction when cluster transit sync replication state from S to DA + return state == SyncReplicationState.STANDBY + || newState == SyncReplicationState.DOWNGRADE_ACTIVE; + } + + public static ForbidMajorCompactionChecker get() { + return INST; + } +} http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java index b6202fd..a550bf5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java @@ -48,6 +48,7 @@ import org.apache.hadoop.hbase.regionserver.MetricsRegionServer; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.RegionServerAccounting; import org.apache.hadoop.hbase.regionserver.RegionServerServices; +import org.apache.hadoop.hbase.regionserver.ReplicationSourceService; import org.apache.hadoop.hbase.regionserver.SecureBulkLoadManager; import org.apache.hadoop.hbase.regionserver.ServerNonceManager; import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester; @@ -353,4 +354,9 @@ public class MockRegionServerServices implements RegionServerServices { public boolean isClusterUp() { return true; } + + @Override + public ReplicationSourceService getReplicationSourceService() { + return null; + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/97b961cd/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java index 35ad7eb..1c4e72a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java @@ -61,6 +61,7 @@ import org.apache.hadoop.hbase.regionserver.MetricsRegionServer; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.RegionServerAccounting; import org.apache.hadoop.hbase.regionserver.RegionServerServices; +import org.apache.hadoop.hbase.regionserver.ReplicationSourceService; import org.apache.hadoop.hbase.regionserver.SecureBulkLoadManager; import org.apache.hadoop.hbase.regionserver.ServerNonceManager; import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester; @@ -696,4 +697,9 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices { public boolean isClusterUp() { return true; } + + @Override + public ReplicationSourceService getReplicationSourceService() { + return null; + } }