You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2018/12/11 01:59:33 UTC

[2/2] hbase git commit: HBASE-21553 schedLock not released in MasterProcedureScheduler

HBASE-21553 schedLock not released in MasterProcedureScheduler

Signed-off-by: Andrew Purtell <ap...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/0b436547
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/0b436547
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/0b436547

Branch: refs/heads/branch-1.4
Commit: 0b436547183d9ca26cd1f5c77c29a501bcafff6f
Parents: fbc38d3
Author: xcang <xc...@salesforce.com>
Authored: Thu Dec 6 22:42:44 2018 -0800
Committer: Andrew Purtell <ap...@apache.org>
Committed: Mon Dec 10 17:57:15 2018 -0800

----------------------------------------------------------------------
 .../procedure/MasterProcedureScheduler.java     | 134 +++++++++++--------
 1 file changed, 79 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/0b436547/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java
----------------------------------------------------------------------
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 6367dec..df4cc86 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();
+      }
+    }
   }
 
   /**