http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 0a000ee..f553e8f 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Master.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto @@ -885,6 +885,14 @@ service MasterService { rpc DisableReplicationPeer(DisableReplicationPeerRequest) returns(DisableReplicationPeerResponse); + /** Return peer config for a replication peer */ + rpc GetReplicationPeerConfig(GetReplicationPeerConfigRequest) + returns(GetReplicationPeerConfigResponse); + + /** Update peer config for a replication peer */ + rpc UpdateReplicationPeerConfig(UpdateReplicationPeerConfigRequest) + returns(UpdateReplicationPeerConfigResponse); + /** Returns a list of ServerNames marked as draining. */ rpc listDrainingRegionServers(ListDrainingRegionServersRequest) returns(ListDrainingRegionServersResponse);
http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 83633b3..05b6e59 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Replication.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Replication.proto @@ -54,3 +54,20 @@ message DisableReplicationPeerRequest { message DisableReplicationPeerResponse { } + +message GetReplicationPeerConfigRequest { + required string peer_id = 1; +} + +message GetReplicationPeerConfigResponse { + required string peer_id = 1; + required ReplicationPeer peer_config = 2; +} + +message UpdateReplicationPeerConfigRequest { + required string peer_id = 1; + required ReplicationPeer peer_config = 2; +} + +message UpdateReplicationPeerConfigResponse { +} http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 d3b3868..c42c7b7 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 @@ -1909,4 +1909,46 @@ public interface MasterObserver extends Coprocessor { default void postDisableReplicationPeer(final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId) throws IOException { } + + /** + * Called before get the configured ReplicationPeerConfig for the specified peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void preGetReplicationPeerConfig(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + } + + /** + * Called after get the configured ReplicationPeerConfig for the specified peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void postGetReplicationPeerConfig( + final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId) throws IOException { + } + + /** + * Called before update peerConfig for the specified peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void preUpdateReplicationPeerConfig( + final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId, + ReplicationPeerConfig peerConfig) throws IOException { + } + + /** + * Called after update peerConfig for the specified peer + * @param ctx + * @param peerId a short name that identifies the peer + * @throws IOException on failure + */ + default void postUpdateReplicationPeerConfig( + final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId, + ReplicationPeerConfig peerConfig) throws IOException { + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 ecaaa16..a87c38e 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 @@ -3198,6 +3198,33 @@ public class HMaster extends HRegionServer implements MasterServices { } @Override + public ReplicationPeerConfig getReplicationPeerConfig(String peerId) throws ReplicationException, + IOException { + if (cpHost != null) { + cpHost.preGetReplicationPeerConfig(peerId); + } + final ReplicationPeerConfig peerConfig = this.replicationManager.getPeerConfig(peerId); + if (cpHost != null) { + cpHost.postGetReplicationPeerConfig(peerId); + } + return peerConfig; + } + + @Override + public void updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig) + throws ReplicationException, IOException { + if (cpHost != null) { + cpHost.preUpdateReplicationPeerConfig(peerId, peerConfig); + } + LOG.info(getClientIdAuditPrefix() + " update replication peer config, id=" + peerId + + ", config=" + peerConfig); + this.replicationManager.updatePeerConfig(peerId, peerConfig); + if (cpHost != null) { + cpHost.postUpdateReplicationPeerConfig(peerId, peerConfig); + } + } + + @Override public void drainRegionServer(final ServerName server) { String parentZnode = getZooKeeper().znodePaths.drainingZNode; try { http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 0623f2b..4e3987e 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 @@ -1727,4 +1727,46 @@ public class MasterCoprocessorHost } }); } + + public void preGetReplicationPeerConfig(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.preGetReplicationPeerConfig(ctx, peerId); + } + }); + } + + public void postGetReplicationPeerConfig(final String peerId) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.postGetReplicationPeerConfig(ctx, peerId); + } + }); + } + + public void preUpdateReplicationPeerConfig(final String peerId, + final ReplicationPeerConfig peerConfig) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.preUpdateReplicationPeerConfig(ctx, peerId, peerConfig); + } + }); + } + + public void postUpdateReplicationPeerConfig(final String peerId, + final ReplicationPeerConfig peerConfig) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + @Override + public void call(MasterObserver observer, ObserverContext<MasterCoprocessorEnvironment> ctx) + throws IOException { + observer.postUpdateReplicationPeerConfig(ctx, peerId, peerConfig); + } + }); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 76da838..707cb39 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 @@ -93,10 +93,15 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.Disab 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.GetReplicationPeerConfigRequest; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigResponse; 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.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigRequest; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigResponse; import org.apache.hadoop.hbase.regionserver.RSRpcServices; import org.apache.hadoop.hbase.replication.ReplicationException; +import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.access.AccessController; import org.apache.hadoop.hbase.security.visibility.VisibilityController; @@ -1695,6 +1700,34 @@ public class MasterRpcServices extends RSRpcServices } @Override + public GetReplicationPeerConfigResponse getReplicationPeerConfig(RpcController controller, + GetReplicationPeerConfigRequest request) throws ServiceException { + GetReplicationPeerConfigResponse.Builder response = GetReplicationPeerConfigResponse + .newBuilder(); + try { + String peerId = request.getPeerId(); + ReplicationPeerConfig peerConfig = master.getReplicationPeerConfig(peerId); + response.setPeerId(peerId); + response.setPeerConfig(ReplicationSerDeHelper.convert(peerConfig)); + } catch (ReplicationException | IOException e) { + throw new ServiceException(e); + } + return response.build(); + } + + @Override + public UpdateReplicationPeerConfigResponse updateReplicationPeerConfig(RpcController controller, + UpdateReplicationPeerConfigRequest request) throws ServiceException { + try { + master.updateReplicationPeerConfig(request.getPeerId(), + ReplicationSerDeHelper.convert(request.getPeerConfig())); + return UpdateReplicationPeerConfigResponse.newBuilder().build(); + } catch (ReplicationException | IOException e) { + throw new ServiceException(e); + } + } + + @Override public ListDrainingRegionServersResponse listDrainingRegionServers(RpcController controller, ListDrainingRegionServersRequest request) throws ServiceException { ListDrainingRegionServersResponse.Builder response = http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 869e7ac..7686fc8 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 @@ -446,6 +446,22 @@ public interface MasterServices extends Server { void disableReplicationPeer(String peerId) throws ReplicationException, IOException; /** + * Returns the configured ReplicationPeerConfig for the specified peer + * @param peerId a short name that identifies the peer + * @return ReplicationPeerConfig for the peer + */ + ReplicationPeerConfig getReplicationPeerConfig(String peerId) throws ReplicationException, + IOException; + + /** + * Update the peerConfig for the specified peer + * @param peerId a short name that identifies the peer + * @param peerConfig new config for the peer + */ + void updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig) + throws ReplicationException, IOException; + + /** * Mark a region server as draining to prevent additional regions from getting assigned to it. * @param server Region servers to drain. */ http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 8c13718..f00730d 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 @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Abortable; +import org.apache.hadoop.hbase.ReplicationPeerNotFoundException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.replication.ReplicationException; @@ -66,11 +67,13 @@ public class ReplicationManager { throws ReplicationException { checkNamespacesAndTableCfsConfigConflict(peerConfig.getNamespaces(), peerConfig.getTableCFsMap()); - this.replicationPeers.registerPeer(peerId, peerConfig); + replicationPeers.registerPeer(peerId, peerConfig); + replicationPeers.peerConnected(peerId); } public void removeReplicationPeer(String peerId) throws ReplicationException { - this.replicationPeers.unregisterPeer(peerId); + replicationPeers.peerDisconnected(peerId); + replicationPeers.unregisterPeer(peerId); } public void enableReplicationPeer(String peerId) throws ReplicationException { @@ -81,6 +84,22 @@ public class ReplicationManager { this.replicationPeers.disablePeer(peerId); } + public ReplicationPeerConfig getPeerConfig(String peerId) throws ReplicationException, + ReplicationPeerNotFoundException { + ReplicationPeerConfig peerConfig = replicationPeers.getReplicationPeerConfig(peerId); + if (peerConfig == null) { + throw new ReplicationPeerNotFoundException(peerId); + } + return peerConfig; + } + + public void updatePeerConfig(String peerId, ReplicationPeerConfig peerConfig) + throws ReplicationException { + checkNamespacesAndTableCfsConfigConflict(peerConfig.getNamespaces(), + peerConfig.getTableCFsMap()); + this.replicationPeers.updatePeerConfig(peerId, peerConfig); + } + /** * 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/0e486656/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 eaa0611..0564ece 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 @@ -2720,4 +2720,17 @@ public class AccessController extends BaseMasterAndRegionObserver String peerId) throws IOException { requirePermission(getActiveUser(ctx), "disableReplicationPeer", Action.ADMIN); } + + @Override + public void preGetReplicationPeerConfig(final ObserverContext<MasterCoprocessorEnvironment> ctx, + String peerId) throws IOException { + requirePermission(getActiveUser(ctx), "getReplicationPeerConfig", Action.ADMIN); + } + + @Override + public void preUpdateReplicationPeerConfig( + final ObserverContext<MasterCoprocessorEnvironment> ctx, String peerId, + ReplicationPeerConfig peerConfig) throws IOException { + requirePermission(getActiveUser(ctx), "updateReplicationPeerConfig", Action.ADMIN); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java index 0655a0f..9ecc9eb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java @@ -20,14 +20,18 @@ package org.apache.hadoop.hbase.util; import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.ReplicationPeerNotFoundException; import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.client.replication.ReplicationAdmin; import org.apache.hadoop.hbase.io.HFileLink; import org.apache.hadoop.hbase.io.Reference; +import org.apache.hadoop.hbase.quotas.MasterQuotaManager; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.StoreFileInfo; import org.apache.hadoop.hbase.replication.ReplicationException; @@ -40,6 +44,8 @@ import org.apache.hadoop.hbase.zookeeper.ZKConfig; */ public class ServerRegionReplicaUtil extends RegionReplicaUtil { + private static final Log LOG = LogFactory.getLog(ServerRegionReplicaUtil.class); + /** * Whether asynchronous WAL replication to the secondary region replicas is enabled or not. * If this is enabled, a replication peer named "region_replica_replication" will be created @@ -143,9 +149,18 @@ public class ServerRegionReplicaUtil extends RegionReplicaUtil { return; } ReplicationAdmin repAdmin = new ReplicationAdmin(conf); + ReplicationPeerConfig peerConfig = null; + try { + peerConfig = repAdmin.getPeerConfig(REGION_REPLICA_REPLICATION_PEER); + } catch (ReplicationPeerNotFoundException e) { + LOG.warn("Region replica replication peer id=" + REGION_REPLICA_REPLICATION_PEER + + " not exist", e); + } try { - if (repAdmin.getPeerConfig(REGION_REPLICA_REPLICATION_PEER) == null) { - ReplicationPeerConfig peerConfig = new ReplicationPeerConfig(); + if (peerConfig == null) { + LOG.info("Region replica replication peer id=" + REGION_REPLICA_REPLICATION_PEER + + " not exist. Creating..."); + peerConfig = new ReplicationPeerConfig(); peerConfig.setClusterKey(ZKConfig.getZooKeeperClusterKey(conf)); peerConfig.setReplicationEndpointImpl(RegionReplicaReplicationEndpoint.class.getName()); repAdmin.addPeer(REGION_REPLICA_REPLICATION_PEER, peerConfig, null); http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java index 10c73a6..15d5150 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.client.replication; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -448,7 +449,7 @@ public class TestReplicationAdmin { admin.updatePeerConfig(ID_ONE, rpc); fail("Should throw ReplicationException, because table " + tab1 + " conflict with namespace " + ns1); - } catch (ReplicationException e) { + } catch (IOException e) { // OK } @@ -465,7 +466,7 @@ public class TestReplicationAdmin { admin.updatePeerConfig(ID_ONE, rpc); fail("Should throw ReplicationException, because namespace " + ns2 + " conflict with table " + tab2); - } catch (ReplicationException e) { + } catch (IOException e) { // OK } http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 2a5be12..36dc2e2 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 @@ -414,4 +414,15 @@ public class MockNoopMasterServices implements MasterServices, Server { public void removeDrainFromRegionServer(ServerName servers) { return; } + + @Override + public ReplicationPeerConfig getReplicationPeerConfig(String peerId) throws ReplicationException, + IOException { + return null; + } + + @Override + public void updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig) + throws ReplicationException, IOException { + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpoint.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpoint.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpoint.java index 5147339..11df7e0 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpoint.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpoint.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.ReplicationPeerNotFoundException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.Waiter; import org.apache.hadoop.hbase.client.ClusterConnection; @@ -111,14 +112,27 @@ public class TestRegionReplicaReplicationEndpoint { ReplicationAdmin admin = new ReplicationAdmin(HTU.getConfiguration()); String peerId = "region_replica_replication"; - if (admin.getPeerConfig(peerId) != null) { + ReplicationPeerConfig peerConfig = null; + try { + peerConfig = admin.getPeerConfig(peerId); + } catch (ReplicationPeerNotFoundException e) { + LOG.warn("Region replica replication peer id=" + peerId + " not exist", e); + } + + if (peerConfig != null) { admin.removePeer(peerId); + peerConfig = null; } HTableDescriptor htd = HTU.createTableDescriptor( "testReplicationPeerIsCreated_no_region_replicas"); HTU.getHBaseAdmin().createTable(htd); - ReplicationPeerConfig peerConfig = admin.getPeerConfig(peerId); + try { + peerConfig = admin.getPeerConfig(peerId); + fail("Should throw ReplicationException, because replication peer id=" + peerId + + " not exist"); + } catch (ReplicationPeerNotFoundException e) { + } assertNull(peerConfig); htd = HTU.createTableDescriptor("testReplicationPeerIsCreated"); @@ -142,8 +156,16 @@ public class TestRegionReplicaReplicationEndpoint { ReplicationAdmin admin = new ReplicationAdmin(HTU.getConfiguration()); String peerId = "region_replica_replication"; - if (admin.getPeerConfig(peerId) != null) { + ReplicationPeerConfig peerConfig = null; + try { + peerConfig = admin.getPeerConfig(peerId); + } catch (ReplicationPeerNotFoundException e) { + LOG.warn("Region replica replication peer id=" + peerId + " not exist", e); + } + + if (peerConfig != null) { admin.removePeer(peerId); + peerConfig = null; } HTableDescriptor htd @@ -151,7 +173,12 @@ public class TestRegionReplicaReplicationEndpoint { HTU.getHBaseAdmin().createTable(htd); // assert that replication peer is not created yet - ReplicationPeerConfig peerConfig = admin.getPeerConfig(peerId); + try { + peerConfig = admin.getPeerConfig(peerId); + fail("Should throw ReplicationException, because replication peer id=" + peerId + + " not exist"); + } catch (ReplicationPeerNotFoundException e) { + } assertNull(peerConfig); HTU.getHBaseAdmin().disableTable(htd.getTableName()); http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 956eadf..7107669 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 @@ -113,6 +113,7 @@ import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost; import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost; import org.apache.hadoop.hbase.regionserver.ScanType; +import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; import org.apache.hadoop.hbase.security.Superusers; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.access.Permission.Action; @@ -2930,4 +2931,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 testGetReplicationPeerConfig() throws Exception { + AccessTestAction action = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preGetReplicationPeerConfig( + 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 testUpdateReplicationPeerConfig() throws Exception { + AccessTestAction action = new AccessTestAction() { + @Override + public Object run() throws Exception { + ACCESS_CONTROLLER.preUpdateReplicationPeerConfig( + ObserverContext.createAndPrepare(CP_ENV, null), "test", new ReplicationPeerConfig()); + 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/0e486656/hbase-shell/src/main/ruby/hbase/replication_admin.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/hbase/replication_admin.rb b/hbase-shell/src/main/ruby/hbase/replication_admin.rb index 5fd23d3..3c94db2 100644 --- a/hbase-shell/src/main/ruby/hbase/replication_admin.rb +++ b/hbase-shell/src/main/ruby/hbase/replication_admin.rb @@ -293,7 +293,7 @@ module Hbase data = args.fetch(DATA, nil) # Create and populate a ReplicationPeerConfig - replication_peer_config = ReplicationPeerConfig.new + replication_peer_config = get_peer_config(id) unless config.nil? replication_peer_config.get_configuration.put_all(config) end http://git-wip-us.apache.org/repos/asf/hbase/blob/0e486656/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 afe7b57..e902618 100644 --- a/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc +++ b/src/main/asciidoc/_chapters/appendix_acl_matrix.adoc @@ -120,6 +120,8 @@ In case the table goes out of date, the unit tests which check for accuracy of p | | removeReplicationPeer | superuser\|global(A) | | enableReplicationPeer | superuser\|global(A) | | disableReplicationPeer | superuser\|global(A) +| | getReplicationPeerConfig | superuser\|global(A) +| | updateReplicationPeerConfig | superuser\|global(A) | Region | openRegion | superuser\|global(A) | | closeRegion | superuser\|global(A) | | flush | superuser\|global(A)\|global\(C)\|TableOwner\|table(A)\|table\(C)