Hi!
Some more info. I gave it a try with the following JDK/JREs:
- Sun 5
- Sun 6
- IBM 5
- IBM 6
Only with IBM 6 I was not able to reproduce the hang-up. All other JVMs hang
with the same pattern. The Finalizer thread blocks in Class.forName - the
requested class is different for each JVM but always come from sun.* package.
The main thread also blocks in Class.forName - the requested class varies
across runs, usually (always?) it is an OpenJPA class.
The hang-up vanishes if I add Class.forName statements to load the mentioned
sun.* classes in setUp() of the test case.
Greetings,
Milosz
> Rick,
>
> Setting openjpa.DynamicEnhancementAgent to false did not have any effect.
>
> I have figured out that the issue depends on the database connected. I can
> reproduce it with MySQL and PostgreSQL but not with DB2. Even with the first
> two databases the reproducibility is "not always". Below I have included
> suspended thread dumps from Eclipse (Windows) - the first one is from
> PostgreSQL, the other one is from MySQL. As you can see, this seems to be
> related to executing finalize() on driver's Connection implementations. If I
> can read that stuff correctly, a hang-up occurs in TemporaryClassLoader, line
> 59, in Class.forName:
>
> // bug #283. defer to system if the name is a protected name.
> // "sun." is required for JDK 1.4, which has an access check for
> // sun.reflect.GeneratedSerializationConstructorAccessor1
> if (name.startsWith("java.") || name.startsWith("javax.")
> || name.startsWith("sun."))
> return Class.forName(name, resolve, getClass().getClassLoader());
>
> The name variable has a value of "sun.net.ConnectionResetException". The
> hang-up vanishes when I remove "|| name.startsWith("sun.")". Does someone
> understand what's going on?
>
> Regards,
> Milosz
>
> PGSQL:
>
>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:1950
> (Suspended)
> System Thread [Finalizer] (Suspended)
> Class.forName0(String, boolean, ClassLoader) line: not available
> [native method]
> Class.forName(String, boolean, ClassLoader) line: not available
> TemporaryClassLoader.loadClass(String, boolean) line: 59
> TemporaryClassLoader.loadClass(String) line: 44
> TemporaryClassLoader(ClassLoader).loadClassInternal(String)
> line: not
> available
> Class.forName0(String, boolean, ClassLoader) line: not available
> [native method]
> Class.forName(String, boolean, ClassLoader) line: not available
> PCClassFileTransformer.needsEnhance(String, Class, byte[])
> line: 186
> PCClassFileTransformer.transform0(String, Class, byte[]) line:
> 132
> PCClassFileTransformer.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: 120
> TransformerManager.transform(ClassLoader, String, Class,
> ProtectionDomain,
> byte[]) line: not available
> InstrumentationImpl.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: not available
> SocketOutputStream.socketWrite(byte[], int, int) line: not
> available
> SocketOutputStream.write(byte[], int, int) line: not available
> BufferedOutputStream.flushBuffer() line: not available
> BufferedOutputStream.flush() line: not available
> PGStream.flush() line: 508
> ProtocolConnectionImpl.close() line: 138
> Jdbc3Connection(AbstractJdbc2Connection).close() line: 516
> Jdbc3Connection(AbstractJdbc2Connection).finalize() line: 834
> Finalizer.invokeFinalizeMethod(Object) line: not available
> [native
> method]
> Finalizer.runFinalizer() line: not available
> Finalizer.access$100(Finalizer) line: not available
> Finalizer$FinalizerThread.run() line: not available
> System Thread [Reference Handler] (Suspended)
> Thread [main] (Suspended)
> ClassLoader.findBootstrapClass(String) line: not available
> [native
> method]
>
> Launcher$ExtClassLoader(ClassLoader).findBootstrapClass0(String) line: not
> available
> Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean)
> line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
> line: not
> available
> Launcher$AppClassLoader.loadClass(String, boolean) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
> line: not
> available
> Class.forName0(String, boolean, ClassLoader) line: not available
> [native method]
> Class.forName(String, boolean, ClassLoader) line: not available
> Package.getPackageInfo() line: not available
> Package.getDeclaredAnnotations() line: not available
> AnnotationPersistenceMetaDataParser.parsePackageAnnotations()
> line: 451
> AnnotationPersistenceMetaDataParser.parse(Class) line: 415
> PersistenceMetaDataFactory.load(Class, int, ClassLoader) line:
> 231
> MetaDataRepository.getMetaDataInternal(Class, ClassLoader)
> line: 489
> MetaDataRepository.getMetaData(Class, ClassLoader, boolean)
> line: 309
> PCClassFileTransformer.needsEnhance(String, Class, byte[])
> line: 188
> PCClassFileTransformer.transform0(String, Class, byte[]) line:
> 132
> PCClassFileTransformer.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: 120
> TransformerManager.transform(ClassLoader, String, Class,
> ProtectionDomain,
> byte[]) line: not available
> InstrumentationImpl.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: not available
> ClassLoader.defineClass1(String, byte[], int, int,
> ProtectionDomain,
> String) line: not available [native method]
> Launcher$AppClassLoader(ClassLoader).defineClass(String,
> byte[], int, int,
> ProtectionDomain) line: not available
> Launcher$AppClassLoader(SecureClassLoader).defineClass(String,
> byte[],
> int, int, CodeSource) line: not available
> Launcher$AppClassLoader(URLClassLoader).defineClass(String,
> Resource)
> line: not available
> URLClassLoader.access$100(URLClassLoader, String, Resource)
> line: not
> available
> URLClassLoader$1.run() line: not available
> AccessController.doPrivileged(PrivilegedExceptionAction,
> AccessControlContext) line: not available [native method]
> Launcher$AppClassLoader(URLClassLoader).findClass(String) line:
> not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
> line: not
> available
> Launcher$AppClassLoader.loadClass(String, boolean) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
> line: not
> available
> JDBCBrokerFactory.newStoreManager() line: 106
>
> JDBCBrokerFactory(AbstractBrokerFactory).initializeBroker(boolean, int,
> BrokerImpl, boolean) line: 224
> JDBCBrokerFactory(AbstractBrokerFactory).newBroker(String,
> String,
> boolean, int, boolean) line: 205
> DelegatingBrokerFactory.newBroker(String, String, boolean, int,
> boolean)
> line: 160
> EntityManagerFactoryImpl.createEntityManager(Map) line: 212
> EntityManagerFactoryImpl.createEntityManager() line: 165
> TestBasicAnnotation.testEagerFetchType() line: 44
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
> line: not
> available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: not
> available
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not
> available
> Method.invoke(Object, Object...) line: not available
> TestBasicAnnotation(TestCase).runTest() line: 154
> TestBasicAnnotation(TestCase).runBare() line: 127
> TestBasicAnnotation(PersistenceTestCase).runBare() line: 466
> TestResult$1.protect() line: 106
> TestResult.runProtected(Test, Protectable) line: 124
> TestResult.run(TestCase) line: 109
> TestBasicAnnotation(TestCase).run(TestResult) line: 118
> TestBasicAnnotation(PersistenceTestCase).run(TestResult) line:
> 181
> TestSuite.runTest(Test, TestResult) line: 208
> TestSuite.run(TestResult) line: 203
> JUnit3TestReference.run(TestExecution) line: 128
> TestExecution.run(ITestReference[]) line: 38
> RemoteTestRunner.runTests(String[], String, TestExecution)
> line: 460
> RemoteTestRunner.runTests(TestExecution) line: 673
> RemoteTestRunner.run() line: 386
> RemoteTestRunner.main(String[]) line: 196
> System Thread [Signal Dispatcher] (Suspended)
> Thread [ReaderThread] (Suspended)
>
>
> MySQL:
>
>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:2016
> (Suspended)
> System Thread [Finalizer] (Suspended)
> Class.forName0(String, boolean, ClassLoader) line: not available
> [native method]
> Class.forName(String, boolean, ClassLoader) line: not available
> TemporaryClassLoader.loadClass(String, boolean) line: 59
> TemporaryClassLoader.loadClass(String) line: 44
> TemporaryClassLoader(ClassLoader).loadClassInternal(String)
> line: not
> available
> Class.forName0(String, boolean, ClassLoader) line: not available
> [native method]
> Class.forName(String, boolean, ClassLoader) line: not available
> PCClassFileTransformer.needsEnhance(String, Class, byte[])
> line: 186
> PCClassFileTransformer.transform0(String, Class, byte[]) line:
> 132
> PCClassFileTransformer.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: 120
> TransformerManager.transform(ClassLoader, String, Class,
> ProtectionDomain,
> byte[]) line: not available
> InstrumentationImpl.transform(ClassLoader, String, Class,
> ProtectionDomain, byte[]) line: not available
> SocketOutputStream.socketWrite(byte[], int, int) line: not
> available
> SocketOutputStream.write(byte[], int, int) line: not available
> BufferedOutputStream.flushBuffer() line: not available
> BufferedOutputStream.flush() line: not available
> MysqlIO.send(Buffer, int) line: 3251
> MysqlIO.quit() line: 1659
> ConnectionImpl.realClose(boolean, boolean, boolean, Throwable)
> line:
> 4296
> ConnectionImpl.cleanup(Throwable) line: 1265
> ConnectionImpl.finalize() line: 2667
> Finalizer.invokeFinalizeMethod(Object) line: not available
> [native
> method]
> Finalizer.runFinalizer() line: not available
> Finalizer.access$100(Finalizer) line: not available
> Finalizer$FinalizerThread.run() line: not available
> System Thread [Reference Handler] (Suspended)
> Thread [main] (Suspended)
> ClassLoader.findBootstrapClass(String) line: not available
> [native
> method]
>
> Launcher$ExtClassLoader(ClassLoader).findBootstrapClass0(String) line: not
> available
> Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean)
> line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
> line: not
> available
> Launcher$AppClassLoader.loadClass(String, boolean) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
> available
> Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
> line: not
> available
> ConnectionImpl.rollback() line:
> 4628
>
> LoggingConnectionDecorator$LoggingConnection_(DelegatingConnection).rollback()
> line:
> 234
>
> LoggingConnectionDecorator$LoggingConnection_(LoggingConnectionDecorator$LoggingConnection).rollback()
> line:
> 398
>
> ConfiguringConnectionDecorator$ConfiguringConnection_(DelegatingConnection).rollback()
> line:
> 234
>
> ConfiguringConnectionDecorator$ConfiguringConnection_(ConfiguringConnectionDecorator$ConfiguringConnection).rollback()
> line: 148
> SchemaTool.executeSQL(String[]) line: 1196
> SchemaTool.deleteTableContents() line: 427
> SchemaTool.run() line: 335
> MappingTool.record(MappingTool$Flags) line: 501
> MappingTool.record() line: 453
> JDBCBrokerFactory.synchronizeMappings(ClassLoader,
> JDBCConfiguration)
> line: 159
> JDBCBrokerFactory.synchronizeMappings(ClassLoader) line: 163
> JDBCBrokerFactory.newBrokerImpl(String, String) line: 119
> JDBCBrokerFactory(AbstractBrokerFactory).newBroker(String,
> String,
> boolean, int, boolean) line: 204
> DelegatingBrokerFactory.newBroker(String, String, boolean, int,
> boolean)
> line: 160
> EntityManagerFactoryImpl.createEntityManager(Map) line: 212
> EntityManagerFactoryImpl.createEntityManager() line: 165
> TestBasicAnnotation.testEagerFetchType() line: 44
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
> line: not
> available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: not
> available
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not
> available
> Method.invoke(Object, Object...) line: not available
> TestBasicAnnotation(TestCase).runTest() line: 154
> TestBasicAnnotation(TestCase).runBare() line: 127
> TestBasicAnnotation(PersistenceTestCase).runBare() line: 466
> TestResult$1.protect() line: 106
> TestResult.runProtected(Test, Protectable) line: 124
> TestResult.run(TestCase) line: 109
> TestBasicAnnotation(TestCase).run(TestResult) line: 118
> TestBasicAnnotation(PersistenceTestCase).run(TestResult) line:
> 181
> TestSuite.runTest(Test, TestResult) line: 208
> TestSuite.run(TestResult) line: 203
> JUnit3TestReference.run(TestExecution) line: 128
> TestExecution.run(ITestReference[]) line: 38
> RemoteTestRunner.runTests(String[], String, TestExecution)
> line: 460
> RemoteTestRunner.runTests(TestExecution) line: 673
> RemoteTestRunner.run() line: 386
> RemoteTestRunner.main(String[]) line: 196
> System Thread [Signal Dispatcher] (Suspended)
> Thread [ReaderThread] (Suspended)
> Thread [MySQL Statement Cancellation Timer] (Suspended)
>
>
> >
> > Milosz -
> >
> > Setting openjpa.DynamicEnhancementAgent to false should not have any affect
> > on your scenario for two reasons. First, when you are using the javaagent
> > for enhancement the dynamic enhancer detects that and will not do any work.
> > Second, the dynamic enhancer depends on an API that exists ONLY on the Sun
> > 1.6 JDK.
> >
> > Let me know if you have any more debug info as I'd be interested in getting
> > to the bottom of the hang that you're observing.
> >
> > -Rick
> > --
> > View this message in context:
> > http://n2.nabble.com/Hang-ups-with--javaagent-tp3072225p3080441.html
> > Sent from the OpenJPA Developers mailing list archive at Nabble.com.
> >
> >
>