提交 27974095 编写于 作者: S sjiang

8050115: javax/management/monitor/GaugeMonitorDeadlockTest.java fails intermittently

Reviewed-by: dfuchs, dholmes
上级 8b0f90f6
...@@ -36,8 +36,9 @@ ...@@ -36,8 +36,9 @@
*/ */
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import javax.management.Attribute;
import javax.management.JMX; import javax.management.JMX;
import javax.management.MBeanServer; import javax.management.MBeanServer;
import javax.management.Notification; import javax.management.Notification;
...@@ -47,10 +48,16 @@ import javax.management.monitor.GaugeMonitor; ...@@ -47,10 +48,16 @@ import javax.management.monitor.GaugeMonitor;
import javax.management.monitor.GaugeMonitorMBean; import javax.management.monitor.GaugeMonitorMBean;
public class GaugeMonitorDeadlockTest { public class GaugeMonitorDeadlockTest {
private static enum When {IN_GET_ATTRIBUTE, IN_NOTIFY};
private static long checkingTime;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if (args.length != 1) if (args.length != 1)
throw new Exception("Arg should be test number"); throw new Exception("Arg should be test number");
double factor = Double.parseDouble(System.getProperty("test.timeout.factor", "1.0"));
checkingTime = (long)factor*1000;
System.out.println("=== checkingTime = " + checkingTime + "ms");
int testNo = Integer.parseInt(args[0]) - 1; int testNo = Integer.parseInt(args[0]) - 1;
TestCase test = testCases[testNo]; TestCase test = testCases[testNo];
System.out.println("Test: " + test.getDescription()); System.out.println("Test: " + test.getDescription());
...@@ -58,8 +65,6 @@ public class GaugeMonitorDeadlockTest { ...@@ -58,8 +65,6 @@ public class GaugeMonitorDeadlockTest {
System.out.println("Test passed"); System.out.println("Test passed");
} }
private static enum When {IN_GET_ATTRIBUTE, IN_NOTIFY};
private static abstract class TestCase { private static abstract class TestCase {
TestCase(String description, When when) { TestCase(String description, When when) {
this.description = description; this.description = description;
...@@ -98,16 +103,29 @@ public class GaugeMonitorDeadlockTest { ...@@ -98,16 +103,29 @@ public class GaugeMonitorDeadlockTest {
monitorProxy.setNotifyLow(true); monitorProxy.setNotifyLow(true);
monitorProxy.start(); monitorProxy.start();
System.out.println("=== Waiting observedProxy.getGetCount() to be "
+ "changed, presumable deadlock if timeout?");
final int initGetCount = observedProxy.getGetCount(); final int initGetCount = observedProxy.getGetCount();
int getCount = initGetCount; long checkedTime = System.currentTimeMillis();
for (int i = 0; i < 2000; i++) { // 2000 * 10 = 20 seconds long nowTime;
getCount = observedProxy.getGetCount(); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
if (getCount != initGetCount) while (observedProxy.getGetCount() == initGetCount) {
break; Thread.sleep(100);
Thread.sleep(10);
nowTime = System.currentTimeMillis();
if (nowTime - checkedTime >= checkingTime) {
System.out.println("=== Checking deadlocked ...");
if (threadMXBean.findDeadlockedThreads() != null) {
for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
System.out.println(info);
}
throw new Error("Found deadlocked threads: "
+ threadMXBean.findDeadlockedThreads().length);
}
checkedTime = System.currentTimeMillis();
}
} }
if (getCount <= initGetCount)
throw new Exception("Test failed: presumable deadlock");
// This won't show up as a deadlock in CTRL-\ or in // This won't show up as a deadlock in CTRL-\ or in
// ThreadMXBean.findDeadlockedThreads(), because they don't // ThreadMXBean.findDeadlockedThreads(), because they don't
// see that thread A is waiting for thread B (B.join()), and // see that thread A is waiting for thread B (B.join()), and
...@@ -117,13 +135,13 @@ public class GaugeMonitorDeadlockTest { ...@@ -117,13 +135,13 @@ public class GaugeMonitorDeadlockTest {
// so if we want to test notify behaviour we can trigger by // so if we want to test notify behaviour we can trigger by
// exceeding the threshold. // exceeding the threshold.
if (when == When.IN_NOTIFY) { if (when == When.IN_NOTIFY) {
final Thread testedThread = new Thread(sensitiveThing);
final AtomicInteger notifCount = new AtomicInteger(); final AtomicInteger notifCount = new AtomicInteger();
final NotificationListener listener = new NotificationListener() { final NotificationListener listener = new NotificationListener() {
public void handleNotification(Notification n, Object h) { public void handleNotification(Notification n, Object h) {
Thread t = new Thread(sensitiveThing); testedThread.start();
t.start();
try { try {
t.join(); testedThread.join();
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
...@@ -132,12 +150,36 @@ public class GaugeMonitorDeadlockTest { ...@@ -132,12 +150,36 @@ public class GaugeMonitorDeadlockTest {
}; };
mbs.addNotificationListener(monitorName, listener, null, null); mbs.addNotificationListener(monitorName, listener, null, null);
observedProxy.setThing(1000); observedProxy.setThing(1000);
for (int i = 0; i < 2000 && notifCount.get() == 0; i++) System.out.println("=== Waiting notifications, presumable "
Thread.sleep(10); + "deadlock if timeout?");
if (notifCount.get() == 0) long startTime = System.currentTimeMillis();
throw new Exception("Test failed: presumable deadlock"); checkedTime = startTime;
} while (notifCount.get() == 0) {
Thread.sleep(100);
nowTime = System.currentTimeMillis();
if (nowTime - checkedTime >= checkingTime) {
System.out.println("=== Checking the thread state ...");
if (testedThread.isAlive()) {
System.out.println("=== Waiting testedThread to die "
+ "after " + (nowTime - startTime) + "ms");
ThreadInfo tinfo = threadMXBean.getThreadInfo(testedThread.getId());
if (Thread.State.BLOCKED.equals(tinfo.getThreadState())) {
for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
System.out.println(info);
}
} else {
System.out.println(tinfo);
}
} else {
System.out.println("=== The testedThread is dead as wished, "
+ "the test must be passed soon.");
}
checkedTime = System.currentTimeMillis();
}
}
}
} }
abstract void doSensitiveThing(GaugeMonitorMBean monitorProxy, abstract void doSensitiveThing(GaugeMonitorMBean monitorProxy,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册