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();
+ }
+ }
}
/**