[ 
https://issues.apache.org/jira/browse/GERONIMO-4458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12656168#action_12656168
 ] 

David Jencks commented on GERONIMO-4458:
----------------------------------------

I talked with Kevan on irc for a bit.

I don't think the context classloader enters into the question at all.

I think the problem is caused directly by trying to enhance a class in a parent 
classloader of the enhancer.

Putting all the enhancers in the primordial classloader will obviously fix this 
problem but maybe this is more than is needed.  In our system, enhancers are 
installed at arbitrary times in the server.  They can't expect to be able to 
enhance classes in their parent classloaders because those classes might have 
already been loaded.

Therefore we ought to be able to solve the problem by wrapping enhancers in 
something that checks that the classloader supplied to transform is not a 
parent of the enhancer's classloader.

something like

public class ClassFileTransformerWrapper implements ClassFileTransformer  {

private final ClassFIleTransformer delegate;
private final IdentityHashSet parents;

//constructor
    
    public byte[] transform(java.lang.ClassLoader classLoader, java.lang.String 
s, java.lang.Class<?> aClass, java.security.ProtectionDomain protectionDomain, 
byte[] bytes) throws java.lang.instrument.IllegalClassFormatException {

         if (parents.contans(classLoader) return null;
         return delegate.transform(classLoader, s, aClasss, protectionDoemain, 
bytes);
    }
}



> Another ClassLoader deadlock during server startup
> --------------------------------------------------
>
>                 Key: GERONIMO-4458
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-4458
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>    Affects Versions: 2.2
>            Reporter: Kevan Miller
>            Priority: Critical
>             Fix For: 2.2
>
>
> G 2.2 TCK testing is running into a ClassLoader deadlock. Here are the 
> stacktraces:
> {noformat}
> Found one Java-level deadlock:
> =============================
> "RMI TCP Connection(4)-9.42.75.229":
>  waiting to lock monitor 0x0849be70 (object 0xd57192c8, a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader),
>  which is held by "main"
> "main":
>  waiting to lock monitor 0x0849bed4 (object 0xd50ca400, a 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader),
>  which is held by "RMI TCP Connection(4)-9.42.75.229"
> Java stack information for the threads listed above:
> ===================================================
> "RMI TCP Connection(4)-9.42.75.229":
>        at 
> org.aspectj.weaver.tools.WeavingAdaptor$WeavingAdaptorMessageHolder.<init>(WeavingAdaptor.java:498)
>        at 
> org.aspectj.weaver.tools.WeavingAdaptor.createMessageHandler(WeavingAdaptor.java:179)
>        at 
> org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:111)
>        at 
> org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:151)
>        at 
> org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:156)
>        at 
> org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:122)
>        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:73)
>        - locked <0xd4f23b40> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:52)
>        at 
> org.apache.geronimo.transformer.TransformerCollection.transform(TransformerCollection.java:43)
>        at 
> sun.instrument.TransformerManager.transform(TransformerManager.java:169)
>        at 
> sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
>        at java.lang.ClassLoader.defineClass1(Native Method)
>        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
>        at 
> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
>        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
>        at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
>        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClassInternal(MultiParentClassLoader.java:455)
>        - locked <0xd4f23b40> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:69)
>        - locked <0xd4ea35c8> (a 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:52)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.checkParents(MultiParentClassLoader.java:483)
>        - locked <0xd50ca440> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClassInternal(MultiParentClassLoader.java:441)
>        - locked <0xd50ca440> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:69)
>        - locked <0xd50ca400> (a 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:52)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.checkParents(MultiParentClassLoader.java:483)
>        - locked <0xd51f63e8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadOptimizedClass(MultiParentClassLoader.java:392)
>        - locked <0xd51f63e8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:255)
>        - locked <0xd51f63e8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
>        - locked <0xd51f63e8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at java.lang.Class.getDeclaredConstructors0(Native Method)
>        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
>        at java.lang.Class.getConstructor0(Class.java:2699)
>        at java.lang.Class.newInstance0(Class.java:326)
>        at java.lang.Class.newInstance(Class.java:308)
>        at 
> org.apache.geronimo.security.jaas.ClassOptionLoginModule.initialize(ClassOptionLoginModule.java:50)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>        at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at javax.security.auth.login.LoginContext.invoke(LoginContext.java:756)
>        at 
> javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
>        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at 
> javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
>        at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
>        at 
> org.apache.geronimo.jmxremoting.Authenticator.authenticate(Authenticator.java:68)
>        at 
> javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
>        at 
> javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>        at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
>        at sun.rmi.transport.Transport$1.run(Transport.java:159)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
>        at 
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
>        at 
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
>        at 
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
>        at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>        at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>        at java.lang.Thread.run(Thread.java:619)
> "main":
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:61)
>        - waiting to lock <0xd50ca400> (a
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:52)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.checkParents(MultiParentClassLoader.java:483)
>        - locked <0xd51edbf8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClassInternal(MultiParentClassLoader.java:441)
>        - locked <0xd51edbf8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:69)
>        - locked <0xd51eec50> (a 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader)
>        at 
> org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader.loadClass(ChildrenConfigurationClassLoader.java:52)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.checkParents(MultiParentClassLoader.java:483)
>        - locked <0xd57192c8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadOptimizedClass(MultiParentClassLoader.java:392)
>        - locked <0xd57192c8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:255)
>        - locked <0xd57192c8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
>        - locked <0xd57192c8> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.aspectj.weaver.tools.WeavingAdaptor$WeavingAdaptorMessageHolder.<init>(WeavingAdaptor.java:498)
>        at 
> org.aspectj.weaver.tools.WeavingAdaptor.createMessageHandler(WeavingAdaptor.java:179)
>        at 
> org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:111)
>        at 
> org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:151)
>        at 
> org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:156)
>        at 
> org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:122)
>        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:73)
>        - locked <0xd5712f78> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:52)
>        at 
> org.apache.geronimo.transformer.TransformerCollection.transform(TransformerCollection.java:43)
>        at 
> sun.instrument.TransformerManager.transform(TransformerManager.java:169)
>        at 
> sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
>        at java.lang.ClassLoader.defineClass1(Native Method)
>        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
>        at 
> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
>        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
>        at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
>        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadOptimizedClass(MultiParentClassLoader.java:407)
>        - locked <0xd5712f78> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at 
> org.apache.geronimo.kernel.config.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:255)
>        - locked <0xd5712f78> (a 
> org.apache.geronimo.kernel.config.MultiParentClassLoader)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>        at 
> org.apache.geronimo.gbean.runtime.GBeanInstance.<init>(GBeanInstance.java:228)
>        at 
> org.apache.geronimo.kernel.basic.BasicKernel.loadGBean(BasicKernel.java:352)
>        at 
> org.apache.geronimo.kernel.config.ConfigurationUtil.startConfigurationGBeans(ConfigurationUtil.java:441)
>        at 
> org.apache.geronimo.kernel.config.KernelConfigurationManager.start(KernelConfigurationManager.java:190)
>        at 
> org.apache.geronimo.kernel.config.SimpleConfigurationManager.startConfiguration(SimpleConfigurationManager.java:562)
>        - locked <0xd500a750> (a 
> org.apache.geronimo.kernel.config.EditableKernelConfigurationManager)
>        at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
>        at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at 
> org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34)
>        at 
> org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:130)
>        at 
> org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:815)
>        at 
> org.apache.geronimo.gbean.runtime.RawInvoker.invoke(RawInvoker.java:57)
>        at 
> org.apache.geronimo.kernel.basic.RawOperationInvoker.invoke(RawOperationInvoker.java:35)
>        at 
> org.apache.geronimo.kernel.basic.ProxyMethodInterceptor.intercept(ProxyMethodInterceptor.java:96)
>        at 
> org.apache.geronimo.gbean.GBeanLifecycle$$EnhancerByCGLIB$$752a2ecb.startConfiguration(<generated>)
>        at 
> org.apache.geronimo.system.main.EmbeddedDaemon.doStartup(EmbeddedDaemon.java:161)
>        at 
> org.apache.geronimo.system.main.EmbeddedDaemon.execute(EmbeddedDaemon.java:78)
>        at 
> org.apache.geronimo.kernel.util.MainConfigurationBootstrapper.main(MainConfigurationBootstrapper.java:45)
>        at org.apache.geronimo.cli.AbstractCLI.executeMain(AbstractCLI.java:65)
>        at org.apache.geronimo.cli.daemon.DaemonCLI.main(DaemonCLI.java:30)
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to