tuscany lazy metada 初始化bug 2008-07-26 02:04
今天对基于tuscany 做的edi tracing平台做压力测试发现一些问题
10个线程,每个跑100个请求,严格并发
最终结果是成功插入836个请求,memory消耗230M,CPU(1.4GMz) 100%
不成功的16.4%的请求都是由于并发竞争引发的例外导致的
java.util.ConcurrentModificationException
at org.eclipse.emf.common.util.BasicEList$EIterator.checkModCount(BasicEList.java:1327)
at org.eclipse.emf.common.util.BasicEList$EIterator.next(BasicEList.java:1275)
at org.eclipse.xsd.impl.XSDSchemaImpl.changeReference(XSDSchemaImpl.java:2432)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.eNotify(XSDConcreteComponentImpl.java:1221)
at org.eclipse.emf.ecore.util.EcoreEList.dispatchNotification(EcoreEList.java:234)
at org.eclipse.emf.common.notify.impl.NotifyingListImpl.addUnique(NotifyingListImpl.java:302)
at org.eclipse.emf.common.util.BasicEList.add(BasicEList.java:600)
at org.eclipse.xsd.impl.XSDSchemaImpl.imported(XSDSchemaImpl.java:2985)
at org.eclipse.xsd.impl.XSDImportImpl.handleResolvedSchema(XSDImportImpl.java:424)
at org.eclipse.xsd.impl.XSDSchemaDirectiveImpl.resolve(XSDSchemaDirectiveImpl.java:387)
at org.eclipse.xsd.impl.XSDImportImpl.importSchema(XSDImportImpl.java:411)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveSchema(XSDSchemaImpl.java:2136)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveNamedComponent(XSDSchemaImpl.java:2164)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveSimpleTypeDefinition(XSDSchemaImpl.java:2240)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.resolveSimpleTypeDefinition(XSDConcreteComponentImpl.java:2374)
at org.eclipse.xsd.impl.XSDAttributeDeclarationImpl.patch(XSDAttributeDeclarationImpl.java:189)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.patch(XSDConcreteComponentImpl.java:526)
at org.eclipse.xsd.impl.XSDSchemaImpl.patch(XSDSchemaImpl.java:1505)
at org.eclipse.xsd.impl.XSDSchemaImpl.changeAttribute(XSDSchemaImpl.java:2335)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.eNotify(XSDConcreteComponentImpl.java:1240)
at org.eclipse.xsd.impl.XSDSchemaImpl.setSchemaLocation(XSDSchemaImpl.java:829)
at org.eclipse.xsd.util.XSDResourceImpl.doLoad(XSDResourceImpl.java:756)
at org.eclipse.xsd.util.XSDResourceImpl.load(XSDResourceImpl.java:617)
at org.apache.tuscany.sdo.helper.XSDHelperImpl.define(XSDHelperImpl.java:233)
at org.apache.tuscany.sdo.helper.XSDHelperImpl.define(XSDHelperImpl.java:224)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:50)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:59)
at org.apache.tuscany.das.rdb.impl.ReadCommandImpl.<init>(ReadCommandImpl.java:48)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:77)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:60)
at org.apache.tuscany.das.rdb.impl.DASFactoryImpl.createDAS(DASFactoryImpl.java:31)
at com.coscon.das.utility.DASHelper.getDASViaStream(DASHelper.java:51)
at com.coscon.editracing.bizcomponent.ComponentBase.getBrandNewDas(ComponentBase.java:58)
at com.coscon.editracing.bizcomponent.EdiTracingComponent.addProcessNodeStatus(EdiTracingComponent.java:126)
at sun.reflect.GeneratedMethodAccessor267.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
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.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:401)
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(Unknown Source)
而且出现exception的时候效率变得非常低
觉得应该是tuscany在底层实现的时候没有处理好并发竞争BasicEList中数据修改访问的控制
查网上信息得到
http://markmail.org/message/jtvqc2rhk7zugudr
| Subject: | [jira] Updated: (TUSCANY-1179) Race condition due to lazy metada initialization when SDO is shared across threads for read intent![]() |
|---|---|
| From: | Kelvin Goodson (JIRA) (tuschttps://issues.apache.org/jira/browse/TUSCANY-1179?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
] Kelvin Goodson updated TUSCANY-1179: ------------------------------------ Patch Info: [Patch Available] Fix Version/s: Java-SDO-Mx Setting patch available=true, and target fix version to SDO-Java-Mx Race condition due to lazy metada initialization when SDO is shared across threads for read intent -------------------------------------------------------------------------------------------------- Key: TUSCANY-1179 URL: https://issues.apache.org/jira/browse/TUSCANY-1179 Project: Tuscany Issue Type: Bug Components: Java SDO Implementation Environment: ALL Reporter: Hasan Muhammad Fix For: Java-SDO-Mx Attachments: 1179.patch, CreateDataObjectMultiThreadedTestCase.java An a DataObject is being shared across multiple threads for read-only purpose ( no modification), due to lazy metadata initialization, we have a race condition which results in different exceptions at different times ( ConcurrentModificationException, NoSuchElementException). The following is one trace; java.util.ConcurrentModificationException at org.eclipse.emf.common.util.BasicEList$EIterator.checkModCount(BasicEList.java:1327) at org.eclipse.emf.common.util.BasicEList$EIterator.next(BasicEList.java:1275) at org.apache.tuscany.sdo.impl.ClassImpl.initAliasNames(ClassImpl.java:404) at org.apache.tuscany.sdo.impl.ClassImpl.getProperty(ClassImpl.java:423) at org.apache.tuscany.sdo.util.DataObjectUtil.get(DataObjectUtil.java:731) at org.apache.tuscany.sdo.impl.DataObjectImpl.get(DataObjectImpl.java:216) at org.apache.tuscany.sdo.impl.DataObjectImpl.getDataObject(DataObjectImpl.java:326) at org.apache.tuscany.sdo.test.CreateDataObjectMultiThreadedTestCase$CreateDataObjectMultiThread.runTest(CreateDataObjectMultiThreadedTestCase.java:67) at net.sourceforge.groboutils.junit.v1.TestRunnable.run(TestRunnable.java:154) at java.lang.Thread.run(Thread.java:797) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: tusc...@ws.apache.org For additional commands, e-mail: tusc...@ws.apache.org 宣称在SDO-JAVA-MX中会修复 |
但是暂时还没有找到release这个问题的版本
借鉴SDO实现时候ClassImpl的修复
我们可以看看DAS实现中,DASImpl的实现可能存在类似问题
at org.apache.tuscany.sdo.helper.XSDHelperImpl.define(XSDHelperImpl.java:224)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:50)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:59)
at org.apache.tuscany.das.rdb.impl.ReadCommandImpl.<init>(ReadCommandImpl.java:48)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:77)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:60)
at org.apache.tuscany.das.rdb.impl.DASFactoryImpl.createDAS(DASFactoryImpl.java:31)
at com.coscon.das.utility.DASHelper.getDASViaStream(DASHelper.java:51)
----------------------
发了邮件给TUSCANY.APACHE.ORG的userlist
Dear Sir or Madam,
Tuscany DAS 1.0 beta2 may have concurrent Modification problem under stress testing environment
The following Exception at org.eclipse.emf.common.util.BasicEList$EIterator.checkModCount(BasicEList.java:1327)
surely occurred when concurrently invoke org.apache.tuscany.das.rdb.impl.DASFactoryImpl.createDAS
Test Case 1:
Generated 10 threads concurrently, each thread does 100 insert commands in loop, 500 request in total, finally I got 55 request failed, above 11% fail rate, all was caused by the following exception
Test Case 2:
Generated 2 threads concurrently, each thread does 100 insert commands in loop, 200 request in total, finally I got 5 request failed, about 2.5% fail rate, all was caused by the following exception
WAS CE 2.0.0.2
CPU 1.4MHZ centrino, 1.25G memory(512m was used on WAS CE server instance)
SYBASE 12.5
DAS was configured using database pool on WASCE
I am wondering if there would be a hot fix on it
Thank you
Best Regards
Michael
java.util.ConcurrentModificationException
at org.eclipse.emf.common.util.BasicEList$EIterator.checkModCount(BasicEList.java:1327)
at org.eclipse.emf.common.util.BasicEList$EIterator.next(BasicEList.java:1275)
at org.eclipse.xsd.impl.XSDSchemaImpl.changeReference(XSDSchemaImpl.java:2432)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.eNotify(XSDConcreteComponentImpl.java:1221)
at org.eclipse.emf.ecore.util.EcoreEList.dispatchNotification(EcoreEList.java:234)
at org.eclipse.emf.common.notify.impl.NotifyingListImpl.addUnique(NotifyingListImpl.java:302)
at org.eclipse.emf.common.util.BasicEList.add(BasicEList.java:600)
at org.eclipse.xsd.impl.XSDSchemaImpl.imported(XSDSchemaImpl.java:2985)
at org.eclipse.xsd.impl.XSDImportImpl.handleResolvedSchema(XSDImportImpl.java:424)
at org.eclipse.xsd.impl.XSDSchemaDirectiveImpl.resolve(XSDSchemaDirectiveImpl.java:387)
at org.eclipse.xsd.impl.XSDImportImpl.importSchema(XSDImportImpl.java:411)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveSchema(XSDSchemaImpl.java:2136)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveNamedComponent(XSDSchemaImpl.java:2164)
at org.eclipse.xsd.impl.XSDSchemaImpl.resolveSimpleTypeDefinition(XSDSchemaImpl.java:2240)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.resolveSimpleTypeDefinition(XSDConcreteComponentImpl.java:2374)
at org.eclipse.xsd.impl.XSDAttributeDeclarationImpl.patch(XSDAttributeDeclarationImpl.java:189)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.patch(XSDConcreteComponentImpl.java:526)
at org.eclipse.xsd.impl.XSDSchemaImpl.patch(XSDSchemaImpl.java:1505)
at org.eclipse.xsd.impl.XSDSchemaImpl.changeAttribute(XSDSchemaImpl.java:2335)
at org.eclipse.xsd.impl.XSDConcreteComponentImpl.eNotify(XSDConcreteComponentImpl.java:1240)
at org.eclipse.xsd.impl.XSDSchemaImpl.setSchemaLocation(XSDSchemaImpl.java:829)
at org.eclipse.xsd.util.XSDResourceImpl.doLoad(XSDResourceImpl.java:756)
at org.eclipse.xsd.util.XSDResourceImpl.load(XSDResourceImpl.java:617)
at org.apache.tuscany.sdo.helper.XSDHelperImpl.define(XSDHelperImpl.java:233)
at org.apache.tuscany.sdo.helper.XSDHelperImpl.define(XSDHelperImpl.java:224)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:50)
at org.apache.tuscany.das.rdb.impl.CommandImpl.<init>(CommandImpl.java:59)
at org.apache.tuscany.das.rdb.impl.WriteCommandImpl.<init>(WriteCommandImpl.java:37)
at org.apache.tuscany.das.rdb.impl.InsertCommandImpl.<init>(InsertCommandImpl.java:30)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:81)
at org.apache.tuscany.das.rdb.impl.DASImpl.<init>(DASImpl.java:60)
at org.apache.tuscany.das.rdb.impl.DASFactoryImpl.createDAS(DASFactoryImpl.java:31)
希望他们能联系emf项目,下个patch release能解决类似问题