http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-protocol-shaded/src/main/protobuf/Master.proto ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/protobuf/Master.proto b/hbase-protocol-shaded/src/main/protobuf/Master.proto index 384ac67..f4e7da6 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Master.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto @@ -855,4 +855,12 @@ service MasterService { /** Remove a replication peer */ rpc RemoveReplicationPeer(RemoveReplicationPeerRequest) returns(RemoveReplicationPeerResponse); + + /** Enable a replication peer */ + rpc EnableReplicationPeer(EnableReplicationPeerRequest) + returns(EnableReplicationPeerResponse); + + /** Disable a replication peer */ + rpc DisableReplicationPeer(DisableReplicationPeerRequest) + returns(DisableReplicationPeerResponse); }
http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-protocol-shaded/src/main/protobuf/Replication.proto ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/protobuf/Replication.proto b/hbase-protocol-shaded/src/main/protobuf/Replication.proto index 0bdf2c0..83633b3 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Replication.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Replication.proto @@ -40,3 +40,17 @@ message RemoveReplicationPeerRequest { message RemoveReplicationPeerResponse { } + +message EnableReplicationPeerRequest { + required string peer_id = 1; +} + +message EnableReplicationPeerResponse { +} + +message DisableReplicationPeerRequest { + required string peer_id = 1; +} + +message DisableReplicationPeerResponse { +} http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/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 5067b3b..d3b3868 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 @@ -1869,4 +1869,44 @@ public interface MasterObserver extends Coprocessor { default void postRemoveReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId) throws IOException { } + + /** + * Called before enable a replication peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void preEnableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + } + + /** + * Called after enable a replication peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void postEnableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + } + + /** + * Called before disable a replication peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void preDisableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + } + + /** + * Called after disable a replication peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void postDisableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index da35da1..6b135d9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -3172,4 +3172,28 @@ public class HMaster extends HRegionServer implements MasterServices { cpHost.postRemoveReplicationPeer(peerId); } } + + @Override + public void enableReplicationPeer(String peerId) throws ReplicationException, IOException { + if (cpHost != null) { + cpHost.preEnableReplicationPeer(peerId); + } + LOG.info(getClientIdAuditPrefix() + " enable replication peer, id=" + peerId); + this.replicationManager.enableReplicationPeer(peerId); + if (cpHost != null) { + cpHost.postEnableReplicationPeer(peerId); + } + } + + @Override + public void disableReplicationPeer(String peerId) throws ReplicationException, IOException { + if (cpHost != null) { + cpHost.preDisableReplicationPeer(peerId); + } + LOG.info(getClientIdAuditPrefix() + " disable replication peer, id=" + peerId); + this.replicationManager.disableReplicationPeer(peerId); + if (cpHost != null) { + cpHost.postDisableReplicationPeer(peerId); + } + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/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 97fbe67..0623f2b 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 @@ -1687,4 +1687,44 @@ public class MasterCoprocessorHost } }); } + + public void preEnableReplicationPeer(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.preEnableReplicationPeer(ctx, peerId); + } + }); + } + + public void postEnableReplicationPeer(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.postEnableReplicationPeer(ctx, peerId); + } + }); + } + + public void preDisableReplicationPeer(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.preDisableReplicationPeer(ctx, peerId); + } + }); + } + + public void postDisableReplicationPeer(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.postDisableReplicationPeer(ctx, peerId); + } + }); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index afd807c..8ee72c6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -89,6 +89,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProto import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.SplitTableRegionResponse; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerResponse; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerRequest; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerResponse; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerRequest; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerResponse; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerResponse; import org.apache.hadoop.hbase.regionserver.RSRpcServices; @@ -1667,4 +1671,26 @@ public class MasterRpcServices extends RSRpcServices throw new ServiceException(e); } } + + @Override + public EnableReplicationPeerResponse enableReplicationPeer(RpcController controller, + EnableReplicationPeerRequest request) throws ServiceException { + try { + master.enableReplicationPeer(request.getPeerId()); + return EnableReplicationPeerResponse.newBuilder().build(); + } catch (ReplicationException | IOException e) { + throw new ServiceException(e); + } + } + + @Override + public DisableReplicationPeerResponse disableReplicationPeer(RpcController controller, + DisableReplicationPeerRequest request) throws ServiceException { + try { + master.disableReplicationPeer(request.getPeerId()); + return DisableReplicationPeerResponse.newBuilder().build(); + } catch (ReplicationException | IOException e) { + throw new ServiceException(e); + } + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java index 5fc9d16..a7395bb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java @@ -431,4 +431,16 @@ public interface MasterServices extends Server { * @param peerId a short name that identifies the peer */ void removeReplicationPeer(String peerId) throws ReplicationException, IOException; + + /** + * Restart the replication stream to the specified peer + * @param peerId a short name that identifies the peer + */ + void enableReplicationPeer(String peerId) throws ReplicationException, IOException; + + /** + * Stop the replication stream to the specified peer + * @param peerId a short name that identifies the peer + */ + void disableReplicationPeer(String peerId) throws ReplicationException, IOException; } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java index 748f7af..8c13718 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java @@ -73,6 +73,14 @@ public class ReplicationManager { this.replicationPeers.unregisterPeer(peerId); } + public void enableReplicationPeer(String peerId) throws ReplicationException { + this.replicationPeers.enablePeer(peerId); + } + + public void disableReplicationPeer(String peerId) throws ReplicationException { + this.replicationPeers.disablePeer(peerId); + } + /** * Set a namespace in the peer config means that all tables in this namespace * will be replicated to the peer cluster. http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/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 0452883..eaa0611 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 @@ -2708,4 +2708,16 @@ public class AccessController extends BaseMasterAndRegionObserver String peerId) throws IOException { requirePermission(getActiveUser(ctx), "removeReplicationPeer", Action.ADMIN); } + + @Override + public void preEnableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + requirePermission(getActiveUser(ctx), "enableReplicationPeer", Action.ADMIN); + } + + @Override + public void preDisableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + requirePermission(getActiveUser(ctx), "disableReplicationPeer", Action.ADMIN); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java index 55138a0..4e85d29 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java @@ -391,4 +391,12 @@ public class MockNoopMasterServices implements MasterServices, Server { @Override public void removeReplicationPeer(String peerId) throws ReplicationException { } + + @Override + public void enableReplicationPeer(String peerId) throws ReplicationException, IOException { + } + + @Override + public void disableReplicationPeer(String peerId) throws ReplicationException, IOException { + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java index a0f6f29..956eadf 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java @@ -2900,4 +2900,34 @@ public class TestAccessController extends SecureTestUtil { verifyAllowed(action, SUPERUSER, USER_ADMIN); verifyDenied(action, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); } + + @Test + public void testEnableReplicationPeer() throws Exception { + AccessTestAction action = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preEnableReplicationPeer(ObserverContext.createAndPrepare(CP_ENV, null), + "test"); + return null; + } + }; + + verifyAllowed(action, SUPERUSER, USER_ADMIN); + verifyDenied(action, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } + + @Test + public void testDisableReplicationPeer() throws Exception { + AccessTestAction action = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preDisableReplicationPeer(ObserverContext.createAndPrepare(CP_ENV, null), + "test"); + return null; + } + }; + + verifyAllowed(action, SUPERUSER, USER_ADMIN); + verifyDenied(action, USER_CREATE, USER_RW, USER_RO, USER_NONE, USER_OWNER); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/b3f2bec0/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc ---------------------------------------------------------------------- diff --git a/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc b/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc index a71d916..afe7b57 100644 --- a/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc +++ b/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc @@ -118,6 +118,8 @@ In case the table goes out of date, the unit tests which check for accuracy of p | | setNamespaceQuota | superuser\|global(A) | | addReplicationPeer | superuser\|global(A) | | removeReplicationPeer | superuser\|global(A) +| | enableReplicationPeer | superuser\|global(A) +| | disableReplicationPeer | superuser\|global(A) | Region | openRegion | superuser\|global(A) | | closeRegion | superuser\|global(A) | | flush | superuser\|global(A)\|global\(C)\|TableOwner\|table(A)\|table\(C)
