You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by "Donald Woods (JIRA)" <ji...@apache.org> on 2007/09/25 21:30:52 UTC

[jira] Closed: (GERONIMO-3363) ArrayList thread safe problem in OpenJPA

     [ https://issues.apache.org/jira/browse/GERONIMO-3363?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Donald Woods closed GERONIMO-3363.
----------------------------------

       Resolution: Fixed
    Fix Version/s:     (was: 2.0.x)
                   2.1
                   2.0.2

Fixed in OpenJPA right after we cut our revision for 2.0/2.0.1 release.
By picking up the final 1.0.0 release, we will have the fix.

> ArrayList thread safe problem in OpenJPA
> ----------------------------------------
>
>                 Key: GERONIMO-3363
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-3363
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: persistence
>    Affects Versions: 2.0
>            Reporter: YunFeng Ma
>            Assignee: Donald Woods
>             Fix For: 2.0.2, 2.1
>
>
> When running stress testing using DayTrader with JPA mode, got a lot of ArrayList thread safe problem.
> The thread safe problem happened in  org.apache.openjpa.kernel.AbstractBrokerFactory.syncWithManagedTransaction, but this method has the following comments:
>             // we don't need to synchronize on brokers or guard against multiple
>             // threads using the same trans since one JTA transaction can never
>             // be active on multiple concurrent threads.
>             Collection brokers = (Collection) _transactional.get(trans);
>             if (brokers == null) {
>                 brokers = new ArrayList(2);
>                 _transactional.put(trans, brokers);
>                 trans.registerSynchronization(new RemoveTransactionSync(trans));
>             }
>             brokers.add(broker);
> Does this mean that it's Geronimo which causes the thread safe problem?
> The exception stack:
> java.rmi.RemoteException: The bean encountered a non-application exception.; nested exception is:
>         javax.ejb.EJBException: TradeBean.getClosedOrders - error
>         at org.apache.openejb.core.transaction.TransactionPolicy.throwExceptionToServer(TransactionPolicy.java:211)
>         at org.apache.openejb.core.transaction.TxRequired.handleSystemException(TxRequired.java:106)
>         at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:210)
>         at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:165)
>         at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:211)
>         at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:65)
>         at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
>         at org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke(Jdk13InvocationHandler.java:49)
>         at $Proxy109.getClosedOrders(Unknown Source)
>         at org.apache.geronimo.samples.daytrader.TradeAction.getClosedOrders(TradeAction.java:276)
>         at org.apache.geronimo.samples.daytrader.web.OrdersAlertFilter.doFilter(OrdersAlertFilter.java:76)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>         at org.apache.geronimo.tomcat.valve.DefaultSubjectValve.invoke(DefaultSubjectValve.java:56)
>         at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:351)
>         at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47)
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
>         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>         at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
>         at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>         at java.lang.Thread.run(Thread.java:801)
> Caused by: javax.ejb.EJBException: TradeBean.getClosedOrders - error
>         at org.apache.geronimo.samples.daytrader.TradeJPA.getClosedOrders(TradeJPA.java:491)
>         at sun.reflect.GeneratedMethodAccessor324.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:615)
>         at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext
> .java:146)
>         at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:129)
>         at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:67)
>         at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:203)
>         ... 24 more
> Caused by: <1.0.0-SNAPSHOT-SNAPSHOT nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null
>         at org.apache.openjpa.kernel.AbstractBrokerFactory.syncWithManagedTransaction(AbstractBrokerFactory.java:738)
>         at org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:305)
>         at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:186)
>         at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
>         at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:190
> )
>         at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:55)
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.createEntityManager(CMPEntityManagerTxScoped.java:74
> )
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.getEntityManager(CMPEntityManagerTxScoped.java:55)
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.createNamedQuery(CMPEntityManagerTxScoped.java:259)
>         at org.apache.geronimo.samples.daytrader.TradeJPA.getClosedOrders(TradeJPA.java:470)
>         ... 31 more
> Caused by: java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException
>         at org.apache.openjpa.util.Exceptions.replaceNestedThrowables(Exceptions.java:242)
>         at org.apache.openjpa.persistence.PersistenceException.writeObject(PersistenceException.java:100)
>         at sun.reflect.GeneratedMethodAccessor344.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:615)
>         at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:972)
>         at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1426)
>         at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1377)
>         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)
>         at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1462)
>         at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:413)
>         at java.lang.Throwable.writeObject(Throwable.java:320)
>         at sun.reflect.GeneratedMethodAccessor341.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:615)
>         at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:972)
>         at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1426)
>         at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1377)
>         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)
>         at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1462)
>         at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1434)
>         at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1377)
>         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)
>         at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:324)
>         at org.apache.openejb.core.ivm.BaseEjbProxyHandler.copyObj(BaseEjbProxyHandler.java:491)
>         at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:237)
>         ... 20 more
> 20:00:40,656 ERROR [OpenEJB] The bean instances business method encountered a system exception: null
> <1.0.0-SNAPSHOT-SNAPSHOT nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null
>         at org.apache.openjpa.kernel.AbstractBrokerFactory.syncWithManagedTransaction(AbstractBrokerFactory.java:738)
>         at org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:305)
>         at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:186)
>         at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
>         at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:190
> )
>         at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:55)
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.createEntityManager(CMPEntityManagerTxScoped.java:74
> )
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.getEntityManager(CMPEntityManagerTxScoped.java:55)
>         at org.apache.geronimo.persistence.CMPEntityManagerTxScoped.find(CMPEntityManagerTxScoped.java:123)
>         at org.apache.geronimo.samples.daytrader.TradeJPA.getQuote(TradeJPA.java:201)
>         at sun.reflect.GeneratedMethodAccessor330.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:615)
>         at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext
> .java:146)
>         at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:129)
>         at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:67)
>         at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:203)
>         at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:165)
>         at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:211)
>         at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:65)
>         at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
>         at org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke(Jdk13InvocationHandler.java:49)
>         at $Proxy109.getQuote(Unknown Source)
>         at org.apache.geronimo.samples.daytrader.TradeAction.getQuote(TradeAction.java:328)
>         at org.apache.geronimo.samples.daytrader.web.TradeServletAction.doPortfolio(TradeServletAction.java:518)
>         at org.apache.geronimo.samples.daytrader.web.TradeAppServlet.performTask(TradeAppServlet.java:165)
>         at org.apache.geronimo.samples.daytrader.web.TradeAppServlet.doGet(TradeAppServlet.java:77)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at org.apache.geronimo.samples.daytrader.web.OrdersAlertFilter.doFilter(OrdersAlertFilter.java:91)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>         at org.apache.geronimo.tomcat.valve.DefaultSubjectValve.invoke(DefaultSubjectValve.java:56)
>         at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:351)
>         at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47)
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
>         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>         at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
>         at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>         at java.lang.Thread.run(Thread.java:801)
> Caused by:
> java.lang.ArrayIndexOutOfBoundsException
>         at java.util.ArrayList.add(ArrayList.java:378)
>         at org.apache.openjpa.kernel.AbstractBrokerFactory.syncWithManagedTransaction(AbstractBrokerFactory.java:732)
>         ... 47 more
> The problem can be easy fixed by changing the following line:
>         brokers = new ArrayList(2); --> brokers = Collections.synchronizedCollection(new ArrayList(2));
> But not sure it's whose problem.

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