Garbage collection race condition before final checks
Gary Adams
gary.adams at oracle.com
Tue Nov 8 15:35:20 UTC 2011
Here's another intermittent bug that is attributed
to the garbage collection of the loggers before the
final static check can be applied in the test.
CR#7067691 : java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
failing intermittently
I'd like to implement the recommended solution of adding strong references
to the objects being checked, so they are available for the final tests.
I'd also like to add some diagnostic printouts, in case
the problem shows up again we'll have some useful information
about the failure.
diff --git
a/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
b/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
--- a/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
+++ b/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
@@ -42,6 +42,9 @@
static String LOGGER_NAME_1 = "com.sun.management.Logger";
static String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2";
static String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown";
+ static Logger logger1;
+ static Logger logger2;
+ static LoggingMXBeanTest testp;
public static void main(String[] argv) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
@@ -51,7 +54,7 @@
LoggingMXBean.class);
// test LoggingMXBean proxy
- LoggingMXBeanTest p = new LoggingMXBeanTest(proxy);
+ testp = new LoggingMXBeanTest(proxy);
// check if the attributes implemented by PlatformLoggingMXBean
// and LoggingMXBean return the same value
@@ -59,14 +62,18 @@
ManagementFactory.getPlatformMXBean(mbs, PlatformLoggingMXBean.class);
checkAttributes(proxy, mxbean);
+
+ logger1 = null;
+ logger2 = null;
+ testp = null;
}
// same verification as in java/util/logging/LoggingMXBeanTest2
public LoggingMXBeanTest(LoggingMXBean mbean) throws Exception {
- Logger logger1 = Logger.getLogger( LOGGER_NAME_1 );
+ logger1 = Logger.getLogger( LOGGER_NAME_1 );
logger1.setLevel(Level.FINE);
- Logger logger2 = Logger.getLogger( LOGGER_NAME_2 );
+ logger2 = Logger.getLogger( LOGGER_NAME_2 );
logger2.setLevel(null);
/*
@@ -207,6 +214,18 @@
// verify logger names
List<String> loggers1 = mxbean1.getLoggerNames();
List<String> loggers2 = mxbean2.getLoggerNames();
+
+ // Print the two logger lists for diagnostic purposes
+ System.out.println(" : LoggingMXBean " + loggers1);
+ System.out.println(" : PlatformLoggingMXBean " + loggers2);
+
+ // Print the list of logger level comparisons for diagnostic purposes
+ for (String logger : loggers1) {
+ System.out.println (" : Level (" + logger
+ + ", " + mxbean1.getLoggerLevel(logger)
+ + ", " + mxbean2.getLoggerLevel(logger) + ")");
+ }
+
if (loggers1.size() != loggers2.size())
throw new RuntimeException("LoggerNames: unmatched number of
entries");
List<String> loggers3 = new ArrayList<>(loggers1);
@@ -219,7 +238,10 @@
if (!mxbean1.getLoggerLevel(logger)
.equals(mxbean2.getLoggerLevel(logger)))
throw new RuntimeException(
- "LoggerLevel: unmatched level for " + logger);
+ "LoggerLevel: unmatched level for (" + logger
+ + ", " + mxbean1.getLoggerLevel(logger)
+ + ", " + mxbean2.getLoggerLevel(logger) + ")");
+
if (!mxbean1.getParentLoggerName(logger)
.equals(mxbean2.getParentLoggerName(logger)))
throw new RuntimeException(
With this sample output added to the test log
: LoggingMXBean [com.sun.management.Logger.Logger2, javax.management.snmp,
global, javax.management.notification, javax.management.modelmbean,
javax.management.timer, javax.management, com.sun.management.Logger,
javax.management.mlet, javax.management.mbeanserver,
javax.management.snmp.daemon, javax.management.relation,
javax.management.monitor, javax.management.misc, ]
: PlatformLoggingMXBean [com.sun.management.Logger.Logger2,
javax.management.snmp, global, javax.management.notification,
javax.management.modelmbean, javax.management.timer, javax.management,
com.sun.management.Logger, javax.management.mlet, javax.management.mbeanserver,
javax.management.snmp.daemon, javax.management.relation,
javax.management.monitor, javax.management.misc, ]
: Level (com.sun.management.Logger.Logger2, SEVERE, SEVERE)
: Level (javax.management.snmp, , )
: Level (global, , )
: Level (javax.management.notification, , )
: Level (javax.management.modelmbean, , )
: Level (javax.management.timer, , )
: Level (javax.management, , )
: Level (com.sun.management.Logger, , )
: Level (javax.management.mlet, , )
: Level (javax.management.mbeanserver, , )
: Level (javax.management.snmp.daemon, , )
: Level (javax.management.relation, , )
: Level (javax.management.monitor, , )
: Level (javax.management.misc, , )
: Level (, INFO, INFO)
More information about the core-libs-dev
mailing list