You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2018/05/29 23:37:14 UTC
hbase git commit: HBASE-20653 Add missing observer hooks for region
server group to MasterObserver
Repository: hbase
Updated Branches:
refs/heads/master 92460c58a -> 8d19bbd34
HBASE-20653 Add missing observer hooks for region server group to MasterObserver
Signed-off-by: tedyu <yu...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8d19bbd3
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8d19bbd3
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8d19bbd3
Branch: refs/heads/master
Commit: 8d19bbd34781a1b442f9dd382b3db57be2f77c64
Parents: 92460c5
Author: Nihal Jain <ni...@gmail.com>
Authored: Mon May 28 20:01:39 2018 +0530
Committer: tedyu <yu...@gmail.com>
Committed: Tue May 29 16:37:19 2018 -0700
----------------------------------------------------------------------
.../hbase/rsgroup/RSGroupAdminEndpoint.java | 49 ++++++-----
.../hadoop/hbase/rsgroup/TestRSGroups.java | 86 ++++++++++++++++++++
.../hbase/rsgroup/TestRSGroupsWithACL.java | 8 +-
.../hbase/coprocessor/MasterObserver.java | 62 ++++++++++++++
.../hbase/master/MasterCoprocessorHost.java | 72 ++++++++++++++++
.../hbase/security/access/AccessController.java | 24 ++++++
6 files changed, 272 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java
----------------------------------------------------------------------
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
index 8546a40..51d978b 100644
--- 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
@@ -49,7 +49,6 @@ 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;
@@ -78,10 +77,8 @@ import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGro
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.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.hbase.zookeeper.ZKWatcher;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
@@ -161,11 +158,16 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, group="
+ groupName);
try {
- checkPermission("getRSGroupInfo");
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preGetRSGroupInfo(groupName);
+ }
RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);
if (rsGroupInfo != null) {
builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(rsGroupInfo));
}
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postGetRSGroupInfo(groupName);
+ }
} catch (IOException e) {
CoprocessorRpcUtils.setControllerException(controller, e);
}
@@ -180,11 +182,16 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, table="
+ tableName);
try {
- checkPermission("getRSGroupInfoOfTable");
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preGetRSGroupInfoOfTable(tableName);
+ }
RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupInfoOfTable(tableName);
if (RSGroupInfo != null) {
builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));
}
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postGetRSGroupInfoOfTable(tableName);
+ }
} catch (IOException e) {
CoprocessorRpcUtils.setControllerException(controller, e);
}
@@ -307,10 +314,15 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();
LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");
try {
- checkPermission("listRSGroup");
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preListRSGroupInfos();
+ }
for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {
builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));
}
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postListRSGroupInfos();
+ }
} catch (IOException e) {
CoprocessorRpcUtils.setControllerException(controller, e);
}
@@ -326,11 +338,16 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="
+ hp);
try {
- checkPermission("getRSGroupInfoOfServer");
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().preGetRSGroupInfoOfServer(hp);
+ }
RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);
if (info != null) {
builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));
}
+ if (master.getMasterCoprocessorHost() != null) {
+ master.getMasterCoprocessorHost().postGetRSGroupInfoOfServer(hp);
+ }
} catch (IOException e) {
CoprocessorRpcUtils.setControllerException(controller, e);
}
@@ -510,22 +527,4 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver {
collect(Collectors.toSet());
groupAdminServer.removeServers(clearedServer);
}
-
- public void checkPermission(String request) throws IOException {
- accessChecker.requirePermission(getActiveUser(), request, 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<User> optionalUser = RpcServer.getRequestUser();
- if (optionalUser.isPresent()) {
- return optionalUser.get();
- }
- return userProvider.getCurrent();
- }
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java
----------------------------------------------------------------------
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java
index 3e74f81..3bd76be 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java
@@ -292,6 +292,14 @@ public class TestRSGroups extends TestRSGroupsBase {
boolean postRemoveServersCalled = false;
boolean preMoveServersAndTables = false;
boolean postMoveServersAndTables = false;
+ boolean preGetRSGroupInfoCalled = false;
+ boolean postGetRSGroupInfoCalled = false;
+ boolean preGetRSGroupInfoOfTableCalled = false;
+ boolean postGetRSGroupInfoOfTableCalled = false;
+ boolean preListRSGroupInfosCalled = false;
+ boolean postListRSGroupInfosCalled = false;
+ boolean preGetRSGroupInfoOfServerCalled = false;
+ boolean postGetRSGroupInfoOfServerCalled = false;
@Override
public Optional<MasterObserver> getMasterObserver() {
@@ -370,7 +378,85 @@ public class TestRSGroups extends TestRSGroupsBase {
String groupName, boolean balancerRan) throws IOException {
postBalanceRSGroupCalled = true;
}
+
+ @Override
+ public void preGetRSGroupInfo(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final String groupName) throws IOException {
+ preGetRSGroupInfoCalled = true;
+ }
+
+ @Override
+ public void postGetRSGroupInfo(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final String groupName) throws IOException {
+ postGetRSGroupInfoCalled = true;
+ }
+
+ @Override
+ public void preGetRSGroupInfoOfTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final TableName tableName) throws IOException {
+ preGetRSGroupInfoOfTableCalled = true;
+ }
+
+ @Override
+ public void postGetRSGroupInfoOfTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final TableName tableName) throws IOException {
+ postGetRSGroupInfoOfTableCalled = true;
+ }
+
+ @Override
+ public void preListRSGroupInfos(final ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ preListRSGroupInfosCalled = true;
+ }
+
+ @Override
+ public void postListRSGroupInfos(final ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ postListRSGroupInfosCalled = true;
+ }
+
+ @Override
+ public void preGetRSGroupInfoOfServer(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final Address server) throws IOException {
+ preGetRSGroupInfoOfServerCalled = true;
+ }
+
+ @Override
+ public void postGetRSGroupInfoOfServer(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final Address server) throws IOException {
+ postGetRSGroupInfoOfServerCalled = true;
+ }
+ }
+
+ @Test
+ public void testGetRSGroupInfoCPHookCalled() throws Exception {
+ rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP);
+ assertTrue(observer.preGetRSGroupInfoCalled);
+ assertTrue(observer.postGetRSGroupInfoCalled);
+ }
+
+ @Test
+ public void testGetRSGroupInfoOfTableCPHookCalled() throws Exception {
+ rsGroupAdmin.getRSGroupInfoOfTable(TableName.META_TABLE_NAME);
+ assertTrue(observer.preGetRSGroupInfoOfTableCalled);
+ assertTrue(observer.postGetRSGroupInfoOfTableCalled);
+ }
+
+ @Test
+ public void testListRSGroupInfosCPHookCalled() throws Exception {
+ rsGroupAdmin.listRSGroups();
+ assertTrue(observer.preListRSGroupInfosCalled);
+ assertTrue(observer.postListRSGroupInfosCalled);
}
+
+ @Test
+ public void testGetRSGroupInfoOfServerCPHookCalled() throws Exception {
+ ServerName masterServerName = ((MiniHBaseCluster) cluster).getMaster().getServerName();
+ rsGroupAdmin.getRSGroupOfServer(masterServerName.getAddress());
+ assertTrue(observer.preGetRSGroupInfoOfServerCalled);
+ assertTrue(observer.postGetRSGroupInfoOfServerCalled);
+ }
+
@Test
public void testMoveServersAndTables() throws Exception {
super.testMoveServersAndTables();
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
----------------------------------------------------------------------
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
index 83d76a4..a4ee9df 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
@@ -235,7 +235,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil{
@Test
public void testGetRSGroupInfo() throws Exception {
AccessTestAction action = () -> {
- rsGroupAdminEndpoint.checkPermission("getRSGroupInfo");
+ accessController.preGetRSGroupInfo(CTX, null);
return null;
};
@@ -245,7 +245,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil{
@Test
public void testGetRSGroupInfoOfTable() throws Exception {
AccessTestAction action = () -> {
- rsGroupAdminEndpoint.checkPermission("getRSGroupInfoOfTable");
+ accessController.preGetRSGroupInfoOfTable(CTX, null);
return null;
};
@@ -305,7 +305,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil{
@Test
public void testListRSGroup() throws Exception {
AccessTestAction action = () -> {
- rsGroupAdminEndpoint.checkPermission("listRSGroup");
+ accessController.preListRSGroupInfos(CTX);
return null;
};
@@ -315,7 +315,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil{
@Test
public void testGetRSGroupInfoOfServer() throws Exception {
AccessTestAction action = () -> {
- rsGroupAdminEndpoint.checkPermission("getRSGroupInfoOfServer");
+ accessController.preGetRSGroupInfoOfServer(CTX, null);
return null;
};
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
index f60a04d..92209f8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
@@ -1213,6 +1213,68 @@ public interface MasterObserver {
Set<Address> servers) throws IOException {}
/**
+ * Called before getting region server group info of the passed groupName.
+ * @param ctx the environment to interact with the framework and master
+ * @param groupName name of the group to get RSGroupInfo for
+ */
+ default void preGetRSGroupInfo(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final String groupName) throws IOException {}
+
+ /**
+ * Called after getting region server group info of the passed groupName.
+ * @param ctx the environment to interact with the framework and master
+ * @param groupName name of the group to get RSGroupInfo for
+ */
+ default void postGetRSGroupInfo(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final String groupName) throws IOException {}
+
+ /**
+ * Called before getting region server group info of the passed tableName.
+ * @param ctx the environment to interact with the framework and master
+ * @param tableName name of the table to get RSGroupInfo for
+ */
+ default void preGetRSGroupInfoOfTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final TableName tableName) throws IOException {}
+
+ /**
+ * Called after getting region server group info of the passed tableName.
+ * @param ctx the environment to interact with the framework and master
+ * @param tableName name of the table to get RSGroupInfo for
+ */
+ default void postGetRSGroupInfoOfTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final TableName tableName) throws IOException {}
+
+ /**
+ * Called before listing region server group information.
+ * @param ctx the environment to interact with the framework and master
+ */
+ default void preListRSGroupInfos(final ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {}
+
+ /**
+ * Called after listing region server group information.
+ * @param ctx the environment to interact with the framework and master
+ */
+ default void postListRSGroupInfos(final ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {}
+
+ /**
+ * Called before getting region server group info of the passed server.
+ * @param ctx the environment to interact with the framework and master
+ * @param server server to get RSGroupInfo for
+ */
+ default void preGetRSGroupInfoOfServer(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final Address server) throws IOException {}
+
+ /**
+ * Called after getting region server group info of the passed server.
+ * @param ctx the environment to interact with the framework and master
+ * @param server server to get RSGroupInfo for
+ */
+ default void postGetRSGroupInfoOfServer(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ final Address server) throws IOException {}
+
+ /**
* Called before add a replication peer
* @param ctx the environment to interact with the framework and master
* @param peerId a short name that identifies the peer
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 072ae8a..da4cb26 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -1404,6 +1404,78 @@ public class MasterCoprocessorHost
});
}
+ public void preGetRSGroupInfo(final String groupName) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.preGetRSGroupInfo(this, groupName);
+ }
+ });
+ }
+
+ public void postGetRSGroupInfo(final String groupName) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.postGetRSGroupInfo(this, groupName);
+ }
+ });
+ }
+
+ public void preGetRSGroupInfoOfTable(final TableName tableName) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.preGetRSGroupInfoOfTable(this, tableName);
+ }
+ });
+ }
+
+ public void postGetRSGroupInfoOfTable(final TableName tableName) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.postGetRSGroupInfoOfTable(this, tableName);
+ }
+ });
+ }
+
+ public void preListRSGroupInfos() throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.preListRSGroupInfos(this);
+ }
+ });
+ }
+
+ public void postListRSGroupInfos() throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.postListRSGroupInfos(this);
+ }
+ });
+ }
+
+ public void preGetRSGroupInfoOfServer(final Address server) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.preGetRSGroupInfoOfServer(this, server);
+ }
+ });
+ }
+
+ public void postGetRSGroupInfoOfServer(final Address server) throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.postGetRSGroupInfoOfServer(this, server);
+ }
+ });
+ }
+
public void preAddReplicationPeer(final String peerId, final ReplicationPeerConfig peerConfig)
throws IOException {
execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/8d19bbd3/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
index 7e824e2..1ac98f5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
@@ -1307,6 +1307,18 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
}
@Override
+ public void preGetRSGroupInfo(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ String groupName) throws IOException {
+ requirePermission(ctx, "getRSGroupInfo", Action.ADMIN);
+ }
+
+ @Override
+ public void preGetRSGroupInfoOfTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ TableName tableName) throws IOException {
+ requirePermission(ctx, "getRSGroupInfoOfTable", Action.ADMIN);
+ }
+
+ @Override
public void preMoveServersAndTables(final ObserverContext<MasterCoprocessorEnvironment> ctx,
Set<Address> servers, Set<TableName> tables, String targetGroup) throws IOException {
requirePermission(ctx, "moveServersAndTables", Action.ADMIN);
@@ -1343,6 +1355,18 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
}
@Override
+ public void preListRSGroupInfos(final ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ requirePermission(ctx, "listRSGroup", Action.ADMIN);
+ }
+
+ @Override
+ public void preGetRSGroupInfoOfServer(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+ Address server) throws IOException {
+ requirePermission(ctx, "getRSGroupInfoOfServer", Action.ADMIN);
+ }
+
+ @Override
public void preRemoveServers(final ObserverContext<MasterCoprocessorEnvironment> ctx,
Set<Address> servers) throws IOException {
requirePermission(ctx, "removeServers", Action.ADMIN);