[ 
https://issues.apache.org/jira/browse/FELIX-962?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12678777#action_12678777
 ] 

Richard S. Hall commented on FELIX-962:
---------------------------------------

Odd, considering I really didn't try to change it.

That error typically occurs because the call to defineClass() is not properly 
guarded with synchronization when it checks to verify whether the class was 
already loaded or not before defining the class.

Felix actually checks twice if a class is loaded already, once at the beginning 
and then once again before defining the class.

> Erroneous class loading delegation to the application launcher classloader in 
> some cases
> ----------------------------------------------------------------------------------------
>
>                 Key: FELIX-962
>                 URL: https://issues.apache.org/jira/browse/FELIX-962
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>            Reporter: Guillaume Nodet
>            Priority: Critical
>         Attachments: FELIX-962-bis.patch, FELIX-962-quarter.patch, 
> FELIX-962-quinquies.patch, FELIX-962-richard.txt, FELIX-962-ter.patch, 
> FELIX-962.patch
>
>
> Here is an example stack trace:
> {code}
> processstoreimp...@50 daemon, priority=5, in group 'main', status: 'RUNNING'
>         at 
> org.apache.felix.framework.searchpolicy.ModuleImpl.searchDynamicImports(ModuleImpl.java:1,215)
>         at 
> org.apache.felix.framework.searchpolicy.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:558)
>         at 
> org.apache.felix.framework.searchpolicy.ModuleImpl.access$100(ModuleImpl.java:59)
>         at 
> org.apache.felix.framework.searchpolicy.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1,382)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>         at 
> org.apache.felix.framework.searchpolicy.ModuleImpl.getClassByDelegation(ModuleImpl.java:428)
>         at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1,341)
>         at 
> org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:737)
>         at 
> org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
>         at 
> org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>         at 
> org.apache.xbean.classloader.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:184)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
>         at java.lang.ClassLoader.defineClass1(ClassLoader.java:-1)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
>         at 
> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
>         at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
>         at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
>         at 
> java.security.AccessController.doPrivileged(AccessController.java:-1)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>         at 
> org.apache.xbean.classloader.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:200)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
>         at org.apache.openjpa.util.ProxyMaps.afterEntrySet(ProxyMaps.java:74)
>         at org.apache.openjpa.util.java$util$HashMap$proxy.entrySet(Unknown 
> Source:-1)
>         at org.apache.openjpa.util.ProxyMaps.values(ProxyMaps.java:65)
>         at org.apache.openjpa.util.java$util$HashMap$proxy.values(Unknown 
> Source:-1)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:335)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:283)
>         at 
> org.apache.openjpa.kernel.StateManagerImpl.cascadeDelete(StateManagerImpl.java:2,861)
>         at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2,566)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:387)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:372)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:329)
>         at 
> org.apache.openjpa.kernel.SingleFieldManager.delete(SingleFieldManager.java:283)
>         at 
> org.apache.openjpa.kernel.StateManagerImpl.cascadeDelete(StateManagerImpl.java:2,861)
>         at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2,566)
>         at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2,531)
>         at 
> org.apache.openjpa.kernel.DelegatingBroker.delete(DelegatingBroker.java:1,046)
>         at 
> org.apache.openjpa.persistence.EntityManagerImpl.remove(EntityManagerImpl.java:659)
>         at org.apache.ode.store.jpa.JpaObj.delete(JpaObj.java:34)
>         at 
> org.apache.ode.store.jpa.DeploymentUnitDaoImpl.delete(DeploymentUnitDaoImpl.java:114)
>         at 
> org.apache.ode.store.ProcessStoreImpl$3.call(ProcessStoreImpl.java:303)
>         at 
> org.apache.ode.store.ProcessStoreImpl$3.call(ProcessStoreImpl.java:300)
>         at 
> org.apache.ode.store.ProcessStoreImpl$Callable.call(ProcessStoreImpl.java:701)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:123)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
>         at java.lang.Thread.run(Thread.java:613)
> {code}
> The interesting bit is the following exerpt:
> {code}
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
>         at 
> java.security.AccessController.doPrivileged(AccessController.java:-1)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
> {code}
> The current code in ModuleImpl#searchDynamicImports() does not really handle 
> this case.  The reason is that the {{java.net.URLClassLoader$1}} class is an 
> anonymous PrivilegedExceptionAction.
> The result is that the loop is aborted too soon and the launcher classloader 
> is used to delegate the call.   In my application, it leads to all kinds of 
> LinkageError being thrown.
> Note that this problem mostly happen on macs, which has a weird thing in the 
> classloader, trying to handle some org.apache.crimson / org.apache.xalan / 
> org.apache.xml / org.apache.xpath in some weird way.
> Anyway, I have a patch to support this anonymous classes I will attach now.

-- 
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