From d82299513c65674835d593c89f9cd079a4631403 Mon Sep 17 00:00:00 2001 From: zhangduo Date: Thu, 26 Jul 2018 22:42:44 +0800 Subject: [PATCH] HBASE-20949 Add logs for debugging --- .../org/apache/hadoop/hbase/procedure2/LockAndQueue.java | 13 ++++++++++--- .../hbase/master/procedure/MasterProcedureScheduler.java | 14 +++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) 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(); } } 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); } -- 2.7.4