You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2019/10/05 14:31:36 UTC
[hbase] 10/10: HBASE-22971 Deprecated RSGroupAdminEndpoint and make
RSGroup feature always enabled (#595)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch HBASE-22514
in repository https://gitbox.apache.org/repos/asf/hbase.git
commit 15c28d0d9858ebdb7294d4c66f060ef3562c159c
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Tue Sep 24 12:09:12 2019 +0800
HBASE-22971 Deprecated RSGroupAdminEndpoint and make RSGroup feature always enabled (#595)
Signed-off-by: Guanghao Zhang <zg...@apache.org>
---
.../hbase/favored/FavoredNodeLoadBalancer.java | 1 +
.../hadoop/hbase/favored/FavoredNodesPromoter.java | 2 +
.../org/apache/hadoop/hbase/master/HMaster.java | 43 +++----
.../apache/hadoop/hbase/master/LoadBalancer.java | 9 ++
.../hadoop/hbase/master/MasterRpcServices.java | 23 ++--
.../apache/hadoop/hbase/master/MasterServices.java | 2 +-
.../hbase/master/assignment/AssignmentManager.java | 15 ++-
.../master/balancer/FavoredStochasticBalancer.java | 1 +
.../hbase/master/balancer/LoadBalancerFactory.java | 18 ++-
.../AbstractStateMachineNamespaceProcedure.java | 11 ++
.../master/procedure/CreateNamespaceProcedure.java | 1 +
.../master/procedure/CreateTableProcedure.java | 27 +++-
.../master/procedure/MasterProcedureUtil.java | 50 +++++++-
.../master/procedure/ModifyNamespaceProcedure.java | 19 ++-
.../master/procedure/ModifyTableProcedure.java | 15 ++-
.../hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java | 141 +--------------------
.../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 65 ++++++----
.../hadoop/hbase/rsgroup/RSGroupableBalancer.java | 32 -----
.../org/apache/hadoop/hbase/TestNamespace.java | 2 +-
.../hadoop/hbase/master/AbstractTestDLS.java | 4 +-
.../hbase/master/MockNoopMasterServices.java | 2 +-
.../hadoop/hbase/master/TestClusterRestart.java | 6 +-
.../hadoop/hbase/master/TestMasterMetrics.java | 4 +-
.../TestMasterRestartAfterDisablingTable.java | 4 +-
.../hadoop/hbase/master/TestRollingRestart.java | 2 +-
.../TestFavoredStochasticBalancerPickers.java | 2 +-
.../hadoop/hbase/regionserver/TestRegionOpen.java | 2 +-
.../TestRegionReplicasWithRestartScenarios.java | 2 +-
.../regionserver/TestRegionServerMetrics.java | 4 +-
.../hbase/rsgroup/TestRSGroupsOfflineMode.java | 3 +-
.../security/access/TestTablePermissions.java | 3 +-
.../hbase/util/TestHBaseFsckReplication.java | 2 +
32 files changed, 241 insertions(+), 276 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
index b8d4b09..52a37a2 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java
@@ -321,6 +321,7 @@ public class FavoredNodeLoadBalancer extends BaseLoadBalancer implements Favored
regionsOnServer.add(region);
}
+ @Override
public synchronized List<ServerName> getFavoredNodes(RegionInfo regionInfo) {
return this.fnm.getFavoredNodes(regionInfo);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java
index 322eb1df..a24fce0 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java
@@ -35,4 +35,6 @@ public interface FavoredNodesPromoter {
void generateFavoredNodesForMergedRegion(RegionInfo merged, RegionInfo [] mergeParents)
throws IOException;
+
+ List<ServerName> getFavoredNodes(RegionInfo regionInfo);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 0a65291..3e82e42 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -91,7 +91,6 @@ import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.executor.ExecutorType;
import org.apache.hadoop.hbase.favored.FavoredNodesManager;
-import org.apache.hadoop.hbase.favored.FavoredNodesPromoter;
import org.apache.hadoop.hbase.http.InfoServer;
import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;
import org.apache.hadoop.hbase.ipc.RpcServer;
@@ -107,7 +106,6 @@ import org.apache.hadoop.hbase.master.assignment.RegionStates;
import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;
import org.apache.hadoop.hbase.master.assignment.UnassignProcedure;
import org.apache.hadoop.hbase.master.balancer.BalancerChore;
-import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer;
import org.apache.hadoop.hbase.master.balancer.ClusterStatusChore;
import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory;
import org.apache.hadoop.hbase.master.cleaner.DirScanPool;
@@ -187,6 +185,7 @@ import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;
import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;
import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;
import org.apache.hadoop.hbase.replication.regionserver.ReplicationStatus;
+import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
import org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager;
import org.apache.hadoop.hbase.security.AccessDeniedException;
import org.apache.hadoop.hbase.security.SecurityConstants;
@@ -384,7 +383,7 @@ public class HMaster extends HRegionServer implements MasterServices {
private final LockManager lockManager = new LockManager(this);
- private LoadBalancer balancer;
+ private RSGroupBasedLoadBalancer balancer;
private RegionNormalizer normalizer;
private BalancerChore balancerChore;
private RegionNormalizerChore normalizerChore;
@@ -439,9 +438,6 @@ public class HMaster extends HRegionServer implements MasterServices {
private long splitPlanCount;
private long mergePlanCount;
- /* Handle favored nodes information */
- private FavoredNodesManager favoredNodesManager;
-
/** jetty server for master to redirect requests to regionserver infoServer */
private Server masterJettyServer;
@@ -766,7 +762,8 @@ public class HMaster extends HRegionServer implements MasterServices {
@VisibleForTesting
protected void initializeZKBasedSystemTrackers()
throws IOException, InterruptedException, KeeperException, ReplicationException {
- this.balancer = LoadBalancerFactory.getLoadBalancer(conf);
+ this.balancer = new RSGroupBasedLoadBalancer();
+ this.balancer.setConf(conf);
this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);
this.normalizer.setMasterServices(this);
this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);
@@ -1050,9 +1047,6 @@ public class HMaster extends HRegionServer implements MasterServices {
return temp;
});
}
- if (this.balancer instanceof FavoredNodesPromoter) {
- favoredNodesManager = new FavoredNodesManager(this);
- }
// initialize load balancer
this.balancer.setMasterServices(this);
@@ -1102,11 +1096,11 @@ public class HMaster extends HRegionServer implements MasterServices {
// table states messing up master launch (namespace table, etc., are not assigned).
this.assignmentManager.processOfflineRegions();
// Initialize after meta is up as below scans meta
- if (favoredNodesManager != null && !maintenanceMode) {
+ if (getFavoredNodesManager() != null && !maintenanceMode) {
SnapshotOfRegionAssignmentFromMeta snapshotOfRegionAssignment =
new SnapshotOfRegionAssignmentFromMeta(getConnection());
snapshotOfRegionAssignment.initialize();
- favoredNodesManager.initialize(snapshotOfRegionAssignment);
+ getFavoredNodesManager().initialize(snapshotOfRegionAssignment);
}
// set cluster status again after user regions are assigned
@@ -2038,14 +2032,13 @@ public class HMaster extends HRegionServer implements MasterServices {
LOG.debug("Unable to determine a plan to assign " + hri);
return;
}
- // TODO: What is this? I don't get it.
- if (dest.equals(serverName) && balancer instanceof BaseLoadBalancer
- && !((BaseLoadBalancer)balancer).shouldBeOnMaster(hri)) {
+ // TODO: deal with table on master for rs group.
+ if (dest.equals(serverName)) {
// To avoid unnecessary region moving later by balancer. Don't put user
// regions on master.
- LOG.debug("Skipping move of region " + hri.getRegionNameAsString()
- + " to avoid unnecessary region moving later by load balancer,"
- + " because it should not be on master");
+ LOG.debug("Skipping move of region " + hri.getRegionNameAsString() +
+ " to avoid unnecessary region moving later by load balancer," +
+ " because it should not be on master");
return;
}
}
@@ -3497,12 +3490,14 @@ public class HMaster extends HRegionServer implements MasterServices {
/**
* Fetch the configured {@link LoadBalancer} class name. If none is set, a default is returned.
- *
+ * <p/>
+ * Notice that, the base load balancer will always be {@link RSGroupBasedLoadBalancer} now, so
+ * this method will return the balancer used inside each rs group.
* @return The name of the {@link LoadBalancer} in use.
*/
public String getLoadBalancerClassName() {
- return conf.get(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, LoadBalancerFactory
- .getDefaultLoadBalancerClass().getName());
+ return conf.get(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
+ LoadBalancerFactory.getDefaultLoadBalancerClass().getName());
}
/**
@@ -3517,13 +3512,13 @@ public class HMaster extends HRegionServer implements MasterServices {
}
@Override
- public LoadBalancer getLoadBalancer() {
+ public RSGroupBasedLoadBalancer getLoadBalancer() {
return balancer;
}
@Override
public FavoredNodesManager getFavoredNodesManager() {
- return favoredNodesManager;
+ return balancer.getFavoredNodesManager();
}
private long executePeerProcedure(AbstractPeerProcedure<?> procedure) throws IOException {
@@ -3809,7 +3804,7 @@ public class HMaster extends HRegionServer implements MasterServices {
}
@Override
- public RSGroupInfoManager getRSRSGroupInfoManager() {
+ public RSGroupInfoManager getRSGroupInfoManager() {
return rsGroupInfoManager;
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
index 0fc544a..d5ca1f7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
@@ -65,6 +65,15 @@ public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObse
ServerName BOGUS_SERVER_NAME = ServerName.valueOf("localhost,1,1");
/**
+ * Config for pluggable load balancers.
+ * @deprecated since 3.0.0, will be removed in 4.0.0. In the new implementation, as the base load
+ * balancer will always be the rs group based one, you should just use
+ * {@link org.apache.hadoop.hbase.HConstants#HBASE_MASTER_LOADBALANCER_CLASS} to
+ * config the per group load balancer.
+ */
+ @Deprecated
+ String HBASE_RSGROUP_LOADBALANCER_CLASS = "hbase.rsgroup.grouploadbalancer.class";
+ /**
* Set the current cluster status. This allows a LoadBalancer to map host name to a server
*/
void setClusterMetrics(ClusterMetrics st);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
index 06a99fa..9c16c28 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
@@ -74,6 +74,7 @@ import org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil.NonceProcedureRunnable;
import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
import org.apache.hadoop.hbase.mob.MobUtils;
+import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.procedure.MasterProcedureManager;
import org.apache.hadoop.hbase.procedure2.LockType;
import org.apache.hadoop.hbase.procedure2.LockedResource;
@@ -219,10 +220,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormaliz
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneResponse;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
- .IsSnapshotCleanupEnabledRequest;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
- .IsSnapshotCleanupEnabledResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotCleanupEnabledRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotCleanupEnabledResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest;
@@ -275,10 +274,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormali
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaResponse;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
- .SetSnapshotCleanupRequest;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
- .SetSnapshotCleanupResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSnapshotCleanupRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSnapshotCleanupResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetTableStateInMetaRequest;
@@ -2380,12 +2377,18 @@ public class MasterRpcServices extends RSRpcServices
LOG.debug("Some dead server is still under processing, won't clear the dead server list");
response.addAllServerName(request.getServerNameList());
} else {
+ DeadServer deadServer = master.getServerManager().getDeadServers();
+ Set<Address> clearedServers = new HashSet<>();
for (HBaseProtos.ServerName pbServer : request.getServerNameList()) {
- if (!master.getServerManager().getDeadServers()
- .removeDeadServer(ProtobufUtil.toServerName(pbServer))) {
+ ServerName server = ProtobufUtil.toServerName(pbServer);
+ if (!deadServer.removeDeadServer(server)) {
response.addServerName(pbServer);
+ } else {
+ clearedServers.add(server.getAddress());
}
}
+ master.getRSGroupInfoManager().removeServers(clearedServers);
+ LOG.info("Remove decommissioned servers {} from RSGroup done", clearedServers);
}
if (master.cpHost != null) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java
index ead40b9..ae55352 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java
@@ -539,5 +539,5 @@ public interface MasterServices extends Server {
/**
* @return the {@link RSGroupInfoManager}
*/
- RSGroupInfoManager getRSRSGroupInfoManager();
+ RSGroupInfoManager getRSGroupInfoManager();
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
index c5324c2..7712f55 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
@@ -68,6 +68,7 @@ import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.procedure2.ProcedureInMemoryChore;
import org.apache.hadoop.hbase.procedure2.util.StringUtils;
import org.apache.hadoop.hbase.regionserver.SequenceId;
+import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.apache.hadoop.hbase.util.HasThread;
@@ -325,6 +326,11 @@ public class AssignmentManager {
return master.getLoadBalancer();
}
+ private FavoredNodesPromoter getFavoredNodePromoter() {
+ return (FavoredNodesPromoter) ((RSGroupBasedLoadBalancer) master.getLoadBalancer())
+ .getInternalBalancer();
+ }
+
private MasterProcedureEnv getProcedureEnvironment() {
return master.getMasterProcedureExecutor().getEnvironment();
}
@@ -368,7 +374,7 @@ public class AssignmentManager {
public List<ServerName> getFavoredNodes(final RegionInfo regionInfo) {
return this.shouldAssignRegionsWithFavoredNodes
- ? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)
+ ? getFavoredNodePromoter().getFavoredNodes(regionInfo)
: ServerName.EMPTY_SERVER_LIST;
}
@@ -1774,8 +1780,8 @@ public class AssignmentManager {
regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);
if (shouldAssignFavoredNodes(parent)) {
List<ServerName> onlineServers = this.master.getServerManager().getOnlineServersList();
- ((FavoredNodesPromoter)getBalancer()).
- generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);
+ getFavoredNodePromoter().generateFavoredNodesForDaughter(onlineServers, parent, daughterA,
+ daughterB);
}
}
@@ -1800,8 +1806,7 @@ public class AssignmentManager {
}
regionStateStore.mergeRegions(child, mergeParents, serverName);
if (shouldAssignFavoredNodes(child)) {
- ((FavoredNodesPromoter)getBalancer()).
- generateFavoredNodesForMergedRegion(child, mergeParents);
+ getFavoredNodePromoter().generateFavoredNodesForMergedRegion(child, mergeParents);
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
index 1daa9e7..442dc44 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
@@ -473,6 +473,7 @@ public class FavoredStochasticBalancer extends StochasticLoadBalancer implements
}
}
+ @Override
public synchronized List<ServerName> getFavoredNodes(RegionInfo regionInfo) {
return this.fnm.getFavoredNodes(regionInfo);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java
index 9ce020b..bfda12e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java
@@ -17,11 +17,11 @@
*/
package org.apache.hadoop.hbase.master.balancer;
-import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.master.LoadBalancer;
-import org.apache.hadoop.util.ReflectionUtils;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
+import org.apache.yetus.audience.InterfaceAudience;
/**
* The class that creates a load balancer from a conf.
@@ -30,8 +30,7 @@ import org.apache.hadoop.util.ReflectionUtils;
public class LoadBalancerFactory {
/**
- * The default {@link LoadBalancer} class.
- *
+ * The default {@link LoadBalancer} class.
* @return The Class for the default {@link LoadBalancer}.
*/
public static Class<? extends LoadBalancer> getDefaultLoadBalancerClass() {
@@ -40,16 +39,15 @@ public class LoadBalancerFactory {
/**
* Create a loadbalancer from the given conf.
- * @param conf
* @return A {@link LoadBalancer}
*/
public static LoadBalancer getLoadBalancer(Configuration conf) {
-
// Create the balancer
Class<? extends LoadBalancer> balancerKlass =
- conf.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, getDefaultLoadBalancerClass(),
- LoadBalancer.class);
- return ReflectionUtils.newInstance(balancerKlass, conf);
-
+ conf.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, getDefaultLoadBalancerClass(),
+ LoadBalancer.class);
+ LoadBalancer balancer = ReflectionUtils.newInstance(balancerKlass);
+ balancer.setConf(conf);
+ return balancer;
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java
index e751034..5c35544 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java
@@ -19,6 +19,7 @@
package org.apache.hadoop.hbase.master.procedure;
import java.io.IOException;
+import java.util.function.Supplier;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.master.MasterFileSystem;
@@ -28,6 +29,7 @@ import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.util.FSUtils;
/**
@@ -122,4 +124,13 @@ public abstract class AbstractStateMachineNamespaceProcedure<TState>
protected void releaseSyncLatch() {
ProcedurePrepareLatch.releaseLatch(syncLatch, this);
}
+
+ protected final void checkNamespaceRSGroup(MasterProcedureEnv env, NamespaceDescriptor nd)
+ throws IOException {
+ Supplier<String> forWhom = () -> "namespace " + nd.getName();
+ RSGroupInfo rsGroupInfo = MasterProcedureUtil.checkGroupExists(
+ env.getMasterServices().getRSGroupInfoManager()::getRSGroup,
+ MasterProcedureUtil.getNamespaceGroup(nd), forWhom);
+ MasterProcedureUtil.checkGroupNotEmpty(rsGroupInfo, forWhom);
+ }
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.java
index 28f7585..bc60360 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.java
@@ -188,6 +188,7 @@ public class CreateNamespaceProcedure
return false;
}
getTableNamespaceManager(env).validateTableAndRegionCount(nsDescriptor);
+ checkNamespaceRSGroup(env, nsDescriptor);
return true;
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
index 34fde27..5cdfede 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
@@ -21,11 +21,12 @@ package org.apache.hadoop.hbase.master.procedure;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-
+import java.util.function.Supplier;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.MetaTableAccessor;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableExistsException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
@@ -35,6 +36,7 @@ import org.apache.hadoop.hbase.client.TableState;
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
import org.apache.hadoop.hbase.master.MasterFileSystem;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.util.FSTableDescriptors;
import org.apache.hadoop.hbase.util.FSUtils;
import org.apache.hadoop.hbase.util.ModifyRegionUtils;
@@ -42,8 +44,10 @@ import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;
import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
+
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;
@@ -254,10 +258,27 @@ public class CreateTableProcedure
// check that we have at least 1 CF
if (tableDescriptor.getColumnFamilyCount() == 0) {
- setFailure("master-create-table", new DoNotRetryIOException("Table " +
- getTableName().toString() + " should have at least one column family."));
+ setFailure("master-create-table", new DoNotRetryIOException(
+ "Table " + getTableName().toString() + " should have at least one column family."));
return false;
}
+ if (!tableName.isSystemTable()) {
+ // do not check rs group for system tables as we may block the bootstrap.
+ Supplier<String> forWhom = () -> "table " + tableName;
+ RSGroupInfo rsGroupInfo = MasterProcedureUtil.checkGroupExists(
+ env.getMasterServices().getRSGroupInfoManager()::getRSGroup,
+ tableDescriptor.getRegionServerGroup(), forWhom);
+ if (rsGroupInfo == null) {
+ // we do not set rs group info on table, check if we have one on namespace
+ String namespace = tableName.getNamespaceAsString();
+ NamespaceDescriptor nd = env.getMasterServices().getClusterSchema().getNamespace(namespace);
+ forWhom = () -> "table " + tableName + "(inherit from namespace)";
+ rsGroupInfo = MasterProcedureUtil.checkGroupExists(
+ env.getMasterServices().getRSGroupInfoManager()::getRSGroup,
+ MasterProcedureUtil.getNamespaceGroup(nd), forWhom);
+ }
+ MasterProcedureUtil.checkGroupNotEmpty(rsGroupInfo, forWhom);
+ }
return true;
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
index 1e488b6..df8fa2b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
@@ -18,14 +18,18 @@
package org.apache.hadoop.hbase.master.procedure;
import java.io.IOException;
+import java.util.Optional;
+import java.util.function.Supplier;
import java.util.regex.Pattern;
-
import org.apache.hadoop.hbase.DoNotRetryIOException;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.constraint.ConstraintException;
import org.apache.hadoop.hbase.master.MasterServices;
import org.apache.hadoop.hbase.procedure2.Procedure;
import org.apache.hadoop.hbase.procedure2.ProcedureException;
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.util.NonceKey;
import org.apache.hadoop.security.UserGroupInformation;
@@ -186,10 +190,52 @@ public final class MasterProcedureUtil {
* keep trying. The default proc.getException().unwrapRemoteException
* doesn't have access to DNRIOE from the procedure2 module.
*/
- public static IOException unwrapRemoteIOException(Procedure proc) {
+ public static IOException unwrapRemoteIOException(Procedure<?> proc) {
Exception e = proc.getException().unwrapRemoteException();
// Do not retry ProcedureExceptions!
return (e instanceof ProcedureException)? new DoNotRetryIOException(e):
proc.getException().unwrapRemoteIOException();
}
+
+ /**
+ * Do not allow creating new tables/namespaces which has an empty rs group, expect the default rs
+ * group. Notice that we do not check for online servers, as this is not stable because region
+ * servers can die at any time.
+ */
+ public static void checkGroupNotEmpty(RSGroupInfo rsGroupInfo, Supplier<String> forWhom)
+ throws ConstraintException {
+ if (rsGroupInfo == null || rsGroupInfo.getName().equals(RSGroupInfo.DEFAULT_GROUP)) {
+ // we do not have a rs group config or we explicitly set the rs group to default, then no need
+ // to check.
+ return;
+ }
+ if (rsGroupInfo.getServers().isEmpty()) {
+ throw new ConstraintException(
+ "No servers in the rsgroup " + rsGroupInfo.getName() + " for " + forWhom.get());
+ }
+ }
+
+ @FunctionalInterface
+ public interface RSGroupGetter {
+ RSGroupInfo get(String groupName) throws IOException;
+ }
+
+ public static RSGroupInfo checkGroupExists(RSGroupGetter getter, Optional<String> optGroupName,
+ Supplier<String> forWhom) throws IOException {
+ if (optGroupName.isPresent()) {
+ String groupName = optGroupName.get();
+ RSGroupInfo group = getter.get(groupName);
+ if (group == null) {
+ throw new ConstraintException(
+ "Region server group " + groupName + " for " + forWhom.get() + " does not exit");
+ }
+ return group;
+ }
+ return null;
+ }
+
+ public static Optional<String> getNamespaceGroup(NamespaceDescriptor namespaceDesc) {
+ return Optional
+ .ofNullable(namespaceDesc.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP));
+ }
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.java
index e3327e2..c52b93d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.java
@@ -18,10 +18,11 @@
package org.apache.hadoop.hbase.master.procedure;
import java.io.IOException;
+import java.util.Objects;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.NamespaceNotFoundException;
-import org.apache.hadoop.hbase.constraint.ConstraintException;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -171,24 +172,22 @@ public class ModifyNamespaceProcedure
/**
* Action before any real action of adding namespace.
- * @param env MasterProcedureEnv
- * @throws IOException
*/
private boolean prepareModify(final MasterProcedureEnv env) throws IOException {
- if (getTableNamespaceManager(env).doesNamespaceExist(newNsDescriptor.getName()) == false) {
+ if (!getTableNamespaceManager(env).doesNamespaceExist(newNsDescriptor.getName())) {
setFailure("master-modify-namespace",
new NamespaceNotFoundException(newNsDescriptor.getName()));
return false;
}
- try {
- getTableNamespaceManager(env).validateTableAndRegionCount(newNsDescriptor);
- } catch (ConstraintException e) {
- setFailure("master-modify-namespace", e);
- return false;
- }
+ getTableNamespaceManager(env).validateTableAndRegionCount(newNsDescriptor);
// This is used for rollback
oldNsDescriptor = getTableNamespaceManager(env).get(newNsDescriptor.getName());
+ if (!Objects.equals(
+ oldNsDescriptor.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP),
+ newNsDescriptor.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP))) {
+ checkNamespaceRSGroup(env, newNsDescriptor);
+ }
return true;
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
index 8e435dd..3f26807 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
@@ -22,7 +22,7 @@ import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-
+import java.util.function.Supplier;
import org.apache.hadoop.hbase.ConcurrentTableModificationException;
import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HBaseIOException;
@@ -41,6 +41,7 @@ import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableState;
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
@@ -242,8 +243,6 @@ public class ModifyTableProcedure
/**
* Check conditions before any real action of modifying a table.
- * @param env MasterProcedureEnv
- * @throws IOException
*/
private void prepareModify(final MasterProcedureEnv env) throws IOException {
// Checks whether the table exists
@@ -285,6 +284,8 @@ public class ModifyTableProcedure
}
}
+
+
// Find out whether all column families in unmodifiedTableDescriptor also exists in
// the modifiedTableDescriptor. This is to determine whether we are safe to rollback.
final Set<byte[]> oldFamilies = unmodifiedTableDescriptor.getColumnFamilyNames();
@@ -295,6 +296,14 @@ public class ModifyTableProcedure
break;
}
}
+ if (!unmodifiedTableDescriptor.getRegionServerGroup()
+ .equals(modifiedTableDescriptor.getRegionServerGroup())) {
+ Supplier<String> forWhom = () -> "table " + getTableName();
+ RSGroupInfo rsGroupInfo = MasterProcedureUtil.checkGroupExists(
+ env.getMasterServices().getRSGroupInfoManager()::getRSGroup,
+ modifiedTableDescriptor.getRegionServerGroup(), forWhom);
+ MasterProcedureUtil.checkGroupNotEmpty(rsGroupInfo, forWhom);
+ }
}
/**
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
index 0bde67b..353b4d2 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
@@ -20,38 +20,25 @@ package org.apache.hadoop.hbase.rsgroup;
import com.google.protobuf.Service;
import java.io.IOException;
import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
import org.apache.hadoop.hbase.CoprocessorEnvironment;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.NamespaceDescriptor;
-import org.apache.hadoop.hbase.ServerName;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.RegionInfo;
-import org.apache.hadoop.hbase.client.TableDescriptor;
-import org.apache.hadoop.hbase.constraint.ConstraintException;
import org.apache.hadoop.hbase.coprocessor.CoreCoprocessor;
import org.apache.hadoop.hbase.coprocessor.HasMasterServices;
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;
-import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
-import org.apache.hadoop.hbase.coprocessor.MasterObserver;
-import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.master.MasterServices;
-import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.security.UserProvider;
import org.apache.hadoop.hbase.security.access.AccessChecker;
import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;
-// TODO: Encapsulate MasterObserver functions into separate subclass.
+/**
+ * @deprecated Keep it here only for compatibility with old client, all the logics have been moved
+ * into core of HBase.
+ */
+@Deprecated
@CoreCoprocessor
@InterfaceAudience.Private
-public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
+public class RSGroupAdminEndpoint implements MasterCoprocessor {
// Only instance of RSGroupInfoManager. RSGroup aware load balancers ask for this instance on
// their setup.
private MasterServices master;
@@ -66,13 +53,8 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
}
master = ((HasMasterServices) env).getMasterServices();
- groupInfoManager = master.getRSRSGroupInfoManager();
+ groupInfoManager = master.getRSGroupInfoManager();
groupAdminServer = new RSGroupAdminServer(master, groupInfoManager);
- Class<?> clazz =
- master.getConfiguration().getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, null);
- if (!RSGroupableBalancer.class.isAssignableFrom(clazz)) {
- throw new IOException("Configured balancer does not support RegionServer groups.");
- }
AccessChecker accessChecker = ((HasMasterServices) env).getMasterServices().getAccessChecker();
// set the user-provider.
@@ -89,11 +71,6 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
return Collections.singleton(groupAdminService);
}
- @Override
- public Optional<MasterObserver> getMasterObserver() {
- return Optional.of(this);
- }
-
RSGroupInfoManager getGroupInfoManager() {
return groupInfoManager;
}
@@ -102,108 +79,4 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
RSGroupAdminServiceImpl getGroupAdminService() {
return groupAdminService;
}
-
- /////////////////////////////////////////////////////////////////////////////
- // MasterObserver overrides
- /////////////////////////////////////////////////////////////////////////////
-
- @Override
- public void postClearDeadServers(ObserverContext<MasterCoprocessorEnvironment> ctx,
- List<ServerName> servers, List<ServerName> notClearedServers) throws IOException {
- Set<Address> clearedServer =
- servers.stream().filter(server -> !notClearedServers.contains(server))
- .map(ServerName::getAddress).collect(Collectors.toSet());
- if (!clearedServer.isEmpty()) {
- groupAdminServer.removeServers(clearedServer);
- }
- }
-
- private RSGroupInfo checkGroupExists(Optional<String> optGroupName, Supplier<String> forWhom)
- throws IOException {
- if (optGroupName.isPresent()) {
- String groupName = optGroupName.get();
- RSGroupInfo group = groupAdminServer.getRSGroupInfo(groupName);
- if (group == null) {
- throw new ConstraintException(
- "Region server group " + groupName + " for " + forWhom.get() + " does not exit");
- }
- return group;
- }
- return null;
- }
-
- private Optional<String> getNamespaceGroup(NamespaceDescriptor namespaceDesc) {
- return Optional
- .ofNullable(namespaceDesc.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP));
- }
-
- // Do not allow creating new tables/namespaces which has an empty rs group, expect the default rs
- // group. Notice that we do not check for online servers, as this is not stable because region
- // servers can die at any time.
- private void checkGroupNotEmpty(RSGroupInfo rsGroupInfo, Supplier<String> forWhom)
- throws ConstraintException {
- if (rsGroupInfo == null || rsGroupInfo.getName().equals(RSGroupInfo.DEFAULT_GROUP)) {
- // we do not have a rs group config or we explicitly set the rs group to default, then no need
- // to check.
- return;
- }
- if (rsGroupInfo.getServers().isEmpty()) {
- throw new ConstraintException(
- "No servers in the rsgroup " + rsGroupInfo.getName() + " for " + forWhom.get());
- }
- }
-
- @Override
- public void preCreateTableAction(ObserverContext<MasterCoprocessorEnvironment> ctx,
- TableDescriptor desc, RegionInfo[] regions) throws IOException {
- if (desc.getTableName().isSystemTable()) {
- // do not check for system tables as we may block the bootstrap.
- return;
- }
- Supplier<String> forWhom = () -> "table " + desc.getTableName();
- RSGroupInfo rsGroupInfo = checkGroupExists(desc.getRegionServerGroup(), forWhom);
- if (rsGroupInfo == null) {
- // we do not set rs group info on table, check if we have one on namespace
- String namespace = desc.getTableName().getNamespaceAsString();
- NamespaceDescriptor nd = master.getClusterSchema().getNamespace(namespace);
- forWhom = () -> "table " + desc.getTableName() + "(inherit from namespace)";
- rsGroupInfo = checkGroupExists(getNamespaceGroup(nd), forWhom);
- }
- checkGroupNotEmpty(rsGroupInfo, forWhom);
- }
-
- @Override
- public TableDescriptor preModifyTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
- TableName tableName, TableDescriptor currentDescriptor, TableDescriptor newDescriptor)
- throws IOException {
- if (!currentDescriptor.getRegionServerGroup().equals(newDescriptor.getRegionServerGroup())) {
- Supplier<String> forWhom = () -> "table " + newDescriptor.getTableName();
- RSGroupInfo rsGroupInfo = checkGroupExists(newDescriptor.getRegionServerGroup(), forWhom);
- checkGroupNotEmpty(rsGroupInfo, forWhom);
- }
- return MasterObserver.super.preModifyTable(ctx, tableName, currentDescriptor, newDescriptor);
- }
-
- private void checkNamespaceGroup(NamespaceDescriptor nd) throws IOException {
- Supplier<String> forWhom = () -> "namespace " + nd.getName();
- RSGroupInfo rsGroupInfo = checkGroupExists(getNamespaceGroup(nd), forWhom);
- checkGroupNotEmpty(rsGroupInfo, forWhom);
- }
-
- @Override
- public void preCreateNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx,
- NamespaceDescriptor ns) throws IOException {
- checkNamespaceGroup(ns);
- }
-
- @Override
- public void preModifyNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx,
- NamespaceDescriptor currentNsDescriptor, NamespaceDescriptor newNsDescriptor)
- throws IOException {
- if (!Objects.equals(
- currentNsDescriptor.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP),
- newNsDescriptor.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP))) {
- checkNamespaceGroup(newNsDescriptor);
- }
- }
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
index 0f943d0..fb3db84 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
@@ -35,13 +35,15 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.constraint.ConstraintException;
+import org.apache.hadoop.hbase.favored.FavoredNodesManager;
+import org.apache.hadoop.hbase.favored.FavoredNodesPromoter;
import org.apache.hadoop.hbase.master.LoadBalancer;
import org.apache.hadoop.hbase.master.MasterServices;
import org.apache.hadoop.hbase.master.RegionPlan;
-import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer;
+import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory;
import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.util.Pair;
-import org.apache.hadoop.util.ReflectionUtils;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,12 +69,13 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Maps;
* providing appropriate assignments for user tables.
*/
@InterfaceAudience.Private
-public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
+public class RSGroupBasedLoadBalancer implements LoadBalancer {
private static final Logger LOG = LoggerFactory.getLogger(RSGroupBasedLoadBalancer.class);
private Configuration config;
private ClusterMetrics clusterStatus;
private MasterServices masterServices;
+ private FavoredNodesManager favoredNodesManager;
private volatile RSGroupInfoManager rsGroupInfoManager;
private LoadBalancer internalBalancer;
@@ -330,36 +333,42 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
@Override
public void initialize() throws IOException {
- try {
+ if (rsGroupInfoManager == null) {
+ rsGroupInfoManager = masterServices.getRSGroupInfoManager();
if (rsGroupInfoManager == null) {
- List<RSGroupAdminEndpoint> cps =
- masterServices.getMasterCoprocessorHost().findCoprocessors(RSGroupAdminEndpoint.class);
- if (cps.size() != 1) {
- String msg = "Expected one implementation of GroupAdminEndpoint but found " + cps.size();
- LOG.error(msg);
- throw new HBaseIOException(msg);
- }
- rsGroupInfoManager = cps.get(0).getGroupInfoManager();
- if(rsGroupInfoManager == null){
- String msg = "RSGroupInfoManager hasn't been initialized";
- LOG.error(msg);
- throw new HBaseIOException(msg);
- }
- rsGroupInfoManager.start();
+ String msg = "RSGroupInfoManager hasn't been initialized";
+ LOG.error(msg);
+ throw new HBaseIOException(msg);
}
- } catch (IOException e) {
- throw new HBaseIOException("Failed to initialize GroupInfoManagerImpl", e);
+ rsGroupInfoManager.start();
}
// Create the balancer
- Class<? extends LoadBalancer> balancerKlass = config.getClass(HBASE_RSGROUP_LOADBALANCER_CLASS,
- StochasticLoadBalancer.class, LoadBalancer.class);
- internalBalancer = ReflectionUtils.newInstance(balancerKlass, config);
+ Class<? extends LoadBalancer> balancerClass;
+ String balancerClassName = config.get(HBASE_RSGROUP_LOADBALANCER_CLASS);
+ if (balancerClassName == null) {
+ balancerClass = config.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
+ LoadBalancerFactory.getDefaultLoadBalancerClass(), LoadBalancer.class);
+ } else {
+ try {
+ balancerClass = Class.forName(balancerClassName).asSubclass(LoadBalancer.class);
+ } catch (ClassNotFoundException e) {
+ throw new IOException(e);
+ }
+ }
+ // avoid infinite nesting
+ if (getClass().isAssignableFrom(balancerClass)) {
+ balancerClass = LoadBalancerFactory.getDefaultLoadBalancerClass();
+ }
+ internalBalancer = ReflectionUtils.newInstance(balancerClass);
+ if (internalBalancer instanceof FavoredNodesPromoter) {
+ favoredNodesManager = new FavoredNodesManager(masterServices);
+ }
+ internalBalancer.setConf(config);
internalBalancer.setMasterServices(masterServices);
if(clusterStatus != null) {
internalBalancer.setClusterMetrics(clusterStatus);
}
- internalBalancer.setConf(config);
internalBalancer.initialize();
}
@@ -402,6 +411,14 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
this.rsGroupInfoManager = rsGroupInfoManager;
}
+ public LoadBalancer getInternalBalancer() {
+ return internalBalancer;
+ }
+
+ public FavoredNodesManager getFavoredNodesManager() {
+ return favoredNodesManager;
+ }
+
@Override
public void postMasterStartupInitialize() {
this.internalBalancer.postMasterStartupInitialize();
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.java
deleted file mode 100644
index d091b3c..0000000
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * 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.rsgroup;
-
-import org.apache.hadoop.hbase.master.LoadBalancer;
-import org.apache.yetus.audience.InterfaceAudience;
-
-/**
- * Marker Interface. RSGroups feature will check for a LoadBalancer
- * marked with this Interface before it runs.
- */
-@InterfaceAudience.Private
-public interface RSGroupableBalancer extends LoadBalancer {
- /** Config for pluggable load balancers */
- String HBASE_RSGROUP_LOADBALANCER_CLASS = "hbase.rsgroup.grouploadbalancer.class";
-}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java
index 1fe43f1..df39862 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java
@@ -115,7 +115,7 @@ public class TestNamespace {
//verify existence of system tables
Set<TableName> systemTables = Sets.newHashSet(
- TableName.META_TABLE_NAME);
+ TableName.META_TABLE_NAME, TableName.valueOf("hbase:rsgroup"));
List<TableDescriptor> descs = admin.listTableDescriptorsByNamespace(
Bytes.toBytes(NamespaceDescriptor.SYSTEM_NAMESPACE.getName()));
assertEquals(systemTables.size(), descs.size());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/AbstractTestDLS.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/AbstractTestDLS.java
index db15ca6..052b2e5 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/AbstractTestDLS.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/AbstractTestDLS.java
@@ -504,14 +504,14 @@ public abstract class AbstractTestDLS {
for (String oregion : regions)
LOG.debug("Region still online: " + oregion);
}
- assertEquals(1 + existingRegions, regions.size());
+ assertEquals(2 + existingRegions, regions.size());
LOG.debug("Enabling table\n");
TEST_UTIL.getAdmin().enableTable(tableName);
LOG.debug("Waiting for no more RIT\n");
blockUntilNoRIT();
LOG.debug("Verifying there are " + numRegions + " assigned on cluster\n");
regions = HBaseTestingUtility.getAllOnlineRegions(cluster);
- assertEquals(numRegions + 1 + existingRegions, regions.size());
+ assertEquals(numRegions + 2 + existingRegions, regions.size());
return table;
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
index 26772ae..71f8a91 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
@@ -493,7 +493,7 @@ public class MockNoopMasterServices implements MasterServices {
}
@Override
- public RSGroupInfoManager getRSRSGroupInfoManager() {
+ public RSGroupInfoManager getRSGroupInfoManager() {
return null;
}
}
\ No newline at end of file
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClusterRestart.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClusterRestart.java
index 5a38234..a8d80b6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClusterRestart.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClusterRestart.java
@@ -43,6 +43,8 @@ public class TestClusterRestart extends AbstractTestRestartCluster {
private static final Logger LOG = LoggerFactory.getLogger(TestClusterRestart.class);
+ private static final int NUM_REGIONS = 4;
+
@Override
protected boolean splitWALCoordinatedByZk() {
return true;
@@ -61,7 +63,7 @@ public class TestClusterRestart extends AbstractTestRestartCluster {
}
List<RegionInfo> allRegions = MetaTableAccessor.getAllRegions(UTIL.getConnection(), false);
- assertEquals(3, allRegions.size());
+ assertEquals(NUM_REGIONS, allRegions.size());
LOG.info("\n\nShutting down cluster");
UTIL.shutdownMiniHBaseCluster();
@@ -76,7 +78,7 @@ public class TestClusterRestart extends AbstractTestRestartCluster {
// Otherwise we're reusing an Connection that has gone stale because
// the shutdown of the cluster also called shut of the connection.
allRegions = MetaTableAccessor.getAllRegions(UTIL.getConnection(), false);
- assertEquals(3, allRegions.size());
+ assertEquals(NUM_REGIONS, allRegions.size());
LOG.info("\n\nWaiting for tables to be available");
for (TableName TABLE : TABLES) {
try {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java
index 75d9ee1..61720df 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java
@@ -25,6 +25,7 @@ import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.MiniHBaseCluster;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.StartMiniClusterOption;
+import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.test.MetricsAssertHelper;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
@@ -90,6 +91,7 @@ public class TestMasterMetrics {
cluster = TEST_UTIL.getHBaseCluster();
LOG.info("Waiting for active/ready master");
cluster.waitForActiveAndReadyMaster();
+ TEST_UTIL.waitTableAvailable(TableName.valueOf("hbase:rsgroup"));
master = cluster.getMaster();
}
@@ -131,7 +133,7 @@ public class TestMasterMetrics {
MetricsMasterSource masterSource = master.getMasterMetrics().getMetricsSource();
boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(TEST_UTIL.getConfiguration());
metricsHelper.assertGauge("numRegionServers", 1 + (tablesOnMaster ? 1 : 0), masterSource);
- metricsHelper.assertGauge("averageLoad", 1, masterSource);
+ metricsHelper.assertGauge("averageLoad", 2, masterSource);
metricsHelper.assertGauge("numDeadRegionServers", 0, masterSource);
metricsHelper.assertGauge("masterStartTime", master.getMasterStartTime(), masterSource);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.java
index fca2866..2d0af3e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.java
@@ -92,7 +92,7 @@ public class TestMasterRestartAfterDisablingTable {
NavigableSet<String> regions = HBaseTestingUtility.getAllOnlineRegions(cluster);
assertEquals("The number of regions for the table tableRestart should be 0 and only" +
- "the catalog table should be present.", 1, regions.size());
+ "the catalog table should be present.", 2, regions.size());
List<MasterThread> masterThreads = cluster.getMasterThreads();
MasterThread activeMaster = null;
@@ -120,7 +120,7 @@ public class TestMasterRestartAfterDisablingTable {
log("Verifying there are " + numRegions + " assigned on cluster\n");
regions = HBaseTestingUtility.getAllOnlineRegions(cluster);
assertEquals("The assigned regions were not onlined after master" +
- " switch except for the catalog table.", 5, regions.size());
+ " switch except for the catalog table.", 6, regions.size());
assertTrue("The table should be in enabled state", cluster.getMaster().getTableStateManager()
.isTableState(TableName.valueOf(name.getMethodName()), TableState.State.ENABLED));
ht.close();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRollingRestart.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRollingRestart.java
index 0aba487..2dc1b6c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRollingRestart.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRollingRestart.java
@@ -121,7 +121,7 @@ public class TestRollingRestart {
log("Region still online: " + oregion);
}
}
- assertEquals(1, regions.size());
+ assertEquals(2, regions.size());
log("Enabling table\n");
TEST_UTIL.getAdmin().enableTable(tableName);
log("Waiting for no more RIT\n");
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticBalancerPickers.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticBalancerPickers.java
index 0aa2322..7677eb6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticBalancerPickers.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticBalancerPickers.java
@@ -186,7 +186,7 @@ public class TestFavoredStochasticBalancerPickers extends BalancerTestBase {
regionFinder.setServices(TEST_UTIL.getMiniHBaseCluster().getMaster());
Cluster cluster = new Cluster(serverAssignments, null, regionFinder, new RackManager(conf));
LoadOnlyFavoredStochasticBalancer balancer = (LoadOnlyFavoredStochasticBalancer) TEST_UTIL
- .getMiniHBaseCluster().getMaster().getLoadBalancer();
+ .getMiniHBaseCluster().getMaster().getLoadBalancer().getInternalBalancer();
cluster.sortServersByRegionCount();
Integer[] servers = cluster.serverIndicesSortedByRegionCount;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionOpen.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionOpen.java
index 7ab5dcc..2503825 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionOpen.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionOpen.java
@@ -59,7 +59,6 @@ public class TestRegionOpen {
public static final HBaseClassTestRule CLASS_RULE =
HBaseClassTestRule.forClass(TestRegionOpen.class);
- @SuppressWarnings("unused")
private static final Logger LOG = LoggerFactory.getLogger(TestRegionOpen.class);
private static final int NB_SERVERS = 1;
@@ -87,6 +86,7 @@ public class TestRegionOpen {
final TableName tableName = TableName.valueOf(TestRegionOpen.class.getSimpleName());
ThreadPoolExecutor exec = getRS().getExecutorService()
.getExecutorThreadPool(ExecutorType.RS_OPEN_PRIORITY_REGION);
+ HTU.waitTableAvailable(TableName.valueOf("hbase:rsgroup"));
long completed = exec.getCompletedTaskCount();
HTableDescriptor htd = new HTableDescriptor(tableName);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicasWithRestartScenarios.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicasWithRestartScenarios.java
index 70df61e..dc0a918 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicasWithRestartScenarios.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicasWithRestartScenarios.java
@@ -146,7 +146,7 @@ public class TestRegionReplicasWithRestartScenarios {
checkDuplicates(onlineRegions3);
assertFalse(res);
int totalRegions = onlineRegions.size() + onlineRegions2.size() + onlineRegions3.size();
- assertEquals(61, totalRegions);
+ assertEquals(62, totalRegions);
}
private boolean checkDuplicates(Collection<HRegion> onlineRegions3) throws Exception {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java
index b57ff41..ab7ff16 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java
@@ -225,7 +225,7 @@ public class TestRegionServerMetrics {
@Test
public void testRegionCount() throws Exception {
- metricsHelper.assertGauge("regionCount", TABLES_ON_MASTER ? 1 : 2, serverSource);
+ metricsHelper.assertGauge("regionCount", TABLES_ON_MASTER ? 1 : 3, serverSource);
}
@Test
@@ -335,7 +335,7 @@ public class TestRegionServerMetrics {
TEST_UTIL.getAdmin().flush(tableName);
metricsRegionServer.getRegionServerWrapper().forceRecompute();
- assertGauge("storeCount", TABLES_ON_MASTER ? 1 : 5);
+ assertGauge("storeCount", TABLES_ON_MASTER ? 1 : 6);
assertGauge("storeFileCount", 1);
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
index d3577f2..7ac1a49 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
@@ -163,8 +163,7 @@ public class TestRSGroupsOfflineMode {
});
// Get groupInfoManager from the new active master.
- RSGroupInfoManager groupMgr = ((MiniHBaseCluster) cluster).getMaster()
- .getMasterCoprocessorHost().findCoprocessor(RSGroupAdminEndpoint.class).getGroupInfoManager();
+ RSGroupInfoManager groupMgr = ((MiniHBaseCluster) cluster).getMaster().getRSGroupInfoManager();
// Make sure balancer is in offline mode, since this is what we're testing.
assertFalse(groupMgr.isOnline());
// Kill final regionserver to see the failover happens for all tables except GROUP table since
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestTablePermissions.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestTablePermissions.java
index 14ea0b3..e03a823 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestTablePermissions.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestTablePermissions.java
@@ -102,6 +102,7 @@ public class TestTablePermissions {
// Wait for the ACL table to become available
UTIL.waitTableEnabled(PermissionStorage.ACL_TABLE_NAME);
+ UTIL.waitTableAvailable(TableName.valueOf("hbase:rsgroup"));
ZKW = new ZKWatcher(UTIL.getConfiguration(),
"TestTablePermissions", ABORTABLE);
@@ -222,7 +223,7 @@ public class TestTablePermissions {
// check full load
Map<byte[], ListMultimap<String, UserPermission>> allPerms = PermissionStorage.loadAll(conf);
assertEquals("Full permission map should have entries for both test tables",
- 2, allPerms.size());
+ 3, allPerms.size());
userPerms = allPerms.get(TEST_TABLE.getName()).get("hubert");
assertNotNull(userPerms);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckReplication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckReplication.java
index 316a321..0ac07d8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckReplication.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckReplication.java
@@ -24,6 +24,7 @@ import java.util.stream.Stream;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;
import org.apache.hadoop.hbase.replication.ReplicationPeerStorage;
import org.apache.hadoop.hbase.replication.ReplicationQueueStorage;
@@ -52,6 +53,7 @@ public class TestHBaseFsckReplication {
public static void setUp() throws Exception {
UTIL.getConfiguration().setBoolean("hbase.write.hbck1.lock.file", false);
UTIL.startMiniCluster(1);
+ UTIL.waitTableAvailable(TableName.valueOf("hbase:rsgroup"));
}
@AfterClass