diff --git a/hbase-assembly/pom.xml b/hbase-assembly/pom.xml
index f51617efdf18..a54df8cc0290 100644
--- a/hbase-assembly/pom.xml
+++ b/hbase-assembly/pom.xml
@@ -333,20 +333,4 @@
pom
-
-
- rsgroup
-
-
- !skip-rsgroup
-
-
-
-
- org.apache.hbase
- hbase-rsgroup
-
-
-
-
diff --git a/hbase-assembly/src/main/assembly/components.xml b/hbase-assembly/src/main/assembly/components.xml
index e4a3d36700b1..4238da5bfbc0 100644
--- a/hbase-assembly/src/main/assembly/components.xml
+++ b/hbase-assembly/src/main/assembly/components.xml
@@ -144,14 +144,6 @@
0644
-
- ${project.basedir}/../hbase-rsgroup/target/
- lib
-
- ${rsgroup.test.jar}
-
- 0644
-
${project.basedir}/../hbase-mapreduce/target/
lib
diff --git a/hbase-assembly/src/main/assembly/hadoop-two-compat.xml b/hbase-assembly/src/main/assembly/hadoop-two-compat.xml
index fcfb442c3b11..f2dae4d31adc 100644
--- a/hbase-assembly/src/main/assembly/hadoop-two-compat.xml
+++ b/hbase-assembly/src/main/assembly/hadoop-two-compat.xml
@@ -50,7 +50,6 @@
org.apache.hbase:hbase-protocol-shaded
org.apache.hbase:hbase-replication
org.apache.hbase:hbase-rest
- org.apache.hbase:hbase-rsgroup
org.apache.hbase:hbase-server
org.apache.hbase:hbase-shell
org.apache.hbase:hbase-testing-util
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
index e69036ae79cf..ca4e0696d15f 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
@@ -97,6 +97,7 @@
import org.apache.hadoop.hbase.protobuf.generated.MapReduceProtos;
import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
import org.apache.hadoop.hbase.protobuf.generated.RSGroupProtos;
+import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.util.Addressing;
@@ -1775,6 +1776,14 @@ public static ServerName toServerName(final byte [] data) throws Deserialization
return ServerName.valueOf(hostname, port, -1L);
}
+ public static HBaseProtos.TimeRange toTimeRange(TimeRange timeRange) {
+ if (timeRange == null) {
+ timeRange = TimeRange.allTime();
+ }
+ return HBaseProtos.TimeRange.newBuilder().setFrom(timeRange.getMin()).setTo(timeRange.getMax())
+ .build();
+ }
+
public static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) {
RSGroupInfo RSGroupInfo = new RSGroupInfo(proto.getName());
for(HBaseProtos.ServerName el: proto.getServersList()) {
@@ -1786,13 +1795,18 @@ public static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) {
return RSGroupInfo;
}
- public static HBaseProtos.TimeRange toTimeRange(TimeRange timeRange) {
- if (timeRange == null) {
- timeRange = TimeRange.allTime();
+ public static RSGroupProtos.RSGroupInfo toProtoGroupInfo(RSGroupInfo pojo) {
+ List tables = new ArrayList<>(pojo.getTables().size());
+ for (TableName arg : pojo.getTables()) {
+ tables.add(ProtobufUtil.toProtoTableName(arg));
+ }
+ List hostports = new ArrayList<>(pojo.getServers().size());
+ for (Address el : pojo.getServers()) {
+ hostports.add(HBaseProtos.ServerName.newBuilder().setHostName(el.getHostname())
+ .setPort(el.getPort()).build());
}
- return HBaseProtos.TimeRange.newBuilder().setFrom(timeRange.getMin())
- .setTo(timeRange.getMax())
- .build();
+ return RSGroupProtos.RSGroupInfo.newBuilder().setName(pojo.getName()).addAllServers(hostports)
+ .addAllTables(tables).build();
}
/**
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
index 72d728af9916..0618c0356447 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
@@ -43,7 +43,6 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import org.apache.commons.io.input.BoundedInputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.ByteBufferExtendedCell;
@@ -94,6 +93,7 @@
import org.apache.hadoop.hbase.filter.ByteArrayComparable;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.io.TimeRange;
+import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.protobuf.ProtobufMagic;
import org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter;
import org.apache.hadoop.hbase.quotas.QuotaScope;
@@ -102,6 +102,7 @@
import org.apache.hadoop.hbase.quotas.ThrottleType;
import org.apache.hadoop.hbase.replication.ReplicationLoadSink;
import org.apache.hadoop.hbase.replication.ReplicationLoadSource;
+import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.security.visibility.Authorizations;
import org.apache.hadoop.hbase.security.visibility.CellVisibility;
import org.apache.hadoop.hbase.util.Addressing;
@@ -178,6 +179,7 @@
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerReportRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos;
@@ -3392,4 +3394,29 @@ public static RegionStatesCount toTableRegionStatesCount(
.build();
}
+
+ public static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) {
+ RSGroupInfo RSGroupInfo = new RSGroupInfo(proto.getName());
+ for (HBaseProtos.ServerName el : proto.getServersList()) {
+ RSGroupInfo.addServer(Address.fromParts(el.getHostName(), el.getPort()));
+ }
+ for (HBaseProtos.TableName pTableName : proto.getTablesList()) {
+ RSGroupInfo.addTable(ProtobufUtil.toTableName(pTableName));
+ }
+ return RSGroupInfo;
+ }
+
+ public static RSGroupProtos.RSGroupInfo toProtoGroupInfo(RSGroupInfo pojo) {
+ List tables = new ArrayList<>(pojo.getTables().size());
+ for (TableName arg : pojo.getTables()) {
+ tables.add(ProtobufUtil.toProtoTableName(arg));
+ }
+ List hostports = new ArrayList<>(pojo.getServers().size());
+ for (Address el : pojo.getServers()) {
+ hostports.add(HBaseProtos.ServerName.newBuilder().setHostName(el.getHostname())
+ .setPort(el.getPort()).build());
+ }
+ return RSGroupProtos.RSGroupInfo.newBuilder().setName(pojo.getName()).addAllServers(hostports)
+ .addAllTables(tables).build();
+ }
}
diff --git a/hbase-it/pom.xml b/hbase-it/pom.xml
index a89dd56ccfff..dd6dfd5336b1 100644
--- a/hbase-it/pom.xml
+++ b/hbase-it/pom.xml
@@ -181,16 +181,6 @@
test-jar
test
-
- org.apache.hbase
- hbase-rsgroup
-
-
- org.apache.hbase
- hbase-rsgroup
- test-jar
- test
-
org.apache.hbase
hbase-server
diff --git a/hbase-rsgroup/src/test/resources/hbase-site.xml b/hbase-protocol-shaded/src/main/protobuf/RSGroup.proto
similarity index 67%
rename from hbase-rsgroup/src/test/resources/hbase-site.xml
rename to hbase-protocol-shaded/src/main/protobuf/RSGroup.proto
index 99d2ab8d1fbb..ede2b13cb5cc 100644
--- a/hbase-rsgroup/src/test/resources/hbase-site.xml
+++ b/hbase-protocol-shaded/src/main/protobuf/RSGroup.proto
@@ -1,8 +1,4 @@
-
-
-
-
-
- hbase.defaults.for.version.skip
- true
-
-
- hbase.hconnection.threads.keepalivetime
- 3
-
-
+
+package hbase.pb;
+
+option java_package = "org.apache.hadoop.hbase.shaded.protobuf.generated";
+option java_outer_classname = "RSGroupProtos";
+option java_generic_services = true;
+option java_generate_equals_and_hash = true;
+option optimize_for = SPEED;
+
+import "HBase.proto";
+
+message RSGroupInfo {
+ required string name = 1;
+ repeated ServerName servers = 4;
+ repeated TableName tables = 3;
+}
diff --git a/hbase-protocol-shaded/src/main/protobuf/RSGroupAdmin.proto b/hbase-protocol-shaded/src/main/protobuf/RSGroupAdmin.proto
new file mode 100644
index 000000000000..1db713677f2c
--- /dev/null
+++ b/hbase-protocol-shaded/src/main/protobuf/RSGroupAdmin.proto
@@ -0,0 +1,158 @@
+/**
+ * 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 hbase.pb;
+
+option java_package = "org.apache.hadoop.hbase.shaded.protobuf.generated";
+option java_outer_classname = "RSGroupAdminProtos";
+option java_generic_services = true;
+option java_generate_equals_and_hash = true;
+option optimize_for = SPEED;
+
+import "HBase.proto";
+import "RSGroup.proto";
+
+/** Group level protobufs */
+
+message ListTablesOfRSGroupRequest {
+ required string r_s_group_name = 1;
+}
+
+message ListTablesOfRSGroupResponse {
+ repeated TableName table_name = 1;
+}
+
+message GetRSGroupInfoRequest {
+ required string r_s_group_name = 1;
+}
+
+message GetRSGroupInfoResponse {
+ optional RSGroupInfo r_s_group_info = 1;
+}
+
+message GetRSGroupInfoOfTableRequest {
+ required TableName table_name = 1;
+}
+
+message GetRSGroupInfoOfTableResponse {
+ optional RSGroupInfo r_s_group_info = 1;
+}
+
+message MoveServersRequest {
+ required string target_group = 1;
+ repeated ServerName servers = 3;
+}
+
+message MoveServersResponse {
+}
+
+message MoveTablesRequest {
+ required string target_group = 1;
+ repeated TableName table_name = 2;
+}
+
+message MoveTablesResponse {
+}
+
+message AddRSGroupRequest {
+ required string r_s_group_name = 1;
+}
+
+message AddRSGroupResponse {
+}
+
+message RemoveRSGroupRequest {
+ required string r_s_group_name = 1;
+}
+
+message RemoveRSGroupResponse {
+}
+
+message BalanceRSGroupRequest {
+ required string r_s_group_name = 1;
+}
+
+message BalanceRSGroupResponse {
+ required bool balanceRan = 1;
+}
+
+message ListRSGroupInfosRequest {
+}
+
+message ListRSGroupInfosResponse {
+ repeated RSGroupInfo r_s_group_info = 1;
+}
+
+message GetRSGroupInfoOfServerRequest {
+ required ServerName server = 2;
+}
+
+message GetRSGroupInfoOfServerResponse {
+ optional RSGroupInfo r_s_group_info = 1;
+}
+
+message MoveServersAndTablesRequest {
+ required string target_group = 1;
+ repeated ServerName servers = 2;
+ repeated TableName table_name = 3;
+}
+
+message MoveServersAndTablesResponse {
+}
+
+message RemoveServersRequest {
+ repeated ServerName servers = 1;
+}
+
+message RemoveServersResponse {
+}
+
+service RSGroupAdminService {
+ rpc GetRSGroupInfo(GetRSGroupInfoRequest)
+ returns (GetRSGroupInfoResponse);
+
+ rpc GetRSGroupInfoOfTable(GetRSGroupInfoOfTableRequest)
+ returns (GetRSGroupInfoOfTableResponse);
+
+ rpc GetRSGroupInfoOfServer(GetRSGroupInfoOfServerRequest)
+ returns (GetRSGroupInfoOfServerResponse);
+
+ rpc MoveServers(MoveServersRequest)
+ returns (MoveServersResponse);
+
+ rpc MoveTables(MoveTablesRequest)
+ returns (MoveTablesResponse);
+
+ rpc AddRSGroup(AddRSGroupRequest)
+ returns (AddRSGroupResponse);
+
+ rpc RemoveRSGroup(RemoveRSGroupRequest)
+ returns (RemoveRSGroupResponse);
+
+ rpc BalanceRSGroup(BalanceRSGroupRequest)
+ returns (BalanceRSGroupResponse);
+
+ rpc ListRSGroupInfos(ListRSGroupInfosRequest)
+ returns (ListRSGroupInfosResponse);
+
+ rpc MoveServersAndTables(MoveServersAndTablesRequest)
+ returns (MoveServersAndTablesResponse);
+
+ rpc RemoveServers(RemoveServersRequest)
+ returns (RemoveServersResponse);
+}
diff --git a/hbase-rsgroup/src/main/protobuf/RSGroupAdmin.proto b/hbase-protocol/src/main/protobuf/RSGroupAdmin.proto
similarity index 100%
rename from hbase-rsgroup/src/main/protobuf/RSGroupAdmin.proto
rename to hbase-protocol/src/main/protobuf/RSGroupAdmin.proto
diff --git a/hbase-rsgroup/README.txt b/hbase-rsgroup/README.txt
deleted file mode 100644
index b24aee650603..000000000000
--- a/hbase-rsgroup/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-ON PROTOBUFS
-This maven module has protobuf definition files ('.protos') used by hbase
-Coprocessor Endpoints that ship with hbase core including tests. Coprocessor
-Endpoints are meant to be standalone, independent code not reliant on hbase
-internals. They define their Service using protobuf. The protobuf version
-they use can be distinct from that used by HBase internally since HBase started
-shading its protobuf references. Endpoints have no access to the shaded protobuf
-hbase uses. They do have access to the content of hbase-protocol -- the
-.protos found in here -- but avoid using as much of this as you can as it is
-liable to change.
-
-Generation of java files from protobuf .proto files included here is done as
-part of the build.
diff --git a/hbase-rsgroup/pom.xml b/hbase-rsgroup/pom.xml
deleted file mode 100644
index 86676dd43a45..000000000000
--- a/hbase-rsgroup/pom.xml
+++ /dev/null
@@ -1,279 +0,0 @@
-
-
-
- 4.0.0
-
- hbase-build-configuration
- org.apache.hbase
- 2.3.0-mdh3.2.6-SNAPSHOT
- ../hbase-build-configuration
-
- hbase-rsgroup
- Apache HBase - RSGroup
- Regionserver Groups for HBase
-
-
-
-
- maven-assembly-plugin
-
- true
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
-
-
- org.xolstice.maven.plugins
- protobuf-maven-plugin
-
-
- compile-protoc
- generate-sources
-
- compile
-
-
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
- true
-
-
-
- net.revelc.code
- warbucks-maven-plugin
-
-
-
-
-
-
- org.apache.hbase
- hbase-annotations
- test-jar
- test
-
-
- org.apache.hbase
- hbase-client
-
-
- org.apache.hbase
- hbase-server
-
-
- org.apache.hbase
- hbase-common
-
-
- org.apache.hbase
- hbase-procedure
-
-
- org.apache.hbase
- hbase-procedure
- test-jar
- test
-
-
- org.apache.hbase
- hbase-protocol
-
-
- org.apache.hbase
- hbase-protocol-shaded
-
-
- org.apache.hbase
- hbase-testing-util
- test
-
-
-
- org.apache.commons
- commons-lang3
-
-
- org.slf4j
- slf4j-api
-
-
- com.xiaomi.infra.thirdparty
- infra-shaded-miscellaneous
-
-
- com.google.protobuf
- protobuf-java
-
-
- org.apache.zookeeper
- zookeeper
-
-
- log4j
- log4j
- test
-
-
- org.mockito
- mockito-core
- test
-
-
- junit
- junit
- test
-
-
-
-
-
- skipRSGroupTests
-
-
- skipRSGroupTests
-
-
-
- true
- true
-
-
-
-
- hadoop-2.0
-
-
-
-
- !hadoop.profile
-
-
-
-
- com.github.stephenc.findbugs
- findbugs-annotations
- true
-
-
- org.apache.hadoop
- hadoop-common
-
-
- net.java.dev.jets3t
- jets3t
-
-
- javax.servlet.jsp
- jsp-api
-
-
- org.mortbay.jetty
- jetty
-
-
- com.sun.jersey
- jersey-server
-
-
- com.sun.jersey
- jersey-core
-
-
- com.sun.jersey
- jersey-json
-
-
- javax.servlet
- servlet-api
-
-
- tomcat
- jasper-compiler
-
-
- tomcat
- jasper-runtime
-
-
- com.google.code.findbugs
- jsr305
-
-
-
-
-
-
-
- hadoop-3.0
-
-
- hadoop.profile
- 3.0
-
-
-
- 3.0-SNAPSHOT
-
-
-
- org.apache.hadoop
- hadoop-common
-
-
-
-
- eclipse-specific
-
-
- m2e.version
-
-
-
-
-
-
-
- org.eclipse.m2e
- lifecycle-mapping
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
deleted file mode 100644
index 88dd45c8b773..000000000000
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
+++ /dev/null
@@ -1,538 +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 com.google.protobuf.RpcCallback;
-import com.google.protobuf.RpcController;
-import com.google.protobuf.Service;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.CoprocessorEnvironment;
-import org.apache.hadoop.hbase.HBaseIOException;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.MasterNotRunningException;
-import org.apache.hadoop.hbase.NamespaceDescriptor;
-import org.apache.hadoop.hbase.PleaseHoldException;
-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.SnapshotDescription;
-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.ipc.CoprocessorRpcUtils;
-import org.apache.hadoop.hbase.ipc.RpcServer;
-import org.apache.hadoop.hbase.master.MasterServices;
-import org.apache.hadoop.hbase.net.Address;
-import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdminService;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersRequest;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersResponse;
-import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
-import org.apache.hadoop.hbase.security.User;
-import org.apache.hadoop.hbase.security.UserProvider;
-import org.apache.hadoop.hbase.security.access.AccessChecker;
-import org.apache.hadoop.hbase.security.access.Permission.Action;
-import org.apache.hadoop.util.Shell.ShellCommandExecutor;
-import org.apache.yetus.audience.InterfaceAudience;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.xiaomi.infra.thirdparty.com.google.common.collect.Sets;
-
-// TODO: Encapsulate MasterObserver functions into separate subclass.
-@CoreCoprocessor
-@InterfaceAudience.Private
-public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
- private static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminEndpoint.class);
-
- private MasterServices master = null;
- // Only instance of RSGroupInfoManager. RSGroup aware load balancers ask for this instance on
- // their setup.
- private RSGroupInfoManager groupInfoManager;
- private RSGroupAdminServer groupAdminServer;
- private final RSGroupAdminService groupAdminService = new RSGroupAdminServiceImpl();
- private AccessChecker accessChecker;
-
- /** Provider for mapping principal names to Users */
- private UserProvider userProvider;
-
- @Override
- public void start(CoprocessorEnvironment env) throws IOException {
- if (!(env instanceof HasMasterServices)) {
- throw new IOException("Does not implement HMasterServices");
- }
-
- master = ((HasMasterServices)env).getMasterServices();
- groupInfoManager = RSGroupInfoManagerImpl.getInstance(master);
- 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 = ((HasMasterServices) env).getMasterServices().getAccessChecker();
-
- // set the user-provider.
- this.userProvider = UserProvider.instantiate(env.getConfiguration());
- }
-
- @Override
- public void stop(CoprocessorEnvironment env) {
- }
-
- @Override
- public Iterable getServices() {
- return Collections.singleton(groupAdminService);
- }
-
- @Override
- public Optional getMasterObserver() {
- return Optional.of(this);
- }
-
- RSGroupInfoManager getGroupInfoManager() {
- return groupInfoManager;
- }
-
- /**
- * Implementation of RSGroupAdminService defined in RSGroupAdmin.proto.
- * This class calls {@link RSGroupAdminServer} for actual work, converts result to protocol
- * buffer response, handles exceptions if any occurred and then calls the {@code RpcCallback} with
- * the response.
- */
- private class RSGroupAdminServiceImpl extends RSGroupAdminProtos.RSGroupAdminService {
- @Override
- public void getRSGroupInfo(RpcController controller,
- GetRSGroupInfoRequest request, RpcCallback done) {
- GetRSGroupInfoResponse.Builder builder = GetRSGroupInfoResponse.newBuilder();
- String groupName = request.getRSGroupName();
- LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, group="
- + groupName);
- try {
- checkPermission("getRSGroupInfo");
- RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
- if (rsGroupInfo != null) {
- builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(rsGroupInfo));
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void getRSGroupInfoOfTable(RpcController controller,
- GetRSGroupInfoOfTableRequest request, RpcCallback done) {
- GetRSGroupInfoOfTableResponse.Builder builder = GetRSGroupInfoOfTableResponse.newBuilder();
- TableName tableName = ProtobufUtil.toTableName(request.getTableName());
- LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, table="
- + tableName);
- try {
- checkPermission("getRSGroupInfoOfTable");
- RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupInfoOfTable(tableName);
- if (RSGroupInfo != null) {
- builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void moveServers(RpcController controller, MoveServersRequest request,
- RpcCallback done) {
- MoveServersResponse.Builder builder = MoveServersResponse.newBuilder();
- Set hostPorts = Sets.newHashSet();
- for (HBaseProtos.ServerName el : request.getServersList()) {
- hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));
- }
- LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +" to rsgroup "
- + request.getTargetGroup());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preMoveServers(hostPorts, request.getTargetGroup());
- }
- checkPermission("moveServers");
- groupAdminServer.moveServers(hostPorts, request.getTargetGroup());
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void moveTables(RpcController controller, MoveTablesRequest request,
- RpcCallback done) {
- MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();
- Set tables = new HashSet<>(request.getTableNameList().size());
- for (TableProtos.TableName tableName : request.getTableNameList()) {
- tables.add(ProtobufUtil.toTableName(tableName));
- }
- LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup "
- + request.getTargetGroup());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());
- }
- checkPermission("moveTables");
- groupAdminServer.moveTables(tables, request.getTargetGroup());
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void addRSGroup(RpcController controller, AddRSGroupRequest request,
- RpcCallback done) {
- AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();
- LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());
- }
- checkPermission("addRSGroup");
- groupAdminServer.addRSGroup(request.getRSGroupName());
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void removeRSGroup(RpcController controller,
- RemoveRSGroupRequest request, RpcCallback done) {
- RemoveRSGroupResponse.Builder builder =
- RemoveRSGroupResponse.newBuilder();
- LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());
- }
- checkPermission("removeRSGroup");
- groupAdminServer.removeRSGroup(request.getRSGroupName());
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void balanceRSGroup(RpcController controller,
- BalanceRSGroupRequest request, RpcCallback done) {
- BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();
- LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group="
- + request.getRSGroupName());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());
- }
- checkPermission("balanceRSGroup");
- boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());
- builder.setBalanceRan(balancerRan);
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(),
- balancerRan);
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- builder.setBalanceRan(false);
- }
- done.run(builder.build());
- }
-
- @Override
- public void listRSGroupInfos(RpcController controller,
- ListRSGroupInfosRequest request, RpcCallback done) {
- ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();
- LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");
- try {
- checkPermission("listRSGroup");
- for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {
- builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void getRSGroupInfoOfServer(RpcController controller,
- GetRSGroupInfoOfServerRequest request, RpcCallback done) {
- GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();
- Address hp = Address.fromParts(request.getServer().getHostName(),
- request.getServer().getPort());
- LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="
- + hp);
- try {
- checkPermission("getRSGroupInfoOfServer");
- RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);
- if (info != null) {
- builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void moveServersAndTables(RpcController controller,
- MoveServersAndTablesRequest request, RpcCallback done) {
- MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();
- Set hostPorts = Sets.newHashSet();
- for (HBaseProtos.ServerName el : request.getServersList()) {
- hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));
- }
- Set tables = new HashSet<>(request.getTableNameList().size());
- for (TableProtos.TableName tableName : request.getTableNameList()) {
- tables.add(ProtobufUtil.toTableName(tableName));
- }
- LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts
- + " and tables " + tables + " to rsgroup" + request.getTargetGroup());
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,
- request.getTargetGroup());
- }
- checkPermission("moveServersAndTables");
- groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,
- request.getTargetGroup());
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
-
- @Override
- public void removeServers(RpcController controller,
- RemoveServersRequest request,
- RpcCallback done) {
- RemoveServersResponse.Builder builder =
- RemoveServersResponse.newBuilder();
- Set servers = Sets.newHashSet();
- for (HBaseProtos.ServerName el : request.getServersList()) {
- servers.add(Address.fromParts(el.getHostName(), el.getPort()));
- }
- LOG.info(master.getClientIdAuditPrefix()
- + " remove decommissioned servers from rsgroup: " + servers);
- try {
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().preRemoveServers(servers);
- }
- checkPermission("removeServers");
- groupAdminServer.removeServers(servers);
- if (master.getMasterCoprocessorHost() != null) {
- master.getMasterCoprocessorHost().postRemoveServers(servers);
- }
- } catch (IOException e) {
- CoprocessorRpcUtils.setControllerException(controller, e);
- }
- done.run(builder.build());
- }
- }
-
- boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {
- String groupName;
- try {
- groupName =
- master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())
- .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);
- if (groupName == null) {
- groupName = RSGroupInfo.DEFAULT_GROUP;
- }
- } catch (MasterNotRunningException | PleaseHoldException e) {
- LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +
- RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");
- groupName = RSGroupInfo.DEFAULT_GROUP;
- }
-
- RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
- if (rsGroupInfo == null) {
- throw new ConstraintException(
- "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");
- }
-
- for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {
- if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {
- return true;
- }
- }
- return false;
- }
-
- void assignTableToGroup(TableDescriptor desc) throws IOException {
- RSGroupInfo rsGroupInfo = groupInfoManager.determineRSGroupInfoForTable(desc.getTableName());
- if (rsGroupInfo == null) {
- throw new ConstraintException("Default RSGroup for this table " + desc.getTableName()
- + " does not exist.");
- }
- if (!rsGroupInfo.containsTable(desc.getTableName())) {
- LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + rsGroupInfo.getName());
- groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), rsGroupInfo.getName());
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // MasterObserver overrides
- /////////////////////////////////////////////////////////////////////////////
-
- @Override
- public void preCreateTableAction(
- final ObserverContext ctx,
- final TableDescriptor desc,
- final RegionInfo[] regions) throws IOException {
- if (desc.getTableName().isSystemTable()) {
- return;
- }
- RSGroupInfo rsGroupInfo = groupInfoManager.determineRSGroupInfoForTable(desc.getTableName());
- if (rsGroupInfo == null) {
- throw new ConstraintException("Default RSGroup for this table " + desc.getTableName()
- + " does not exist.");
- }
- if (!RSGroupUtil.rsGroupHasOnlineServer(master, rsGroupInfo)) {
- throw new HBaseIOException("No online servers in the rsgroup " + rsGroupInfo.getName()
- + " which table " + desc.getTableName().getNameAsString() + " belongs to");
- }
- synchronized (groupInfoManager) {
- groupInfoManager.moveTables(
- Collections.singleton(desc.getTableName()), rsGroupInfo.getName());
- }
- }
-
- // Remove table from its RSGroup.
- @Override
- public void postDeleteTable(ObserverContext ctx,
- TableName tableName) throws IOException {
- try {
- RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);
- if (group != null) {
- LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,
- group.getName()));
- groupAdminServer.moveTables(Sets.newHashSet(tableName), null);
- }
- } catch (IOException ex) {
- LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);
- }
- }
-
- @Override
- public void preCreateNamespace(ObserverContext ctx,
- NamespaceDescriptor ns) throws IOException {
- String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);
- if(group != null && groupAdminServer.getRSGroupInfo(group) == null) {
- throw new ConstraintException("Region server group " + group + " does not exist.");
- }
- }
-
- @Override
- public void preModifyNamespace(ObserverContext ctx,
- NamespaceDescriptor ns) throws IOException {
- preCreateNamespace(ctx, ns);
- }
-
- @Override
- public void preCloneSnapshot(ObserverContext ctx,
- SnapshotDescription snapshot, TableDescriptor desc) throws IOException {
- assignTableToGroup(desc);
- }
-
- @Override
- public void postClearDeadServers(ObserverContext ctx,
- List servers, List notClearedServers)
- throws IOException {
- Set clearedServer = servers.stream().
- filter(server -> !notClearedServers.contains(server)).
- map(ServerName::getAddress).
- collect(Collectors.toSet());
- if(!clearedServer.isEmpty()) {
- groupAdminServer.removeServers(clearedServer);
- }
- }
-
- public void checkPermission(String request) throws IOException {
- accessChecker.requirePermission(getActiveUser(), request, null, Action.ADMIN);
- }
-
- /**
- * Returns the active user to which authorization checks should be applied.
- * If we are in the context of an RPC call, the remote user is used,
- * otherwise the currently logged in user is used.
- */
- private User getActiveUser() throws IOException {
- // for non-rpc handling, fallback to system user
- Optional optionalUser = RpcServer.getRequestUser();
- if (optionalUser.isPresent()) {
- return optionalUser.get();
- }
- return userProvider.getCurrent();
- }
-}
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupProtobufUtil.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupProtobufUtil.java
deleted file mode 100644
index 9b6ba1cc1c9e..000000000000
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupProtobufUtil.java
+++ /dev/null
@@ -1,64 +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 java.util.ArrayList;
-import java.util.List;
-
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.net.Address;
-import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
-import org.apache.hadoop.hbase.protobuf.generated.RSGroupProtos;
-import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
-import org.apache.yetus.audience.InterfaceAudience;
-
-@InterfaceAudience.Private
-final class RSGroupProtobufUtil {
- private RSGroupProtobufUtil() {
- }
-
- static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) {
- RSGroupInfo RSGroupInfo = new RSGroupInfo(proto.getName());
- for(HBaseProtos.ServerName el: proto.getServersList()) {
- RSGroupInfo.addServer(Address.fromParts(el.getHostName(), el.getPort()));
- }
- for(TableProtos.TableName pTableName: proto.getTablesList()) {
- RSGroupInfo.addTable(ProtobufUtil.toTableName(pTableName));
- }
- return RSGroupInfo;
- }
-
- static RSGroupProtos.RSGroupInfo toProtoGroupInfo(RSGroupInfo pojo) {
- List tables = new ArrayList<>(pojo.getTables().size());
- for(TableName arg: pojo.getTables()) {
- tables.add(ProtobufUtil.toProtoTableName(arg));
- }
- List hostports = new ArrayList<>(pojo.getServers().size());
- for(Address el: pojo.getServers()) {
- hostports.add(HBaseProtos.ServerName.newBuilder()
- .setHostName(el.getHostname())
- .setPort(el.getPort())
- .build());
- }
- return RSGroupProtos.RSGroupInfo.newBuilder().setName(pojo.getName())
- .addAllServers(hostports)
- .addAllTables(tables).build();
- }
-}
diff --git a/hbase-rsgroup/src/test/resources/log4j.properties b/hbase-rsgroup/src/test/resources/log4j.properties
deleted file mode 100644
index c322699ced24..000000000000
--- a/hbase-rsgroup/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,68 +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.
-
-# Define some default values that can be overridden by system properties
-hbase.root.logger=INFO,console
-hbase.log.dir=.
-hbase.log.file=hbase.log
-
-# Define the root logger to the system property "hbase.root.logger".
-log4j.rootLogger=${hbase.root.logger}
-
-# Logging Threshold
-log4j.threshold=ALL
-
-#
-# Daily Rolling File Appender
-#
-log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.DRFA.File=${hbase.log.dir}/${hbase.log.file}
-
-# Rollver at midnight
-log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
-
-# 30-day backup
-#log4j.appender.DRFA.MaxBackupIndex=30
-log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
-# Debugging Pattern format
-log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %C{2}(%L): %m%n
-
-
-#
-# console
-# Add "console" to rootlogger above if you want to use this
-#
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.target=System.err
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %C{2}(%L): %m%n
-
-# Custom Logging levels
-
-#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
-
-log4j.logger.org.apache.hadoop=WARN
-log4j.logger.org.apache.zookeeper=ERROR
-log4j.logger.org.apache.hadoop.hbase=DEBUG
-
-#These settings are workarounds against spurious logs from the minicluster.
-#See HBASE-4709
-log4j.logger.org.apache.hadoop.metrics2.impl.MetricsConfig=WARN
-log4j.logger.org.apache.hadoop.metrics2.impl.MetricsSinkAdapter=WARN
-log4j.logger.org.apache.hadoop.metrics2.impl.MetricsSystemImpl=WARN
-log4j.logger.org.apache.hadoop.metrics2.util.MBeans=WARN
-# Enable this to get detailed connection error/retry logging.
-# log4j.logger.org.apache.hadoop.hbase.client.ConnectionImplementation=TRACE
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdmin.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdmin.java
similarity index 100%
rename from hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdmin.java
rename to hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdmin.java
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java
similarity index 97%
rename from hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java
rename to hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java
index 5e5d5907f744..8bf85354e365 100644
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java
@@ -18,12 +18,10 @@
package org.apache.hadoop.hbase.rsgroup;
import com.google.protobuf.ServiceException;
-
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
-
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.TableNotFoundException;
import org.apache.hadoop.hbase.client.Admin;
@@ -70,7 +68,7 @@ public RSGroupInfo getRSGroupInfo(String groupName) throws IOException {
GetRSGroupInfoResponse resp = stub.getRSGroupInfo(null,
GetRSGroupInfoRequest.newBuilder().setRSGroupName(groupName).build());
if(resp.hasRSGroupInfo()) {
- return RSGroupProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
+ return ProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
}
return null;
} catch (ServiceException e) {
@@ -85,7 +83,7 @@ public RSGroupInfo getRSGroupInfoOfTable(TableName tableName) throws IOException
try {
GetRSGroupInfoOfTableResponse resp = stub.getRSGroupInfoOfTable(null, request);
if (resp.hasRSGroupInfo()) {
- return RSGroupProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
+ return ProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
}
return null;
} catch (ServiceException e) {
@@ -167,7 +165,7 @@ public List listRSGroups() throws IOException {
ListRSGroupInfosRequest.getDefaultInstance()).getRSGroupInfoList();
List result = new ArrayList<>(resp.size());
for(RSGroupProtos.RSGroupInfo entry : resp) {
- result.add(RSGroupProtobufUtil.toGroupInfo(entry));
+ result.add(ProtobufUtil.toGroupInfo(entry));
}
return result;
} catch (ServiceException e) {
@@ -186,7 +184,7 @@ public RSGroupInfo getRSGroupOfServer(Address hostPort) throws IOException {
try {
GetRSGroupInfoOfServerResponse resp = stub.getRSGroupInfoOfServer(null, request);
if (resp.hasRSGroupInfo()) {
- return RSGroupProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
+ return ProtobufUtil.toGroupInfo(resp.getRSGroupInfo());
}
return null;
} catch (ServiceException e) {
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
new file mode 100644
index 000000000000..66dca266afb1
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
@@ -0,0 +1,226 @@
+/**
+ * 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 com.google.protobuf.Service;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.hadoop.hbase.CoprocessorEnvironment;
+import org.apache.hadoop.hbase.HBaseIOException;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.MasterNotRunningException;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
+import org.apache.hadoop.hbase.PleaseHoldException;
+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.SnapshotDescription;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.xiaomi.infra.thirdparty.com.google.common.annotations.VisibleForTesting;
+import com.xiaomi.infra.thirdparty.com.google.common.collect.Sets;
+
+// TODO: Encapsulate MasterObserver functions into separate subclass.
+@CoreCoprocessor
+@InterfaceAudience.Private
+public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
+ static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminEndpoint.class);
+
+ private MasterServices master;
+ // Only instance of RSGroupInfoManager. RSGroup aware load balancers ask for this instance on
+ // their setup.
+ private RSGroupInfoManager groupInfoManager;
+ private RSGroupAdminServer groupAdminServer;
+ private RSGroupAdminServiceImpl groupAdminService = new RSGroupAdminServiceImpl();
+
+ @Override
+ public void start(CoprocessorEnvironment env) throws IOException {
+ if (!(env instanceof HasMasterServices)) {
+ throw new IOException("Does not implement HMasterServices");
+ }
+
+ master = ((HasMasterServices) env).getMasterServices();
+ groupInfoManager = RSGroupInfoManagerImpl.getInstance(master);
+ 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.
+ UserProvider userProvider = UserProvider.instantiate(env.getConfiguration());
+ groupAdminService.initialize(master, groupAdminServer, accessChecker, userProvider);
+ }
+
+ @Override
+ public void stop(CoprocessorEnvironment env) {
+ }
+
+ @Override
+ public Iterable getServices() {
+ return Collections.singleton(groupAdminService);
+ }
+
+ @Override
+ public Optional getMasterObserver() {
+ return Optional.of(this);
+ }
+
+ RSGroupInfoManager getGroupInfoManager() {
+ return groupInfoManager;
+ }
+
+ @VisibleForTesting
+ RSGroupAdminServiceImpl getGroupAdminService() {
+ return groupAdminService;
+ }
+
+ private void assignTableToGroup(TableDescriptor desc) throws IOException {
+ String groupName =
+ master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())
+ .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);
+ if (groupName == null) {
+ groupName = RSGroupInfo.DEFAULT_GROUP;
+ }
+ RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
+ if (rsGroupInfo == null) {
+ throw new ConstraintException(
+ "Default RSGroup (" + groupName + ") for this table's namespace does not exist.");
+ }
+ if (!rsGroupInfo.containsTable(desc.getTableName())) {
+ LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName);
+ groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName);
+ }
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+ // MasterObserver overrides
+ /////////////////////////////////////////////////////////////////////////////
+
+ private boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {
+ String groupName;
+ try {
+ groupName = master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())
+ .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);
+ if (groupName == null) {
+ groupName = RSGroupInfo.DEFAULT_GROUP;
+ }
+ } catch (MasterNotRunningException | PleaseHoldException e) {
+ LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +
+ RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");
+ groupName = RSGroupInfo.DEFAULT_GROUP;
+ }
+
+ RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
+ if (rsGroupInfo == null) {
+ throw new ConstraintException(
+ "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");
+ }
+
+ for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {
+ if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void preCreateTableAction(final ObserverContext ctx,
+ final TableDescriptor desc, final RegionInfo[] regions) throws IOException {
+ if (!desc.getTableName().isSystemTable() && !rsgroupHasServersOnline(desc)) {
+ throw new HBaseIOException("No online servers in the rsgroup, which table " +
+ desc.getTableName().getNameAsString() + " belongs to");
+ }
+ }
+
+ // Assign table to default RSGroup.
+ @Override
+ public void postCreateTable(ObserverContext ctx,
+ TableDescriptor desc, RegionInfo[] regions) throws IOException {
+ assignTableToGroup(desc);
+ }
+
+ // Remove table from its RSGroup.
+ @Override
+ public void postDeleteTable(ObserverContext ctx,
+ TableName tableName) throws IOException {
+ try {
+ RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);
+ if (group != null) {
+ LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,
+ group.getName()));
+ groupAdminServer.moveTables(Sets.newHashSet(tableName), null);
+ }
+ } catch (IOException ex) {
+ LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);
+ }
+ }
+
+ @Override
+ public void preCreateNamespace(ObserverContext ctx,
+ NamespaceDescriptor ns) throws IOException {
+ String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);
+ if (group != null && groupAdminServer.getRSGroupInfo(group) == null) {
+ throw new ConstraintException("Region server group " + group + " does not exit");
+ }
+ }
+
+ @Override
+ public void preModifyNamespace(ObserverContext ctx,
+ NamespaceDescriptor currentNsDesc, NamespaceDescriptor newNsDesc) throws IOException {
+ preCreateNamespace(ctx, newNsDesc);
+ }
+
+ @Override
+ public void preCloneSnapshot(ObserverContext ctx,
+ SnapshotDescription snapshot, TableDescriptor desc) throws IOException {
+ assignTableToGroup(desc);
+ }
+
+ @Override
+ public void postClearDeadServers(ObserverContext ctx,
+ List servers, List notClearedServers) throws IOException {
+ Set clearedServer =
+ servers.stream().filter(server -> !notClearedServers.contains(server))
+ .map(ServerName::getAddress).collect(Collectors.toSet());
+ if (!clearedServer.isEmpty()) {
+ groupAdminServer.removeServers(clearedServer);
+ }
+ }
+}
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java
similarity index 100%
rename from hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java
rename to hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServiceImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServiceImpl.java
new file mode 100644
index 000000000000..df3459285fd7
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServiceImpl.java
@@ -0,0 +1,356 @@
+/**
+ * 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 com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcController;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;
+import org.apache.hadoop.hbase.ipc.RpcServer;
+import org.apache.hadoop.hbase.master.MasterServices;
+import org.apache.hadoop.hbase.net.Address;
+import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersRequest;
+import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersResponse;
+import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
+import org.apache.hadoop.hbase.security.User;
+import org.apache.hadoop.hbase.security.UserProvider;
+import org.apache.hadoop.hbase.security.access.AccessChecker;
+import org.apache.hadoop.hbase.security.access.Permission.Action;
+
+import com.xiaomi.infra.thirdparty.com.google.common.annotations.VisibleForTesting;
+import com.xiaomi.infra.thirdparty.com.google.common.collect.Sets;
+
+/**
+ * Implementation of RSGroupAdminService defined in RSGroupAdmin.proto. This class calls
+ * {@link RSGroupAdminServer} for actual work, converts result to protocol buffer response, handles
+ * exceptions if any occurred and then calls the {@code RpcCallback} with the response.
+ */
+class RSGroupAdminServiceImpl extends RSGroupAdminProtos.RSGroupAdminService {
+
+ private MasterServices master;
+
+ private RSGroupAdminServer groupAdminServer;
+
+ private AccessChecker accessChecker;
+
+ /** Provider for mapping principal names to Users */
+ private UserProvider userProvider;
+
+ RSGroupAdminServiceImpl() {
+ }
+
+ void initialize(MasterServices master, RSGroupAdminServer groupAdminServer,
+ AccessChecker accessChecker, UserProvider userProvider) {
+ this.master = master;
+ this.groupAdminServer = groupAdminServer;
+ this.accessChecker = accessChecker;
+ this.userProvider = userProvider;
+ }
+
+ @VisibleForTesting
+ void checkPermission(String request) throws IOException {
+ accessChecker.requirePermission(getActiveUser(), request, null, Action.ADMIN);
+ }
+
+ /**
+ * Returns the active user to which authorization checks should be applied. If we are in the
+ * context of an RPC call, the remote user is used, otherwise the currently logged in user is
+ * used.
+ */
+ private User getActiveUser() throws IOException {
+ // for non-rpc handling, fallback to system user
+ Optional optionalUser = RpcServer.getRequestUser();
+ if (optionalUser.isPresent()) {
+ return optionalUser.get();
+ }
+ return userProvider.getCurrent();
+ }
+
+ @Override
+ public void getRSGroupInfo(RpcController controller, GetRSGroupInfoRequest request,
+ RpcCallback done) {
+ GetRSGroupInfoResponse.Builder builder = GetRSGroupInfoResponse.newBuilder();
+ String groupName = request.getRSGroupName();
+ RSGroupAdminEndpoint.LOG.info(
+ master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, group=" + groupName);
+ try {
+ checkPermission("getRSGroupInfo");
+ RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
+ if (rsGroupInfo != null) {
+ builder.setRSGroupInfo(ProtobufUtil.toProtoGroupInfo(rsGroupInfo));
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void getRSGroupInfoOfTable(RpcController controller, GetRSGroupInfoOfTableRequest request,
+ RpcCallback done) {
+ GetRSGroupInfoOfTableResponse.Builder builder = GetRSGroupInfoOfTableResponse.newBuilder();
+ TableName tableName = ProtobufUtil.toTableName(request.getTableName());
+ RSGroupAdminEndpoint.LOG.info(
+ master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, table=" + tableName);
+ try {
+ checkPermission("getRSGroupInfoOfTable");
+ RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupInfoOfTable(tableName);
+ if (RSGroupInfo != null) {
+ builder.setRSGroupInfo(ProtobufUtil.toProtoGroupInfo(RSGroupInfo));
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void moveServers(RpcController controller, MoveServersRequest request,
+ RpcCallback done) {
+ MoveServersResponse.Builder builder = MoveServersResponse.newBuilder();
+ Set hostPorts = Sets.newHashSet();
+ for (HBaseProtos.ServerName el : request.getServersList()) {
+ hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));
+ }
+ RSGroupAdminEndpoint.LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +
+ " to rsgroup " + request.getTargetGroup());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preMoveServers(hostPorts, request.getTargetGroup());
+ }
+ checkPermission("moveServers");
+ groupAdminServer.moveServers(hostPorts, request.getTargetGroup());
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void moveTables(RpcController controller, MoveTablesRequest request,
+ RpcCallback done) {
+ MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();
+ Set tables = new HashSet<>(request.getTableNameList().size());
+ for (TableProtos.TableName tableName : request.getTableNameList()) {
+ tables.add(ProtobufUtil.toTableName(tableName));
+ }
+ RSGroupAdminEndpoint.LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +
+ " to rsgroup " + request.getTargetGroup());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());
+ }
+ checkPermission("moveTables");
+ groupAdminServer.moveTables(tables, request.getTargetGroup());
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void addRSGroup(RpcController controller, AddRSGroupRequest request,
+ RpcCallback done) {
+ AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();
+ RSGroupAdminEndpoint.LOG
+ .info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());
+ }
+ checkPermission("addRSGroup");
+ groupAdminServer.addRSGroup(request.getRSGroupName());
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void removeRSGroup(RpcController controller, RemoveRSGroupRequest request,
+ RpcCallback done) {
+ RemoveRSGroupResponse.Builder builder = RemoveRSGroupResponse.newBuilder();
+ RSGroupAdminEndpoint.LOG
+ .info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());
+ }
+ checkPermission("removeRSGroup");
+ groupAdminServer.removeRSGroup(request.getRSGroupName());
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void balanceRSGroup(RpcController controller, BalanceRSGroupRequest request,
+ RpcCallback done) {
+ BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();
+ RSGroupAdminEndpoint.LOG.info(
+ master.getClientIdAuditPrefix() + " balance rsgroup, group=" + request.getRSGroupName());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());
+ }
+ checkPermission("balanceRSGroup");
+ boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());
+ builder.setBalanceRan(balancerRan);
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(), balancerRan);
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ builder.setBalanceRan(false);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void listRSGroupInfos(RpcController controller, ListRSGroupInfosRequest request,
+ RpcCallback done) {
+ ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();
+ RSGroupAdminEndpoint.LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");
+ try {
+ checkPermission("listRSGroup");
+ for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {
+ builder.addRSGroupInfo(ProtobufUtil.toProtoGroupInfo(RSGroupInfo));
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void getRSGroupInfoOfServer(RpcController controller,
+ GetRSGroupInfoOfServerRequest request, RpcCallback done) {
+ GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();
+ Address hp =
+ Address.fromParts(request.getServer().getHostName(), request.getServer().getPort());
+ RSGroupAdminEndpoint.LOG
+ .info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server=" + hp);
+ try {
+ checkPermission("getRSGroupInfoOfServer");
+ RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);
+ if (info != null) {
+ builder.setRSGroupInfo(ProtobufUtil.toProtoGroupInfo(info));
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void moveServersAndTables(RpcController controller, MoveServersAndTablesRequest request,
+ RpcCallback done) {
+ MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();
+ Set hostPorts = Sets.newHashSet();
+ for (HBaseProtos.ServerName el : request.getServersList()) {
+ hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));
+ }
+ Set tables = new HashSet<>(request.getTableNameList().size());
+ for (TableProtos.TableName tableName : request.getTableNameList()) {
+ tables.add(ProtobufUtil.toTableName(tableName));
+ }
+ RSGroupAdminEndpoint.LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +
+ " and tables " + tables + " to rsgroup" + request.getTargetGroup());
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,
+ request.getTargetGroup());
+ }
+ checkPermission("moveServersAndTables");
+ groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,
+ request.getTargetGroup());
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+
+ @Override
+ public void removeServers(RpcController controller, RemoveServersRequest request,
+ RpcCallback done) {
+ RemoveServersResponse.Builder builder = RemoveServersResponse.newBuilder();
+ Set servers = Sets.newHashSet();
+ for (HBaseProtos.ServerName el : request.getServersList()) {
+ servers.add(Address.fromParts(el.getHostName(), el.getPort()));
+ }
+ RSGroupAdminEndpoint.LOG.info(
+ master.getClientIdAuditPrefix() + " remove decommissioned servers from rsgroup: " + servers);
+ try {
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preRemoveServers(servers);
+ }
+ checkPermission("removeServers");
+ groupAdminServer.removeServers(servers);
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postRemoveServers(servers);
+ }
+ } catch (IOException e) {
+ CoprocessorRpcUtils.setControllerException(controller, e);
+ }
+ done.run(builder.build());
+ }
+}
\ No newline at end of file
diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
similarity index 97%
rename from hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
rename to hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
index d9504d2eaa34..ea6a728c59d9 100644
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
@@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.hadoop.hbase.rsgroup;
import java.io.IOException;
@@ -53,18 +52,17 @@
import com.xiaomi.infra.thirdparty.com.google.common.collect.Maps;
/**
- * GroupBasedLoadBalancer, used when Region Server Grouping is configured (HBase-6721)
- * It does region balance based on a table's group membership.
- *
- * Most assignment methods contain two exclusive code paths: Online - when the group
- * table is online and Offline - when it is unavailable.
- *
- * During Offline, assignments are assigned based on cached information in zookeeper.
- * If unavailable (ie bootstrap) then regions are assigned randomly.
- *
- * Once the GROUP table has been assigned, the balancer switches to Online and will then
- * start providing appropriate assignments for user tables.
- *
+ * GroupBasedLoadBalancer, used when Region Server Grouping is configured (HBase-6721) It does
+ * region balance based on a table's group membership.
+ *
+ * Most assignment methods contain two exclusive code paths: Online - when the group table is online
+ * and Offline - when it is unavailable.
+ *
+ * During Offline, assignments are assigned based on cached information in zookeeper. If unavailable
+ * (ie bootstrap) then regions are assigned randomly.
+ *
+ * Once the GROUP table has been assigned, the balancer switches to Online and will then start
+ * providing appropriate assignments for user tables.
*/
@InterfaceAudience.Private
public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
@@ -116,8 +114,8 @@ public void setMasterServices(MasterServices masterServices) {
public List balanceCluster(
Map>> loadOfAllTable) throws IOException {
if (!isOnline()) {
- throw new ConstraintException(RSGroupInfoManager.RSGROUP_TABLE_NAME +
- " is not online, unable to perform balance");
+ throw new ConstraintException(
+ RSGroupInfoManager.class.getSimpleName() + " is not online, unable to perform balance");
}
// Calculate correct assignments and a list of RegionPlan for mis-placed regions
Pair
-
- rsgroup
-
-
- !skip-rsgroup
-
-
-
-
- org.apache.hbase
- hbase-rsgroup
-
-
-
-
-
- org.codehaus.mojo
- build-helper-maven-plugin
-
-
- add-test-source
-
- add-test-source
-
-
-
-
-
-
-
-
-
-
-
-
skipShellTests
diff --git a/pom.xml b/pom.xml
index 719e4abd8cdc..0b729152302c 100755
--- a/pom.xml
+++ b/pom.xml
@@ -1399,7 +1399,6 @@
hbase-procedure-${project.version}-tests.jar
hbase-it-${project.version}-tests.jar
hbase-annotations-${project.version}-tests.jar
- hbase-rsgroup-${project.version}-tests.jar
hbase-mapreduce-${project.version}-tests.jar
hbase-zookeeper-${project.version}-tests.jar
bash
@@ -1529,18 +1528,6 @@
test-jar
test
-
- hbase-rsgroup
- org.apache.hbase
- ${project.version}
-
-
- hbase-rsgroup
- org.apache.hbase
- ${project.version}
- test-jar
- test
-
hbase-replication
org.apache.hbase
@@ -2200,17 +2187,6 @@
-->
-
- rsgroup
-
-
- !skip-rsgroup
-
-
-
- hbase-rsgroup
-
-
build-with-jdk8