From e111c3b4ed5590c99b1100da7dff9dc81af651b5 Mon Sep 17 00:00:00 2001 From: chenheng Date: Wed, 27 Apr 2016 12:24:33 +0800 Subject: [PATCH] HBASE-15720 Print row locks at the debug dump page --- .../apache/hadoop/hbase/regionserver/HRegion.java | 11 +++++++++++ .../hadoop/hbase/regionserver/RSDumpServlet.java | 21 ++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 72238cc..1210253 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -5167,6 +5167,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi rowLockContext.cleanUp(); throw new IOException("Timed out waiting for lock for row: " + rowKey); } + rowLockContext.setThreadName(Thread.currentThread().getName()); return result; } catch (InterruptedException ie) { LOG.warn("Thread interrupted waiting for lock on row: " + rowKey); @@ -5194,6 +5195,10 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } } + public ConcurrentHashMap getLockedRows() { + return lockedRows; + } + @VisibleForTesting class RowLockContext { private final HashedBytes row; @@ -5201,6 +5206,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi final AtomicBoolean usable = new AtomicBoolean(true); final AtomicInteger count = new AtomicInteger(0); final Object lock = new Object(); + private String threadName; RowLockContext(HashedBytes row) { this.row = row; @@ -5239,12 +5245,17 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } } + public void setThreadName(String threadName) { + this.threadName = threadName; + } + @Override public String toString() { return "RowLockContext{" + "row=" + row + ", readWriteLock=" + readWriteLock + ", count=" + count + + ", threadName=" + threadName + '}'; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSDumpServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSDumpServlet.java index 77b68ec..0c69bd9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSDumpServlet.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSDumpServlet.java @@ -23,7 +23,6 @@ import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.util.Date; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -69,6 +68,10 @@ public class RSDumpServlet extends StateDumpServlet { out.println(LINE); TaskMonitor.get().dumpAsText(out); + out.println("\n\nRowLocks:"); + out.println(LINE); + dumpRowLock(hrs, out); + out.println("\n\nExecutors:"); out.println(LINE); dumpExecutors(hrs.getExecutorService(), out); @@ -100,6 +103,22 @@ public class RSDumpServlet extends StateDumpServlet { out.flush(); } + public static void dumpRowLock(HRegionServer hrs, PrintWriter out) { + StringBuilder sb = new StringBuilder(); + for (Region region : hrs.getOnlineRegions()) { + HRegion hRegion = (HRegion)region; + if (hRegion.getLockedRows().size() > 0) { + for (HRegion.RowLockContext rowLockContext : hRegion.getLockedRows().values()) { + sb.setLength(0); + sb.append(hRegion.getTableDesc().getTableName()).append(",") + .append(hRegion.getRegionInfo().getEncodedName()).append(","); + sb.append(rowLockContext.toString()); + out.println(sb.toString()); + } + } + } + } + public static void dumpQueue(HRegionServer hrs, PrintWriter out) throws IOException { if (hrs.compactSplitThread != null) { -- 1.9.3 (Apple Git-50)