-
Bug
-
Resolution: Done
-
Major
-
5.0.1.FINAL
-
None
Very rare exception occurs in multi-threaded environment, each thread processes series of rule evaluations with recreation of StatefulSession after each:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:1091)
at java.util.HashMap$ValueIterator.next(HashMap.java:1122)
at org.drools.reteoo.EntryPointNode.updateSink(EntryPointNode.java:285)
at org.drools.reteoo.ObjectTypeNode.attach(ObjectTypeNode.java:279)
at org.drools.reteoo.builder.PatternBuilder.attachObjectTypeNode(PatternBuilder.java:234)
at org.drools.reteoo.ClassObjectTypeConf.<init>(ClassObjectTypeConf.java:93)
at org.drools.common.ObjectTypeConfigurationRegistry.getObjectTypeConf(ObjectTypeConfigurationRegistry.java:58)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:849)
at org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:114)
at org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:108)
Problem is caused by cyclic dependency.
ObjectTypeConfigurationRegistry#getObjectTypeConf(EntryPoint, Object)
creates ClassObjectTypeConf to put into ObjectTypeConfigurationRegistry#typeConfMap,
creation code relies on EntryPointNode#updateSink(ObjectSink, PropagationContext, InternalWorkingMemory),
which iterates on ObjectTypeConfigurationRegistry#typeConfMap.
I can't reproduce it on 5.1.0.M1 now, but because of rare reproduction.
Source looks like have this bug yet.
Used workaround for it:
EntryPointNode#updateSink(ObjectSink, PropagationContext, InternalWorkingMemory) iterates on copy of ObjectTypeConfigurationRegistry#typeConfMap:
for ( ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values() ) {
->
for ( ObjectTypeConf objectTypeConf : new ArrayList<ObjectTypeConf>(
new wmEntryPoint.getObjectTypeConfigurationRegistry().values() )) {
- is duplicated by
-
JBRULES-2418 Drools Session insert ConcurrentModificationException in Multithreading Enviroment
- Closed
-
JBRULES-2443 org.drools.runtime.rule.ConsequenceException caused by java.util.ConcurrentModificationException
- Closed
-
JBRULES-2556 ConcurrentModificationException on EntryPoint
- Closed
- relates to
-
JBRULES-1888 Concurrency issue in MultithreadedTest
- Closed