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中会修复

https://issues.apache.org/jira/browse/TUSCANY-1179?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

但是暂时还没有找到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能解决类似问题

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009