[jboss-jira] [JBoss JIRA] Commented: (JBRULES-2794) Running More Than 100 Threads Results in ArrayIndexOutOfBoundsException from Drools AbstractHashTable
Mark Proctor (JIRA)
jira-events at lists.jboss.org
Tue Apr 12 18:10:33 EDT 2011
[ https://issues.jboss.org/browse/JBRULES-2794?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12595138#comment-12595138 ]
Mark Proctor commented on JBRULES-2794:
---------------------------------------
The patch fixes the symptom and not the cause. We need to fix at the root of the problem, rather than the tip. In general the WM should lock when first called, there is a Reentrant lock object.
The problem here is an WorkingMemoryReteAssertAction bypasses calling that lock, it's effectively an internal action. Normally this is ok, as the action queue is evaluated by the calling thread which has already gone through the lock:
org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction at 1102fab
at org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:1473)
at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1631)
at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:318)
However in your example we also have WorkingMemoryReteAssertAction being executed directly by a scheduler, which has not gone through the wm lock object:
org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction at 1102fab
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
And it is this that is causing the problem. The answer is to make sure that scheduled tasks are wrapped by an adapter that first calls the wm lock. However first I'd like to know what you are doing that is causing a a scheduled action. My guess is it's either a rule timer or possibly some CEP based rule on tempoeral operators or sliding window. Please let me know, so I can be sure I haven't overlocked something and I can then ensure that those aspects safely schedule actions.
Mark
> Running More Than 100 Threads Results in ArrayIndexOutOfBoundsException from Drools AbstractHashTable
> -----------------------------------------------------------------------------------------------------
>
> Key: JBRULES-2794
> URL: https://issues.jboss.org/browse/JBRULES-2794
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Affects Versions: 5.1.1.FINAL, FUTURE
> Environment: Ubuntu, Intellij / Windows XP, Eclipse
> Reporter: Anatoly Polinsky
> Assignee: Mark Proctor
> Labels: drools-core, drools-flow
> Attachments: AbstractHashTable-thread_localing_a_table_row_.patch
>
> Original Estimate: 1 day
> Remaining Estimate: 1 day
>
> Effected: Drools Flow and Drools Core
> --------------------------------------------------------
> Unfortunately it is not a consistent behaviour, but happens quite often.
> java.util.concurrent.ExecutionException: org.drools.RuntimeDroolsException: Unexpected exception executing action org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction at 1102fab
> at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
> at java.util.concurrent.FutureTask.get(FutureTask.java:83)
> at org.custom.workflow.stress.test.WorkflowStressTest.shouldRunFlow(WorkflowStressTest.java:50)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
> at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
> at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
> at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
> at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
> at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
> at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:94)
> at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:192)
> at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:64)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> Caused by: org.drools.RuntimeDroolsException: Unexpected exception executing action org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction at 1102fab
> at org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:1473)
> at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1631)
> at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:318)
> at org.drools.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:99)
> at org.drools.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:38)
> at org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:285)
> at org.drools.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:193)
> at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
> at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692)
> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
> at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
> at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
> at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
> at org.custom.workflow.stress.test.WorkflowRunner.call(WorkflowRunner.java:18)
> at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
> at java.util.concurrent.FutureTask.run(FutureTask.java:138)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:662)
> Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
> at org.drools.core.util.AbstractHashTable$HashTableIterator.next(AbstractHashTable.java:317)
> at org.drools.reteoo.EntryPointNode.updateSink(EntryPointNode.java:323)
> at org.drools.reteoo.ObjectTypeNode.attach(ObjectTypeNode.java:303)
> at org.drools.reteoo.builder.PatternBuilder.attachObjectTypeNode(PatternBuilder.java:257)
> at org.drools.reteoo.ClassObjectTypeConf.<init>(ClassObjectTypeConf.java:92)
> at org.drools.common.ObjectTypeConfigurationRegistry.getObjectTypeConf(ObjectTypeConfigurationRegistry.java:68)
> at org.drools.reteoo.Rete.assertObject(Rete.java:111)
> at org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:280)
> at org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction.execute(ReteooWorkingMemory.java:360)
> at org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:1471)
> ... 24 more
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list