You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Allan Yang (JIRA)" <ji...@apache.org> on 2018/07/30 07:57:00 UTC
[jira] [Created] (HBASE-20975) Lock may not be taken while rolling
back procedure
Allan Yang created HBASE-20975:
----------------------------------
Summary: Lock may not be taken while rolling back procedure
Key: HBASE-20975
URL: https://issues.apache.org/jira/browse/HBASE-20975
Project: HBase
Issue Type: Sub-task
Components: amv2
Affects Versions: 2.0.1, 2.1.0
Reporter: Allan Yang
Assignee: Allan Yang
Find this one when investigating HBASE-20921, too.
Here is some code from executeRollback in ProcedureExecutor.java.
{code}
boolean reuseLock = false;
while (stackTail --> 0) {
final Procedure proc = subprocStack.get(stackTail);
LockState lockState;
//If reuseLock, then don't acquire the lock
if (!reuseLock && (lockState = acquireLock(proc)) != LockState.LOCK_ACQUIRED) {
return lockState;
}
lockState = executeRollback(proc);
boolean abortRollback = lockState != LockState.LOCK_ACQUIRED;
abortRollback |= !isRunning() || !store.isRunning();
//If the next procedure in the stack is the current one, then reuseLock = true
reuseLock = stackTail > 0 && (subprocStack.get(stackTail - 1) == proc) && !abortRollback;
//If reuseLock, don't releaseLock
if (!reuseLock) {
releaseLock(proc, false);
}
if (abortRollback) {
return lockState;
}
subprocStack.remove(stackTail);
if (proc.isYieldAfterExecutionStep(getEnvironment())) {
return LockState.LOCK_YIELD_WAIT;
}
//But, here, lock is released no matter reuseLock is true or false
if (proc != rootProc) {
execCompletionCleanup(proc);
}
}
{code}
You can see my comments in the code above, reuseLock can cause the procedure executing(rollback) without a lock. Though I haven't found any bugs introduced by this issue, it is indeed a potential bug need to fix.
I think we can just remove the reuseLock logic. Acquire and release lock every time.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)