Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 31F28DC5C for ; Sun, 4 Nov 2012 00:20:50 +0000 (UTC) Received: (qmail 82648 invoked by uid 500); 4 Nov 2012 00:20:49 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 82613 invoked by uid 500); 4 Nov 2012 00:20:49 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 82606 invoked by uid 99); 4 Nov 2012 00:20:49 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Nov 2012 00:20:49 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Nov 2012 00:20:48 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5EC0123888CD for ; Sun, 4 Nov 2012 00:20:28 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1405443 - in /hbase/trunk: hbase-common/src/test/java/org/apache/hadoop/hbase/ hbase-server/src/test/java/org/apache/hadoop/hbase/ Date: Sun, 04 Nov 2012 00:20:28 -0000 To: commits@hbase.apache.org From: tedyu@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121104002028.5EC0123888CD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: tedyu Date: Sun Nov 4 00:20:27 2012 New Revision: 1405443 URL: http://svn.apache.org/viewvc?rev=1405443&view=rev Log: HBASE-7086 Enhance ResourceChecker to log stack trace for potentially hanging threads Modified: hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java Modified: hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java?rev=1405443&r1=1405442&r2=1405443&view=diff ============================================================================== --- hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java (original) +++ hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceChecker.java Sun Nov 4 00:20:27 2012 @@ -24,7 +24,6 @@ import org.apache.commons.logging.LogFac import java.util.*; - /** * Utility class to check the resources: * - log them before and after each test method @@ -35,6 +34,10 @@ public class ResourceChecker { 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,11 +83,16 @@ public class ResourceChecker { /** * The value for the resource. + * @param phase */ - abstract public int getVal(); + abstract public int getVal(Phase phase); + + /* + * Retrieves List of Strings which would be logged in logEndings() + */ + public List getStringsToLog() { return null; } } - private List ras = new ArrayList(); private int[] initialValues; private int[] endingValues; @@ -92,18 +100,18 @@ public class ResourceChecker { 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); } } @@ -151,6 +159,12 @@ public class ResourceChecker { if (sb.length() > 0) sb.append(", "); sb.append(ra.getName()).append("=").append(curN).append(" (was ").append(curP).append(")"); if (curN > curP) { + List strings = ra.getStringsToLog(); + if (strings != null) { + for (String s : strings) { + sb.append(s); + } + } sb.append(" - ").append(ra.getName()).append(" LEAK? -"); } } Modified: hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java?rev=1405443&r1=1405442&r2=1405443&view=diff ============================================================================== --- hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java (original) +++ hbase/trunk/hbase-common/src/test/java/org/apache/hadoop/hbase/ResourceCheckerJUnitListener.java Sun Nov 4 00:20:27 2012 @@ -20,14 +20,20 @@ package org.apache.hadoop.hbase; -import com.sun.management.UnixOperatingSystemMXBean; -import org.junit.runner.notification.RunListener; - import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.apache.hadoop.hbase.ResourceChecker.Phase; +import org.junit.runner.notification.RunListener; + +import com.sun.management.UnixOperatingSystemMXBean; + /** * Listen to the test progress and check the usage of: * - threads @@ -40,15 +46,43 @@ public class ResourceCheckerJUnitListene private Map rcs = new ConcurrentHashMap(); static class ThreadResourceAnalyzer extends ResourceChecker.ResourceAnalyzer { + private static Set initialThreadNames = new HashSet(); + private static List stringsToLog = null; + @Override - public int getVal() { - return Thread.getAllStackTraces().size(); + public int getVal(Phase phase) { + Map stackTraces = Thread.getAllStackTraces(); + if (phase == Phase.INITIAL) { + stringsToLog = null; + for (Thread t : stackTraces.keySet()) { + initialThreadNames.add(t.getName()); + } + } else if (phase == Phase.END) { + if (stackTraces.size() > initialThreadNames.size()) { + stringsToLog = new ArrayList(); + for (Thread t : stackTraces.keySet()) { + if (!initialThreadNames.contains(t.getName())) { + stringsToLog.add("\nPotentially hanging thread: " + t.getName() + "\n"); + StackTraceElement[] stackElements = stackTraces.get(t); + for (StackTraceElement ele : stackElements) { + stringsToLog.add("\t" + ele + "\n"); + } + } + } + } + } + return stackTraces.size(); } @Override public int getMax() { return 500; } + + @Override + public List getStringsToLog() { + return stringsToLog; + } } /** @@ -71,7 +105,7 @@ public class ResourceCheckerJUnitListene static class OpenFileDescriptorResourceAnalyzer extends OSResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase) { if (unixOsStats == null) { return 0; } else { @@ -87,7 +121,7 @@ public class ResourceCheckerJUnitListene static class MaxFileDescriptorResourceAnalyzer extends OSResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase) { if (unixOsStats == null) { return 0; } else { Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java?rev=1405443&r1=1405442&r2=1405443&view=diff ============================================================================== --- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java (original) +++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/ServerResourceCheckerJUnitListener.java Sun Nov 4 00:20:27 2012 @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase; +import org.apache.hadoop.hbase.ResourceChecker.Phase; import org.apache.hadoop.hbase.client.HConnectionTestingUtility; /** @@ -29,7 +30,7 @@ public class ServerResourceCheckerJUnitL static class ConnectionCountResourceAnalyzer extends ResourceChecker.ResourceAnalyzer { @Override - public int getVal() { + public int getVal(Phase phase) { return HConnectionTestingUtility.getConnectionCount(); } }