Repository: hbase
Updated Branches:
refs/heads/branch-2.0 97578babc -> 85ee79904
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/85ee7990
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/85ee7990
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/85ee7990
Branch: refs/heads/branch-2.0
Commit: 85ee79904977444553910f31c80d3af84f74678e
Parents: 97578ba
Author: Allan Yang <allan163@apache.org>
Authored: Thu Oct 25 13:51:41 2018 +0800
Committer: Allan Yang <allan163@apache.org>
Committed: Thu Oct 25 13:52:10 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/85ee7990/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/85ee7990/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 a271d8f..4cc9b61 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
@@ -993,7 +993,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/85ee7990/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 a410bc9..7dea3e7 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.
|