HBASE-21553 schedLock not released in MasterProcedureScheduler
Signed-off-by: Andrew Purtell <apurtell@apache.org>
This commit is contained in:
parent
19c3663119
commit
bd33a1ef96
@ -743,31 +743,38 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet {
|
|||||||
* @return true if we were able to acquire the lock on the table, otherwise false.
|
* @return true if we were able to acquire the lock on the table, otherwise false.
|
||||||
*/
|
*/
|
||||||
public boolean tryAcquireTableExclusiveLock(final Procedure procedure, final TableName table) {
|
public boolean tryAcquireTableExclusiveLock(final Procedure procedure, final TableName table) {
|
||||||
schedLock.lock();
|
try {
|
||||||
TableQueue queue = getTableQueue(table);
|
|
||||||
if (!queue.getNamespaceQueue().trySharedLock()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!queue.tryExclusiveLock(procedure.getProcId())) {
|
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
|
||||||
schedLock.unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
removeFromRunQueue(tableRunQueue, queue);
|
|
||||||
schedLock.unlock();
|
|
||||||
|
|
||||||
// Zk lock is expensive...
|
|
||||||
boolean hasXLock = queue.tryZkExclusiveLock(lockManager, procedure.toString());
|
|
||||||
if (!hasXLock) {
|
|
||||||
schedLock.lock();
|
schedLock.lock();
|
||||||
queue.releaseExclusiveLock();
|
TableQueue queue = getTableQueue(table);
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
if (!queue.getNamespaceQueue().trySharedLock()) {
|
||||||
addToRunQueue(tableRunQueue, queue);
|
schedLock.unlock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!queue.tryExclusiveLock(procedure.getProcId())) {
|
||||||
|
queue.getNamespaceQueue().releaseSharedLock();
|
||||||
|
schedLock.unlock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeFromRunQueue(tableRunQueue, queue);
|
||||||
schedLock.unlock();
|
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
|
* @param table the name of the table that has the exclusive lock
|
||||||
*/
|
*/
|
||||||
public void releaseTableExclusiveLock(final Procedure procedure, final TableName table) {
|
public void releaseTableExclusiveLock(final Procedure procedure, final TableName table) {
|
||||||
schedLock.lock();
|
try {
|
||||||
TableQueue queue = getTableQueue(table);
|
schedLock.lock();
|
||||||
schedLock.unlock();
|
TableQueue queue = getTableQueue(table);
|
||||||
|
schedLock.unlock();
|
||||||
|
|
||||||
// Zk lock is expensive...
|
// Zk lock is expensive...
|
||||||
queue.releaseZkExclusiveLock(lockManager);
|
queue.releaseZkExclusiveLock(lockManager);
|
||||||
|
|
||||||
schedLock.lock();
|
schedLock.lock();
|
||||||
queue.releaseExclusiveLock();
|
queue.releaseExclusiveLock();
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
queue.getNamespaceQueue().releaseSharedLock();
|
||||||
addToRunQueue(tableRunQueue, queue);
|
addToRunQueue(tableRunQueue, queue);
|
||||||
schedLock.unlock();
|
schedLock.unlock();
|
||||||
|
} finally {
|
||||||
|
if(schedLock.isHeldByCurrentThread()) {
|
||||||
|
schedLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -803,29 +816,35 @@ public class MasterProcedureScheduler implements ProcedureRunnableSet {
|
|||||||
|
|
||||||
private TableQueue tryAcquireTableQueueSharedLock(final Procedure procedure,
|
private TableQueue tryAcquireTableQueueSharedLock(final Procedure procedure,
|
||||||
final TableName table) {
|
final TableName table) {
|
||||||
schedLock.lock();
|
try {
|
||||||
TableQueue queue = getTableQueue(table);
|
|
||||||
if (!queue.getNamespaceQueue().trySharedLock()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!queue.trySharedLock()) {
|
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
|
||||||
schedLock.unlock();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
schedLock.unlock();
|
|
||||||
|
|
||||||
// Zk lock is expensive...
|
|
||||||
if (!queue.tryZkSharedLock(lockManager, procedure.toString())) {
|
|
||||||
schedLock.lock();
|
schedLock.lock();
|
||||||
queue.releaseSharedLock();
|
TableQueue queue = getTableQueue(table);
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
if (!queue.getNamespaceQueue().trySharedLock()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!queue.trySharedLock()) {
|
||||||
|
queue.getNamespaceQueue().releaseSharedLock();
|
||||||
|
schedLock.unlock();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
schedLock.unlock();
|
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...
|
// Zk lock is expensive...
|
||||||
queue.releaseZkSharedLock(lockManager);
|
queue.releaseZkSharedLock(lockManager);
|
||||||
|
try {
|
||||||
schedLock.lock();
|
schedLock.lock();
|
||||||
queue.releaseSharedLock();
|
queue.releaseSharedLock();
|
||||||
queue.getNamespaceQueue().releaseSharedLock();
|
queue.getNamespaceQueue().releaseSharedLock();
|
||||||
schedLock.unlock();
|
schedLock.unlock();
|
||||||
|
} finally {
|
||||||
|
if(schedLock.isHeldByCurrentThread()) {
|
||||||
|
schedLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user