Repository: hbase Updated Branches: refs/heads/master a392c017e -> 8b8de1f8a
HBASE-20949 Add logs for debugging Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8b8de1f8 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8b8de1f8 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8b8de1f8 Branch: refs/heads/master Commit: 8b8de1f8a77b5b9f6d4b8cfb7eeb3d545a69d0f2 Parents: a392c01 Author: zhangduo <[email protected]> Authored: Thu Jul 26 22:42:44 2018 +0800 Committer: zhangduo <[email protected]> Committed: Thu Jul 26 22:43:14 2018 +0800 ---------------------------------------------------------------------- .../apache/hadoop/hbase/procedure2/LockAndQueue.java | 13 ++++++++++--- .../master/procedure/MasterProcedureScheduler.java | 14 +++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/8b8de1f8/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..f86c7c8 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 @@ -21,6 +21,8 @@ package org.apache.hadoop.hbase.procedure2; import java.util.function.Predicate; import java.util.stream.Stream; import org.apache.yetus.audience.InterfaceAudience; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Locking for mutual exclusion between procedures. Used only by procedure framework internally. @@ -48,6 +50,7 @@ import org.apache.yetus.audience.InterfaceAudience; */ @InterfaceAudience.Private public class LockAndQueue implements LockStatus { + private static final Logger LOG = LoggerFactory.getLogger(LockAndQueue.class); private final ProcedureDeque queue = new ProcedureDeque(); private Procedure<?> exclusiveLockOwnerProcedure = null; private int sharedLock = 0; @@ -111,11 +114,13 @@ public class LockAndQueue implements LockStatus { */ public boolean trySharedLock(Procedure<?> proc) { if (hasExclusiveLock() && !hasLockAccess(proc)) { + LOG.debug("{} acquire shared lock {} failed", proc, this, new Exception()); return false; } // If no one holds the xlock, then we are free to hold the sharedLock // If the parent proc or we have already held the xlock, then we return true here as // xlock is more powerful then shared lock. + LOG.debug("{} acquire shared lock {} succeeded", proc, this, new Exception()); sharedLock++; return true; } @@ -123,7 +128,8 @@ public class LockAndQueue implements LockStatus { /** * @return whether we should wake the procedures waiting on the lock here. */ - public boolean releaseSharedLock() { + public boolean releaseSharedLock(Procedure<?> proc) { + LOG.debug("{} release shared lock {}", proc, this, new Exception()); // hasExclusiveLock could be true, it usually means we acquire shared lock while we or our // parent have held the xlock. And since there is still an exclusive lock, we do not need to // wake any procedures. @@ -186,7 +192,8 @@ public class LockAndQueue implements LockStatus { @Override public String toString() { - return "exclusiveLockOwner=" + (hasExclusiveLock() ? getExclusiveLockProcIdOwner() : "NONE") + - ", sharedLockCount=" + getSharedLockCount() + ", waitingProcCount=" + queue.size(); + return String.format("%08x", hashCode()) + ": exclusiveLockOwner=" + + (hasExclusiveLock() ? getExclusiveLockProcIdOwner() : "NONE") + ", sharedLockCount=" + + getSharedLockCount() + ", waitingProcCount=" + queue.size(); } } http://git-wip-us.apache.org/repos/asf/hbase/blob/8b8de1f8/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java index 2a29ee1..4180a96 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java @@ -526,7 +526,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { return true; } if (!tableLock.tryExclusiveLock(procedure)) { - namespaceLock.releaseSharedLock(); + namespaceLock.releaseSharedLock(procedure); waitProcedure(tableLock, procedure); logLockedResource(LockedResourceType.TABLE, table.getNameAsString()); return true; @@ -552,7 +552,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { if (tableLock.releaseExclusiveLock(procedure)) { waitingCount += wakeWaitingProcedures(tableLock); } - if (namespaceLock.releaseSharedLock()) { + if (namespaceLock.releaseSharedLock(procedure)) { waitingCount += wakeWaitingProcedures(namespaceLock); } addToRunQueue(tableRunQueue, getTableQueue(table)); @@ -584,7 +584,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { } if (!tableLock.trySharedLock(procedure)) { - namespaceLock.releaseSharedLock(); + namespaceLock.releaseSharedLock(procedure); waitProcedure(tableLock, procedure); return null; } @@ -606,11 +606,11 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { final LockAndQueue namespaceLock = locking.getNamespaceLock(table.getNamespaceAsString()); final LockAndQueue tableLock = locking.getTableLock(table); int waitingCount = 0; - if (tableLock.releaseSharedLock()) { + if (tableLock.releaseSharedLock(procedure)) { addToRunQueue(tableRunQueue, getTableQueue(table)); waitingCount += wakeWaitingProcedures(tableLock); } - if (namespaceLock.releaseSharedLock()) { + if (namespaceLock.releaseSharedLock(procedure)) { waitingCount += wakeWaitingProcedures(namespaceLock); } wakePollIfNeeded(waitingCount); @@ -784,7 +784,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { final LockAndQueue namespaceLock = locking.getNamespaceLock(namespace); if (!namespaceLock.tryExclusiveLock(procedure)) { - systemNamespaceTableLock.releaseSharedLock(); + systemNamespaceTableLock.releaseSharedLock(procedure); waitProcedure(namespaceLock, procedure); logLockedResource(LockedResourceType.NAMESPACE, namespace); return true; @@ -811,7 +811,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { if (namespaceLock.releaseExclusiveLock(procedure)) { waitingCount += wakeWaitingProcedures(namespaceLock); } - if (systemNamespaceTableLock.releaseSharedLock()) { + if (systemNamespaceTableLock.releaseSharedLock(procedure)) { addToRunQueue(tableRunQueue, getTableQueue(TableName.NAMESPACE_TABLE_NAME)); waitingCount += wakeWaitingProcedures(systemNamespaceTableLock); }
