[ 
https://issues.apache.org/jira/browse/HBASE-20975?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16577625#comment-16577625
 ] 

Allan Yang commented on HBASE-20975:
------------------------------------

rebasing, and trigger a run in branch-2.1.  We need to fix it in branch-2.1 
too, otherwise, there will be some strange log:
{code}
2018-08-08 23:40:59,010 WARN  [PEWorker-2] procedure2.ProcedureExecutor: 
Usually this should not happen, we will release the lock before if the 
procedure is finished, even if the holdLock is true, arri
ve here means we have some holes where we do not release the lock. And the 
releaseLock below may fail since the procedure may have already been deleted 
from the procedure store.
{code}


> Lock may not be taken or released 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.1.0, 2.0.1
>            Reporter: Allan Yang
>            Assignee: Allan Yang
>            Priority: Major
>         Attachments: HBASE-20975.branch-2.0.001.patch, 
> HBASE-20975.branch-2.0.002.patch, HBASE-20975.branch-2.0.003.patch, 
> HBASE-20975.branch-2.0.004.patch, HBASE-20975.branch-2.0.005.patch, 
> HBASE-20975.branch-2.1.001.patch
>
>
> 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. 
> Find another case that during rolling back, the procedure's lock may not be 
> released properly:
> see comment: 
> https://issues.apache.org/jira/browse/HBASE-20975?focusedCommentId=16565123&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16565123



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to