From f2ecabd22311c3a761e37b48bf71099d545d5c81 Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Fri, 9 Mar 2018 19:14:10 +0800 Subject: [PATCH] HBASE-20163 Forbid major compaction when standby cluster replay the remote wals --- .../apache/hadoop/hbase/regionserver/HRegion.java | 15 ++++++++ .../hadoop/hbase/regionserver/HRegionServer.java | 2 +- .../hbase/regionserver/RegionServerServices.java | 6 +++ .../compactions/ForbidMajorCompactionChecker.java | 44 ++++++++++++++++++++++ .../hadoop/hbase/MockRegionServerServices.java | 6 +++ .../hadoop/hbase/master/MockRegionServer.java | 6 +++ 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 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/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 905a5d4..cbaad9d 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,10 +144,12 @@ 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.ThroughputController; import org.apache.hadoop.hbase.regionserver.wal.WALUtil; +import org.apache.hadoop.hbase.replication.regionserver.RejectRequestsFromClientStateChecker; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils; import org.apache.hadoop.hbase.snapshot.SnapshotManifest; @@ -1958,6 +1960,11 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi return compact(compaction, store, throughputController, null); } + private boolean shouldForbidMajorCompaction() { + return rsServices.getReplicationSourceService().getSyncReplicationPeerInfoProvider() + .checkState(getRegionInfo(), ForbidMajorCompactionChecker.get()); + } + public boolean compact(CompactionContext compaction, HStore store, ThroughputController throughputController, User user) throws IOException { assert compaction != null && compaction.hasSelection(); @@ -1967,6 +1974,14 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi store.cancelRequestedCompaction(compaction); return false; } + + if (compaction.getRequest().isMajor() && 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; /* 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 34e362b..a345ccc 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 @@ -2476,7 +2476,7 @@ public class HRegionServer extends HasThread implements * @return Return the object that implements the replication * source executorService. */ - @VisibleForTesting + @Override public ReplicationSourceService getReplicationSourceService() { return replicationSourceHandler; } 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 dde1799..b91dfd1 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 @@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.quotas.RegionSizeStore; import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester; import org.apache.hadoop.hbase.regionserver.throttle.ThroughputController; import org.apache.hadoop.hbase.wal.WAL; +import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; import org.apache.yetus.audience.InterfaceAudience; import org.apache.zookeeper.KeeperException; @@ -257,4 +258,9 @@ public interface RegionServerServices extends Server, MutableOnlineRegions, Favo */ boolean reportFileArchivalForQuotas( TableName tableName, Collection> archivedFiles); + + /** + * @return Return the object that implements the replication source executorService. + */ + ReplicationSourceService getReplicationSourceService(); } 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 { + + 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; + } +} 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 0ef063c..e6c114a 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; @@ -348,4 +349,9 @@ public class MockRegionServerServices implements RegionServerServices { TableName tableName, Collection> archivedFiles) { return true; } + + @Override + public ReplicationSourceService getReplicationSourceService() { + return null; + } } 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 4641afb..42cd82a 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; @@ -692,4 +693,9 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices { TableName tableName, Collection> archivedFiles) { return false; } + + @Override + public ReplicationSourceService getReplicationSourceService() { + return null; + } } -- 1.9.1