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.