[
https://issues.apache.org/jira/browse/OPENJPA-2538?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14185665#comment-14185665
]
Grzegorz Grzybek commented on OPENJPA-2538:
-------------------------------------------
[~curtisr7], first, {{openjpa.Compatibility = "filterPCRegistryClasses=true"}}
didn't help
second, here's full stack trace (we run Fuse 6.1.GA):
{noformat}
11:55:31,197 | WARN | qtp1699771643-71 | Transaction |
119 - org.apache.aries.transaction.manager - 1.0.1.redhat-610379 | Unexpected
exception from beforeCompletion; transaction will roll back
<openjpa-2.3.0-r422266:1540826 nonfatal general error>
org.apache.openjpa.persistence.PersistenceException: null
at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2031)
at
org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:526)
at
org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:510)
at
org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:412)
at
org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:257)
at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252)
at Proxydb40ea29_c264_41c6_8e03_f3dd26d894c2.commit(Unknown Source)
at
org.apache.aries.transaction.TransactionAttribute$4.finish(TransactionAttribute.java:94)
at
org.apache.aries.transaction.TxInterceptorImpl.postCallWithReturn(TxInterceptorImpl.java:85)
at
org.apache.aries.blueprint.proxy.Collaborator.postInvoke(Collaborator.java:105)
at Proxy3aa5e867_8135_46dd_8dc7_93f91e0da8c7.save(Unknown Source)
at
MY_REST_SERVICE.save(MY_REST_SERVICE.java:60)[284:testOpenJPA:0.0.1.SNAPSHOT]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)[:1.7.0_67]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_67]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_67]
at
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:188)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:104)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:205)[178:org.apache.cxf.cxf-rt-frontend-jaxrs:2.7.0.redhat-610379]
at
org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:102)[178:org.apache.cxf.cxf-rt-frontend-jaxrs:2.7.0.redhat-610379]
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)[167:org.apache.cxf.cxf-api:2.7.0.redhat-610379]
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
javax.servlet.http.HttpServlet.service(HttpServlet.java:595)[94:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0]
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)[173:org.apache.cxf.cxf-rt-transports-http:2.7.0.redhat-610379]
at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:69)[103:org.ops4j.pax.web.pax-web-jetty:3.0.6]
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:219)[103:org.ops4j.pax.web.pax-web-jetty:3.0.6]
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:77)[103:org.ops4j.pax.web.pax-web-jetty:3.0.6]
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.Server.handle(Server.java:370)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[95:org.eclipse.jetty.aggregate.jetty-all-server:8.1.14.v20131031]
at java.lang.Thread.run(Thread.java:745)[:1.7.0_67]
Caused by: java.lang.NullPointerException
at
org.apache.felix.framework.BundleRevisionImpl.getResourceLocal(BundleRevisionImpl.java:536)
at
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1505)
at
org.apache.felix.framework.BundleWiringImpl.getResourceByDelegation(BundleWiringImpl.java:1417)
at
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.getResource(BundleWiringImpl.java:2415)
at
org.apache.openjpa.lib.util.J2DoPrivHelper$14.run(J2DoPrivHelper.java:432)
at
org.apache.openjpa.lib.util.J2DoPrivHelper$14.run(J2DoPrivHelper.java:430)
at java.security.AccessController.doPrivileged(Native Method)[:1.7.0_67]
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.getSourceFile(AnnotationPersistenceMetaDataParser.java:802)
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.getMetaData(AnnotationPersistenceMetaDataParser.java:760)
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parseClassAnnotations(AnnotationPersistenceMetaDataParser.java:545)
at
org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parse(AnnotationPersistenceMetaDataParser.java:415)
at
org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:260)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:587)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:397)
at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:389)
at
org.apache.openjpa.meta.MetaDataRepository.loadRegisteredClassMetaData(MetaDataRepository.java:1617)
at
org.apache.openjpa.meta.MetaDataRepository.getSequenceMetaDataInternal(MetaDataRepository.java:2216)
at
org.apache.openjpa.meta.MetaDataRepository.getSequenceMetaDataInternal(MetaDataRepository.java:2159)
at
org.apache.openjpa.meta.MetaDataRepository.getSequenceMetaData(MetaDataRepository.java:2151)
at
org.apache.openjpa.meta.MetaDataRepository.getSequenceMetaData(MetaDataRepository.java:2178)
at
org.apache.openjpa.meta.FieldMetaData.getValueSequenceMetaData(FieldMetaData.java:1057)
at
org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:157)[281:org.apache.openjpa:2.3.0]
at
org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)[281:org.apache.openjpa:2.3.0]
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:775)
at
org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:493)[281:org.apache.openjpa:2.3.0]
at
org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:469)[281:org.apache.openjpa:2.3.0]
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:759)
at
org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135)
at
org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:592)
at
org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3014)
at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:44)
at
org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1034)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2145)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2105)
at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2023)
... 58 more
{noformat}
So NPE is in Felix, because old {{BundleWiringImpl$BundleClassLoader}} instance
don't have _content_ attached anymore, so we have NPE
[here|https://github.com/apache/felix/blob/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java#L503].
The list from line 498 has null element, because old content is gone.
The real problem is that {{org.apache.openjpa.enhance.PCRegistry#_metas}}
contains N*M classes (N = number of JPA entity classes, M = number of updates
to the bundle which contains those entity classes), but only N of them are from
correct (current) revision. Then all of them are put into
{{org.apache.openjpa.meta.MetaDataRepository#register()}}, so we have them then
in
{{org.apache.openjpa.meta.MetaDataRepository#loadRegisteredClassMetaData()}},
then on each of them
{{org.apache.openjpa.meta.MetaDataRepository#getMetaDataInternal()}} is invoked
which leads us to the classloaders of the classes.
Do you need more info from me?
regards
Grzegorz Grzybek
> Classloader memory leak in PCRegistry
> -------------------------------------
>
> Key: OPENJPA-2538
> URL: https://issues.apache.org/jira/browse/OPENJPA-2538
> Project: OpenJPA
> Issue Type: Bug
> Components: Enhance, osgi
> Affects Versions: 2.3.0
> Reporter: Grzegorz Grzybek
> Priority: Critical
>
> I'm using OpenJPA in OSGi environment (namely: JBoss Fuse 6.1). We had nasty
> {{NullPointerException}} in Felix when trying to load source code during
> initialization of class metadata. [This
> line|https://github.com/apache/openjpa/blob/2.3.0/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java#L1614]
> returned duplicate entity classes - half of them were from old revision of a
> bundle and half - from new revision.
> I tracked down the problem to the point, where
> {{org.apache.openjpa.enhance.PCRegistry#register()}} was invoked as part of
> constructing new instances of entity classes (static initialization injected
> during class enhancement). Although {{_metas}} is instance of
> {{ConcurrentReferenceHashMap}} with weak keys, the keys (entity classes) had
> other hard references too. Here's a list of the hard refs I got from simple
> heap dump:
> * org.apache.openjpa.meta.MetaDataRepository#_impls
> * org.apache.openjpa.meta.InheritanceComparator#_base
> * org.apache.openjpa.enhance.PCRegistry.Meta#pcSuper
> * org.apache.openjpa.meta.MetaDataRepository#_oids
> so on every bundle refresh we have next bunch of classes in {{_metas}}...
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)