From ee4a1e54855ea00163532f0a38e007181a3bd1d4 Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Fri, 5 Jan 2018 15:39:06 +0800 Subject: [PATCH] HBASE-19711 TestReplicationAdmin.testConcurrentPeerOperations hangs --- .../master/procedure/MasterProcedureScheduler.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java index 4ecb3b1..d2ef928 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java @@ -424,7 +424,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { } else if (proc instanceof PeerProcedureInterface) { PeerProcedureInterface iProcPeer = (PeerProcedureInterface) proc; if (iProcPeer.getPeerOperationType() == PeerOperationType.REMOVE) { - removePeerQueue(iProcPeer.getPeerId()); + markPeerAsRemoved(iProcPeer.getPeerId(), proc); } } else { // No cleanup for ServerProcedureInterface types, yet. @@ -514,6 +514,23 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { locking.removePeerLock(peerId); } + private void markPeerAsRemoved(String peerId, Procedure procedure) { + schedLock(); + try { + PeerQueue queue = AvlTree.get(peerMap, peerId, PEER_QUEUE_KEY_COMPARATOR); + if (queue == null) { + return; + } + + final LockAndQueue lock = locking.getPeerLock(peerId); + if (queue.isEmpty() && lock.tryExclusiveLock(procedure)) { + removeFromRunQueue(peerRunQueue, queue); + removePeerQueue(peerId); + } + } finally { + schedUnlock(); + } + } private static boolean isPeerProcedure(Procedure proc) { return proc instanceof PeerProcedureInterface; -- 1.9.1