You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2017/01/04 07:39:44 UTC

[42/50] [abbrv] hbase git commit: HBASE-17336 get/update replication peer config requests should be routed through master

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)