You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2017/05/24 21:56:32 UTC
hbase git commit: HBASE-18091 Added API for getting who currently
holds a lock on namespace/ table/ region/ server and log messages when
procedure needs to wait to acquire lock
Repository: hbase
Updated Branches:
refs/heads/master 64c701768 -> 837bb9ece
HBASE-18091 Added API for getting who currently holds a lock on namespace/ table/ region/ server and log messages when procedure needs to wait to acquire lock
Signed-off-by: Michael Stack <st...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/837bb9ec
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/837bb9ec
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/837bb9ec
Branch: refs/heads/master
Commit: 837bb9ece796aee9bc1f82ec45414ea52ac33f80
Parents: 64c7017
Author: Umesh Agashe <ua...@cloudera.com>
Authored: Tue May 23 11:08:33 2017 -0700
Committer: Michael Stack <st...@apache.org>
Committed: Wed May 24 14:56:22 2017 -0700
----------------------------------------------------------------------
.../hbase/procedure2/ProcedureScheduler.java | 4 ++
.../procedure2/SimpleProcedureScheduler.java | 5 ++
.../procedure/MasterProcedureScheduler.java | 56 +++++++++++++++++++-
3 files changed, 64 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/837bb9ec/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java
index b5295e7..93d0d5d 100644
--- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java
+++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java
@@ -128,6 +128,10 @@ public interface ProcedureScheduler {
List<LockInfo> listLocks();
/**
+ * @return {@link LockInfo} for resource of specified type & name. null if resource is not locked.
+ */
+ LockInfo getLockInfoForResource(LockInfo.ResourceType resourceType, String resourceName);
+ /**
* Returns the number of elements in this queue.
* @return the number of elements in this queue.
*/
http://git-wip-us.apache.org/repos/asf/hbase/blob/837bb9ec/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/SimpleProcedureScheduler.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/SimpleProcedureScheduler.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/SimpleProcedureScheduler.java
index 176a900..f3523ec 100644
--- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/SimpleProcedureScheduler.java
+++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/SimpleProcedureScheduler.java
@@ -81,4 +81,9 @@ public class SimpleProcedureScheduler extends AbstractProcedureScheduler {
public List<LockInfo> listLocks() {
return Collections.emptyList();
}
+
+ @Override
+ public LockInfo getLockInfoForResource(LockInfo.ResourceType resourceType, String resourceName) {
+ return null;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hbase/blob/837bb9ec/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 b0baf85..15b557a 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
@@ -339,6 +339,32 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
}
@Override
+ public LockInfo getLockInfoForResource(LockInfo.ResourceType resourceType, String resourceName) {
+ LockAndQueue queue = null;
+ schedLock();
+ try {
+ switch (resourceType) {
+ case SERVER:
+ queue = locking.serverLocks.get(ServerName.valueOf(resourceName));
+ break;
+ case NAMESPACE:
+ queue = locking.namespaceLocks.get(resourceName);
+ break;
+ case TABLE:
+ queue = locking.tableLocks.get(TableName.valueOf(resourceName));
+ break;
+ case REGION:
+ queue = locking.regionLocks.get(resourceName);
+ break;
+ }
+
+ return queue != null ? createLockInfo(resourceType, resourceName, queue) : null;
+ } finally {
+ schedUnlock();
+ }
+ }
+
+ @Override
public void clear() {
schedLock();
try {
@@ -586,6 +612,27 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
}
/**
+ * Get lock info for a resource of specified type and name and log details
+ */
+ protected void logLockInfoForResource(LockInfo.ResourceType resourceType, String resourceName) {
+ if (!LOG.isDebugEnabled()) {
+ return;
+ }
+
+ LockInfo lockInfo = getLockInfoForResource(resourceType, resourceName);
+ if (lockInfo != null) {
+ String msg = resourceType.toString() + " '" + resourceName + "', shared lock count=" +
+ lockInfo.getSharedLockCount();
+
+ ProcedureInfo proc = lockInfo.getExclusiveLockOwnerProcedure();
+ if (proc != null) {
+ msg += ", exclusively locked by procId=" + proc.getProcId();
+ }
+ LOG.debug(msg);
+ }
+ }
+
+ /**
* Suspend the procedure if the specified table is already locked.
* Other operations in the table-queue will be executed after the lock is released.
* @param procedure the procedure trying to acquire the lock
@@ -595,15 +642,18 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
public boolean waitTableExclusiveLock(final Procedure procedure, final TableName table) {
schedLock();
try {
- final LockAndQueue namespaceLock = locking.getNamespaceLock(table.getNamespaceAsString());
+ final String namespace = table.getNamespaceAsString();
+ final LockAndQueue namespaceLock = locking.getNamespaceLock(namespace);
final LockAndQueue tableLock = locking.getTableLock(table);
if (!namespaceLock.trySharedLock()) {
waitProcedure(namespaceLock, procedure);
+ logLockInfoForResource(LockInfo.ResourceType.NAMESPACE, namespace);
return true;
}
if (!tableLock.tryExclusiveLock(procedure)) {
namespaceLock.releaseSharedLock();
waitProcedure(tableLock, procedure);
+ logLockInfoForResource(LockInfo.ResourceType.TABLE, table.getNameAsString());
return true;
}
removeFromRunQueue(tableRunQueue, getTableQueue(table));
@@ -856,6 +906,8 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
locking.getTableLock(TableName.NAMESPACE_TABLE_NAME);
if (!systemNamespaceTableLock.trySharedLock()) {
waitProcedure(systemNamespaceTableLock, procedure);
+ logLockInfoForResource(LockInfo.ResourceType.TABLE,
+ TableName.NAMESPACE_TABLE_NAME.getNameAsString());
return true;
}
@@ -863,6 +915,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
if (!namespaceLock.tryExclusiveLock(procedure)) {
systemNamespaceTableLock.releaseSharedLock();
waitProcedure(namespaceLock, procedure);
+ logLockInfoForResource(LockInfo.ResourceType.NAMESPACE, namespace);
return true;
}
return false;
@@ -915,6 +968,7 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler {
return false;
}
waitProcedure(lock, procedure);
+ logLockInfoForResource(LockInfo.ResourceType.SERVER, serverName.getServerName());
return true;
} finally {
schedUnlock();