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)