Uploaded image for project: 'JBRULES'
  1. JBRULES
  2. JBRULES-2346

insert: ConcurrentModificationException on iterate of ObjectTypeConfigurationRegistry#typeConfMap.

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Major
    • 5.1.0.CR1
    • 5.0.1.FINAL
    • drools-core
    • None

    Description

      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() )) {

      Attachments

        1. ClassFieldAccessorCache.java
          16 kB
        2. EntryPointNode.java
          12 kB
        3. JBRULES-2346.diff
          10 kB
        4. JBRULES-2346.patch
          4 kB
        5. ObjectTypeConfigurationRegistry.java
          3 kB

        Issue Links

          Activity

            People

              etirelli@redhat.com Edson Tirelli
              odemura Oleksandr Demura (Inactive)
              Archiver:
              rhn-support-ceverson Clark Everson

              Dates

                Created:
                Updated:
                Resolved:
                Archived:

                PagerDuty