Repository: hbase
Updated Branches:
  refs/heads/master 614612a9d -> 66469733e


HBASE-21384 Procedure with holdlock=false should not be restored lock when 
restarts


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/66469733
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/66469733
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/66469733

Branch: refs/heads/master
Commit: 66469733ec9bffb236c143b858e5748182ad71b3
Parents: 614612a
Author: Allan Yang <allan...@apache.org>
Authored: Thu Oct 25 14:23:36 2018 +0800
Committer: Allan Yang <allan...@apache.org>
Committed: Thu Oct 25 14:23:36 2018 +0800

----------------------------------------------------------------------
 .../apache/hadoop/hbase/procedure2/LockAndQueue.java |  3 ++-
 .../apache/hadoop/hbase/procedure2/Procedure.java    |  8 +++++++-
 .../hadoop/hbase/procedure2/ProcedureExecutor.java   | 15 ++++++++++++++-
 3 files changed, 23 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/66469733/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/LockAndQueue.java
----------------------------------------------------------------------
diff --git 
a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/LockAndQueue.java
 
b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/LockAndQueue.java
index ae8daa2..4365a2c 100644
--- 
a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/LockAndQueue.java
+++ 
b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/LockAndQueue.java
@@ -73,7 +73,8 @@ public class LockAndQueue implements LockStatus {
 
   @Override
   public boolean hasParentLock(Procedure<?> proc) {
-    // TODO: need to check all the ancestors
+    // TODO: need to check all the ancestors. need to passed in the procedures
+    // to find the ancestors.
     return proc.hasParent() &&
       (isLockOwner(proc.getParentProcId()) || 
isLockOwner(proc.getRootProcId()));
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/66469733/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
----------------------------------------------------------------------
diff --git 
a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
 
b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
index 81073e1..a85ccb1 100644
--- 
a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
+++ 
b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
@@ -987,7 +987,13 @@ public abstract class Procedure<TEnvironment> implements 
Comparable<Procedure<TE
       LOG.debug("{} is already bypassed, skip acquiring lock.", this);
       return;
     }
-
+    // this can happen if the parent stores the sub procedures but before it 
can
+    // release its lock, the master restarts
+    if (getState() == ProcedureState.WAITING && !holdLock(env)) {
+      LOG.debug("{} is in WAITING STATE, and holdLock= false, skip acquiring 
lock.", this);
+      lockedWhenLoading = false;
+      return;
+    }
     LOG.debug("{} held the lock before restarting, call acquireLock to restore 
it.", this);
     LockState state = acquireLock(env);
     assert state == LockState.LOCK_ACQUIRED;

http://git-wip-us.apache.org/repos/asf/hbase/blob/66469733/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 bd75827..01d2b2b 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
@@ -653,7 +653,20 @@ public class ProcedureExecutor<TEnvironment> {
         sendProcedureLoadedNotification(p.getProcId());
       }
       // If the procedure holds the lock, put the procedure in front
-      if (p.isLockedWhenLoading()) {
+      // If its parent holds the lock, put the procedure in front
+      // TODO. Is that possible that its ancestor holds the lock?
+      // For now, the deepest procedure hierarchy is:
+      // ModifyTableProcedure -> ReopenTableProcedure ->
+      // MoveTableProcedure -> Unassign/AssignProcedure
+      // But ModifyTableProcedure and ReopenTableProcedure won't hold the lock
+      // So, check parent lock is enough(a tricky case is resovled by 
HBASE-21384).
+      // If some one change or add new procedures making 'grandpa' procedure
+      // holds the lock, but parent procedure don't hold the lock, there will
+      // be a problem here. We have to check one procedure's ancestors.
+      // And we need to change LockAndQueue.hasParentLock(Procedure<?> proc) 
method
+      // to check all ancestors too.
+      if (p.isLockedWhenLoading() || (p.hasParent() && procedures
+          .get(p.getParentProcId()).isLockedWhenLoading())) {
         scheduler.addFront(p, false);
       } else {
         // if it was not, it can wait.

Reply via email to