From 87cfc181027af63c03aa7ffa1c87eaf592c06fc8 Mon Sep 17 00:00:00 2001 From: xcang Date: Thu, 6 Dec 2018 22:42:44 -0800 Subject: [PATCH] HBASE-21553 Making sure schedLock is unlocked --- .../master/procedure/MasterProcedureScheduler.java | 134 ++++++++++++--------- 1 file changed, 79 insertions(+), 55 deletions(-) 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 6367dec0d7..df4cc86a2d 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 @@ -743,31 +743,38 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet { * @return true if we were able to acquire the lock on the table, otherwise false. */ public boolean tryAcquireTableExclusiveLock(final Procedure procedure, final TableName table) { - schedLock.lock(); - TableQueue queue = getTableQueue(table); - if (!queue.getNamespaceQueue().trySharedLock()) { - return false; - } - - if (!queue.tryExclusiveLock(procedure.getProcId())) { - queue.getNamespaceQueue().releaseSharedLock(); - schedLock.unlock(); - return false; - } + try { + schedLock.lock(); + TableQueue queue = getTableQueue(table); + if (!queue.getNamespaceQueue().trySharedLock()) { + schedLock.unlock(); + return false; + } - removeFromRunQueue(tableRunQueue, queue); - schedLock.unlock(); + if (!queue.tryExclusiveLock(procedure.getProcId())) { + queue.getNamespaceQueue().releaseSharedLock(); + schedLock.unlock(); + return false; + } - // Zk lock is expensive... - boolean hasXLock = queue.tryZkExclusiveLock(lockManager, procedure.toString()); - if (!hasXLock) { - schedLock.lock(); - queue.releaseExclusiveLock(); - queue.getNamespaceQueue().releaseSharedLock(); - addToRunQueue(tableRunQueue, queue); + removeFromRunQueue(tableRunQueue, queue); schedLock.unlock(); + + // Zk lock is expensive... + boolean hasXLock = queue.tryZkExclusiveLock(lockManager, procedure.toString()); + if (!hasXLock) { + schedLock.lock(); + queue.releaseExclusiveLock(); + queue.getNamespaceQueue().releaseSharedLock(); + addToRunQueue(tableRunQueue, queue); + schedLock.unlock(); + } + return hasXLock; + } finally { + if(schedLock.isHeldByCurrentThread()){ + schedLock.unlock(); + } } - return hasXLock; } /** @@ -776,18 +783,24 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet { * @param table the name of the table that has the exclusive lock */ public void releaseTableExclusiveLock(final Procedure procedure, final TableName table) { - schedLock.lock(); - TableQueue queue = getTableQueue(table); - schedLock.unlock(); + try { + schedLock.lock(); + TableQueue queue = getTableQueue(table); + schedLock.unlock(); - // Zk lock is expensive... - queue.releaseZkExclusiveLock(lockManager); + // Zk lock is expensive... + queue.releaseZkExclusiveLock(lockManager); - schedLock.lock(); - queue.releaseExclusiveLock(); - queue.getNamespaceQueue().releaseSharedLock(); - addToRunQueue(tableRunQueue, queue); - schedLock.unlock(); + schedLock.lock(); + queue.releaseExclusiveLock(); + queue.getNamespaceQueue().releaseSharedLock(); + addToRunQueue(tableRunQueue, queue); + schedLock.unlock(); + } finally { + if(schedLock.isHeldByCurrentThread()) { + schedLock.unlock(); + } + } } /** @@ -803,29 +816,35 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet { private TableQueue tryAcquireTableQueueSharedLock(final Procedure procedure, final TableName table) { - schedLock.lock(); - TableQueue queue = getTableQueue(table); - if (!queue.getNamespaceQueue().trySharedLock()) { - return null; - } - - if (!queue.trySharedLock()) { - queue.getNamespaceQueue().releaseSharedLock(); - schedLock.unlock(); - return null; - } + try { + schedLock.lock(); + TableQueue queue = getTableQueue(table); + if (!queue.getNamespaceQueue().trySharedLock()) { + return null; + } - schedLock.unlock(); + if (!queue.trySharedLock()) { + queue.getNamespaceQueue().releaseSharedLock(); + schedLock.unlock(); + return null; + } - // Zk lock is expensive... - if (!queue.tryZkSharedLock(lockManager, procedure.toString())) { - schedLock.lock(); - queue.releaseSharedLock(); - queue.getNamespaceQueue().releaseSharedLock(); schedLock.unlock(); - return null; + + // Zk lock is expensive... + if (!queue.tryZkSharedLock(lockManager, procedure.toString())) { + schedLock.lock(); + queue.releaseSharedLock(); + queue.getNamespaceQueue().releaseSharedLock(); + schedLock.unlock(); + return null; + } + return queue; + } finally { + if(schedLock.isHeldByCurrentThread()) { + schedLock.unlock(); + } } - return queue; } /** @@ -838,11 +857,16 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet { // Zk lock is expensive... queue.releaseZkSharedLock(lockManager); - - schedLock.lock(); - queue.releaseSharedLock(); - queue.getNamespaceQueue().releaseSharedLock(); - schedLock.unlock(); + try { + schedLock.lock(); + queue.releaseSharedLock(); + queue.getNamespaceQueue().releaseSharedLock(); + schedLock.unlock(); + } finally { + if(schedLock.isHeldByCurrentThread()) { + schedLock.unlock(); + } + } } /** -- 2.15.1 (Apple Git-101)