@Override
  protected Procedure<MasterProcedureEnv>[] execute(final MasterProcedureEnv env)
    throws ProcedureSuspendedException {
    // Local master locks don't store any state, so on recovery, simply finish this procedure
    // immediately.
    if (recoveredMasterLock) return null;
    if (lockAcquireLatch != null) {
      lockAcquireLatch.countDown();
    }
    if (unlock.get() || hasHeartbeatExpired()) {
      locked.set(false);
      LOG.debug((unlock.get() ? "UNLOCKED " : "TIMED OUT ") + toString());
      return null;
    }
    synchronized (event) {
      event.suspend();
      event.suspendIfNotReady(this);
      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);
      suspended = true;
    }
    throw new ProcedureSuspendedException();
  }
Re run the procedure after every timeout to write new WAL entries so we don't hold back old
WALs.
@return false, so procedure framework doesn't mark this procedure as failure.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/locking/LockProcedure.java