Uploaded image for project: 'Magnolia Workflow Module'
  1. Magnolia Workflow Module
  2. MGNLWORKFLOW-307

Concurrent modification when persisting processes

    XMLWordPrintable

Details

    • Bug
    • Resolution: Obsolete
    • Neutral
    • None
    • 5.4, 5.5
    • None
    • None

    Description

      These are assumptions and should be verified:
      Compared to jBPM's persistency using JPA we do not use transactions for storing processes, instead we eagerly persist the status under certain conditions.

      org.drools.persistence.SimpleSessionCommandService is where the transactions would be committed or rolled back.

      Here's where we decide when to persist:
      org.jbpm.persistence.JcrPersistProcessInterceptor#isValidCommand

      IMO this is the reason that we sometimes run into ConcurrentModificationExceptions.

      Here's the stacktrace:

      2015-07-15 15:53:54,727 INFO  info.magnolia.module.scheduler.CommandJob         : Starting job [asyncCommand1436968434726]...
      2015-07-15 15:53:54,733 WARN  info.magnolia.event.SimpleEventBus                : Exception caught when dispatching a class info.magnolia.task.event.TaskEvent event with class info.magnolia.module.workflow.jbpm.humantask.ProcessTaskEventHandler eventHandler.
      org.jbpm.workflow.instance.WorkflowRuntimeException: [info.magnolia.workflow.ReviewForPublication:1,436,967,381,809 - Publication:4] -- null
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:177)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:364)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:379)
      	at org.jbpm.workflow.instance.node.SplitInstance.executeStrategy(SplitInstance.java:117)
      	at org.jbpm.workflow.instance.node.SplitInstance.internalTrigger(SplitInstance.java:63)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:171)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:364)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:323)
      	at org.jbpm.workflow.instance.impl.ExtendedNodeInstanceImpl.triggerCompleted(ExtendedNodeInstanceImpl.java:44)
      	at org.jbpm.workflow.instance.node.StateBasedNodeInstance.triggerCompleted(StateBasedNodeInstance.java:341)
      	at org.jbpm.workflow.instance.node.StateBasedNodeInstance.triggerCompleted(StateBasedNodeInstance.java:318)
      	at org.jbpm.workflow.instance.node.WorkItemNodeInstance.triggerCompleted(WorkItemNodeInstance.java:316)
      	at org.jbpm.workflow.instance.node.HumanTaskNodeInstance.triggerCompleted(HumanTaskNodeInstance.java:93)
      	at org.jbpm.workflow.instance.node.WorkItemNodeInstance.workItemCompleted(WorkItemNodeInstance.java:378)
      	at org.jbpm.workflow.instance.node.WorkItemNodeInstance.signalEvent(WorkItemNodeInstance.java:354)
      	at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.signalEvent(WorkflowProcessInstanceImpl.java:434)
      	at org.drools.persistence.jcr.processinstance.JcrWorkItemManager.completeWorkItem(JcrWorkItemManager.java:168)
      	at org.drools.core.command.runtime.process.CompleteWorkItemCommand.execute(CompleteWorkItemCommand.java:75)
      
      ....
      
      used by: java.util.ConcurrentModificationException
      	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
      	at java.util.HashMap$EntryIterator.next(HashMap.java:962)
      	at java.util.HashMap$EntryIterator.next(HashMap.java:960)
      	at java.util.HashMap.writeObject(HashMap.java:1127)
      	at sun.reflect.GeneratedMethodAccessor660.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
      	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
      	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
      	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
      	at java.util.ArrayList.writeObject(ArrayList.java:742)
      	at sun.reflect.GeneratedMethodAccessor675.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
      	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
      	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
      	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
      	at java.util.HashMap.writeObject(HashMap.java:1129)
      	at sun.reflect.GeneratedMethodAccessor660.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
      	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
      	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
      	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
      	at java.util.ArrayList.writeObject(ArrayList.java:742)
      	at sun.reflect.GeneratedMethodAccessor675.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
      	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
      	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
      	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
      	at org.drools.core.marshalling.impl.SerializablePlaceholderResolverStrategy$SerializablePlaceholderStrategyContext.write(SerializablePlaceholderResolverStrategy.java:97)
      	at org.drools.core.marshalling.impl.PersisterHelper.writeStrategiesIndex(PersisterHelper.java:218)
      	at org.drools.core.marshalling.impl.PersisterHelper.writeToStreamWithHeader(PersisterHelper.java:198)
      	at org.jbpm.persistence.processinstance.ProcessInstanceInfo.transform(ProcessInstanceInfo.java:221)
      	at org.jbpm.persistence.JcrPersistProcessInterceptor$PersistProcessCommand.execute(JcrPersistProcessInterceptor.java:109)
      	at org.jbpm.persistence.JcrPersistProcessInterceptor$PersistProcessCommand.execute(JcrPersistProcessInterceptor.java:88)
      	at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36)
      	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
      	at org.drools.persistence.SimpleSessionCommandService$TransactionInterceptor.execute(SimpleSessionCommandService.java:334)
      	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
      	at org.drools.persistence.jcr.JcrPersistInterceptor.execute(JcrPersistInterceptor.java:42)
      	at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
      	at org.jbpm.persistence.JcrPersistProcessInterceptor.execute(JcrPersistProcessInterceptor.java:63)
      	at org.drools.persistence.SimpleSessionCommandService.execute(SimpleSessionCommandService.java:251)
      	at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.startProcessInstance(CommandBasedStatefulKnowledgeSession.java:256)
      	at org.jbpm.workflow.instance.node.SubProcessNodeInstance.internalTrigger(SubProcessNodeInstance.java:188)
      	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:171)
      	... 162 more
      

      Checklists

        Acceptance criteria

        Attachments

          Issue Links

            Activity

              People

                Unassigned Unassigned
                ejervidalo Espen Jervidalo
                Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved:

                  Checklists

                    Bug DoR
                    Task DoD