From 31f82a9769ebd16c64721dbb76292bf27b61e6a8 Mon Sep 17 00:00:00 2001 From: zhangduo Date: Tue, 2 Jan 2018 12:02:17 +0800 Subject: [PATCH] HBASE-19686 Use KeyLocker instead of ReentrantLock in PeerProcedureHandlerImpl --- .../regionserver/PeerProcedureHandlerImpl.java | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/PeerProcedureHandlerImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/PeerProcedureHandlerImpl.java index 1efe180..72213ef 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/PeerProcedureHandlerImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/PeerProcedureHandlerImpl.java @@ -19,10 +19,10 @@ package org.apache.hadoop.hbase.replication.regionserver; import java.io.IOException; -import java.util.concurrent.locks.ReentrantLock; - +import java.util.concurrent.locks.Lock; import org.apache.hadoop.hbase.replication.ReplicationException; import org.apache.hadoop.hbase.replication.ReplicationPeer.PeerState; +import org.apache.hadoop.hbase.util.KeyLocker; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +32,7 @@ public class PeerProcedureHandlerImpl implements PeerProcedureHandler { private static final Logger LOG = LoggerFactory.getLogger(PeerProcedureHandlerImpl.class); private final ReplicationSourceManager replicationSourceManager; - private final ReentrantLock peersLock = new ReentrantLock(); + private final KeyLocker peersLock = new KeyLocker<>(); public PeerProcedureHandlerImpl(ReplicationSourceManager replicationSourceManager) { this.replicationSourceManager = replicationSourceManager; @@ -40,40 +40,62 @@ public class PeerProcedureHandlerImpl implements PeerProcedureHandler { @Override public void addPeer(String peerId) throws ReplicationException, IOException { - peersLock.lock(); + Lock peerLock = peersLock.acquireLock(peerId); + peerLock.lock(); try { replicationSourceManager.addPeer(peerId); } finally { - peersLock.unlock(); + peerLock.unlock(); } } @Override public void removePeer(String peerId) throws ReplicationException, IOException { - peersLock.lock(); + Lock peerLock = peersLock.acquireLock(peerId); + peerLock.lock(); try { if (replicationSourceManager.getReplicationPeers().getPeer(peerId) != null) { replicationSourceManager.removePeer(peerId); } } finally { - peersLock.unlock(); + peerLock.unlock(); } } @Override public void disablePeer(String peerId) throws ReplicationException, IOException { - PeerState newState = replicationSourceManager.getReplicationPeers().refreshPeerState(peerId); - LOG.info("disable replication peer, id: " + peerId + ", new state: " + newState); + PeerState newState; + Lock peerLock = peersLock.acquireLock(peerId); + peerLock.lock(); + try { + newState = replicationSourceManager.getReplicationPeers().refreshPeerState(peerId); + } finally { + peerLock.unlock(); + } + LOG.info("disable replication peer, id: {}, new state: {}", peerId, newState); } @Override public void enablePeer(String peerId) throws ReplicationException, IOException { - PeerState newState = replicationSourceManager.getReplicationPeers().refreshPeerState(peerId); - LOG.info("enable replication peer, id: " + peerId + ", new state: " + newState); + PeerState newState; + Lock peerLock = peersLock.acquireLock(peerId); + peerLock.lock(); + try { + newState = replicationSourceManager.getReplicationPeers().refreshPeerState(peerId); + } finally { + peerLock.unlock(); + } + LOG.info("enable replication peer, id: {}, new state: {}", peerId, newState); } @Override public void updatePeerConfig(String peerId) throws ReplicationException, IOException { - replicationSourceManager.getReplicationPeers().refreshPeerConfig(peerId); + Lock peerLock = peersLock.acquireLock(peerId); + peerLock.lock(); + try { + replicationSourceManager.getReplicationPeers().refreshPeerConfig(peerId); + } finally { + peerLock.unlock(); + } } } -- 2.7.4