Index: hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java (revision 1405168) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java (working copy) @@ -19,6 +19,8 @@ package org.apache.hadoop.hbase; +import org.apache.commons.logging.Log; +import org.apache.hadoop.hbase.ResourceChecker.Phase; import org.apache.hadoop.hbase.client.HConnectionTestingUtility; /** @@ -29,7 +31,7 @@ static class ConnectionCountResourceAnalyzer extends ResourceChecker.ResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase, Log log) { return HConnectionTestingUtility.getConnectionCount(); } } Index: hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java =================================================================== --- hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java (revision 1405168) +++ hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java (working copy) @@ -24,7 +24,6 @@ import java.util.*; - /** * Utility class to check the resources: * - log them before and after each test method @@ -35,6 +34,10 @@ private static final Log LOG = LogFactory.getLog(ResourceChecker.class); private String tagLine; + enum Phase { + INITIAL, INTERMEDIATE, END + } + /** * Constructor * @param tagLine - the tagLine is added to the logs. Must be be null. @@ -80,8 +83,10 @@ /** * The value for the resource. + * @param phase + * @param log */ - abstract public int getVal(); + abstract public int getVal(Phase phase, Log log); } @@ -92,18 +97,18 @@ private void fillInit() { initialValues = new int[ras.size()]; - fill(initialValues); + fill(Phase.INITIAL, initialValues); } private void fillEndings() { endingValues = new int[ras.size()]; - fill(endingValues); + fill(Phase.END, endingValues); } - private void fill(int[] vals) { + private void fill(Phase phase, int[] vals) { int i = 0; for (ResourceAnalyzer ra : ras) { - vals[i++] = ra.getVal(); + vals[i++] = ra.getVal(phase, LOG); } } Index: hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java =================================================================== --- hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java (revision 1405168) +++ hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java (working copy) @@ -21,11 +21,17 @@ import com.sun.management.UnixOperatingSystemMXBean; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.ResourceChecker.Phase; import org.junit.runner.notification.RunListener; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -40,9 +46,30 @@ private Map rcs = new ConcurrentHashMap(); static class ThreadResourceAnalyzer extends ResourceChecker.ResourceAnalyzer { + private static Set initialThreadNames = new HashSet(); + @Override - public int getVal() { - return Thread.getAllStackTraces().size(); + public int getVal(Phase phase, Log log) { + Map stackTraces = Thread.getAllStackTraces(); + if (phase == Phase.INITIAL) { + for (Thread t : stackTraces.keySet()) { + initialThreadNames.add(t.getName()); + } + } else if (phase == Phase.END) { + if (stackTraces.size() > initialThreadNames.size()) { + + for (Thread t : stackTraces.keySet()) { + if (!initialThreadNames.contains(t.getName())) { + log.info("Potentially hanging thread: " + t.getName()); + StackTraceElement[] stackElements = stackTraces.get(t); + for (StackTraceElement ele : stackElements) { + log.info("\t" + ele); + } + } + } + } + } + return stackTraces.size(); } @Override @@ -71,7 +98,7 @@ static class OpenFileDescriptorResourceAnalyzer extends OSResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase, Log log) { if (unixOsStats == null) { return 0; } else { @@ -87,7 +114,7 @@ static class MaxFileDescriptorResourceAnalyzer extends OSResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase, Log log) { if (unixOsStats == null) { return 0; } else {