HBASE-20975 Lock may not be taken or released while rolling back procedure
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/a07e7556 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/a07e7556 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/a07e7556 Branch: refs/heads/HBASE-20387 Commit: a07e755625382d3904c935c21a4f240ede6d2f43 Parents: 21e0281 Author: Allan Yang <[email protected]> Authored: Mon Aug 13 20:23:04 2018 +0800 Committer: Allan Yang <[email protected]> Committed: Mon Aug 13 20:23:04 2018 +0800 ---------------------------------------------------------------------- .../hadoop/hbase/procedure2/ProcedureExecutor.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/a07e7556/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java index 2ee80d7..464eaeb 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java @@ -1363,29 +1363,21 @@ public class ProcedureExecutor<TEnvironment> { assert subprocStack != null : "Called rollback with no steps executed rootProc=" + rootProc; int stackTail = subprocStack.size(); - boolean reuseLock = false; - while (stackTail --> 0) { + while (stackTail-- > 0) { Procedure<TEnvironment> proc = subprocStack.get(stackTail); - LockState lockState; - if (!reuseLock && (lockState = acquireLock(proc)) != LockState.LOCK_ACQUIRED) { + LockState lockState = acquireLock(proc); + if (lockState != LockState.LOCK_ACQUIRED) { // can't take a lock on the procedure, add the root-proc back on the // queue waiting for the lock availability return lockState; } lockState = executeRollback(proc); + releaseLock(proc, false); boolean abortRollback = lockState != LockState.LOCK_ACQUIRED; abortRollback |= !isRunning() || !store.isRunning(); - // If the next procedure is the same to this one - // (e.g. StateMachineProcedure reuse the same instance) - // we can avoid to lock/unlock each step - reuseLock = stackTail > 0 && (subprocStack.get(stackTail - 1) == proc) && !abortRollback; - if (!reuseLock && proc.hasLock()) { - releaseLock(proc, false); - } - // allows to kill the executor before something is stored to the wal. // useful to test the procedure recovery. if (abortRollback) {
