HBASE-21384 Procedure with holdlock=false should not be restored lock when restarts
This commit is contained in:
parent
5309c3389d
commit
e71c05707e
|
@ -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()));
|
||||
}
|
||||
|
|
|
@ -992,7 +992,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;
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue