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 02:24:55 UTC

hbase git commit: HBASE-21553 schedLock not released in MasterProcedureScheduler

Repository: hbase
Updated Branches:
  refs/heads/branch-1.3 d27c835b1 -> b9adb955c


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/b9adb955
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/b9adb955
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/b9adb955

Branch: refs/heads/branch-1.3
Commit: b9adb955cde19746219b3efd8500c7ba7239ae56
Parents: d27c835
Author: xcang <xc...@salesforce.com>
Authored: Thu Dec 6 22:42:44 2018 -0800
Committer: Andrew Purtell <ap...@apache.org>
Committed: Mon Dec 10 18:24:45 2018 -0800

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


http://git-wip-us.apache.org/repos/asf/hbase/blob/b9adb955/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 5f37720..0943d52 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
@@ -741,31 +741,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;
   }
 
   /**
@@ -774,18 +781,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();
+      }
+    }
   }
 
   /**
@@ -801,29 +814,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;
   }
 
   /**
@@ -836,11 +855,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();
+      }
+    }
   }
 
   /**