Describe the bug
I'm running a batch of multiple parallel simulations that write files and at the end of the first batch of parallel simulations I have a ConcurrentModificationException because they all are accessing the same map to flush their write requests.
Here is the eclipse stack:
ConcurrentModificationException: null
java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1605)
java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1638)
java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1636)
gama.core.runtime.concurrent.BufferingController.flushAllFilesOfOwner(BufferingController.java:306)
gama.core.runtime.concurrent.BufferingController.flushSaveFilesOfOwner(BufferingController.java:346)
gama.core.runtime.GAMA.flushSaveFilePerOwner(GAMA.java:124)
gama.core.kernel.simulation.SimulationAgent.dispose(SimulationAgent.java:459)
Caused by: java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1605)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1638)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1636)
at gama.core.runtime.concurrent.BufferingController.flushAllFilesOfOwner(BufferingController.java:306)
at gama.core.runtime.concurrent.BufferingController.flushSaveFilesOfOwner(BufferingController.java:346)
at gama.core.runtime.GAMA.flushSaveFilePerOwner(GAMA.java:124)
at gama.core.kernel.simulation.SimulationAgent.dispose(SimulationAgent.java:459)
at gama.core.metamodel.agent.AbstractAgent.primDie(AbstractAgent.java:558)
at gaml.additions.core.GamlAdditions.lambda$1193(GamlAdditions.java:1247)
at gama.gaml.compilation.GamaHelper.run(GamaHelper.java:75)
at gama.gaml.compilation.IGamaHelper.run(IGamaHelper.java:51)
at gama.gaml.statements.PrimitiveStatement.privateExecuteIn(PrimitiveStatement.java:98)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:427)
at gama.gaml.statements.DoStatement.privateExecuteIn(DoStatement.java:308)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.IfStatement.privateExecuteIn(IfStatement.java:215)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.statements.AbstractStatementSequenceWithArgs.privateExecuteIn(AbstractStatementSequenceWithArgs.java:59)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:427)
at gama.gaml.statements.DoStatement.privateExecuteIn(DoStatement.java:308)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.architecture.reflex.ReflexStatement.privateExecuteIn(ReflexStatement.java:90)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.architecture.reflex.ReflexArchitecture.executeReflexes(ReflexArchitecture.java:126)
at gama.gaml.architecture.reflex.ReflexArchitecture.executeOn(ReflexArchitecture.java:112)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.metamodel.agent.AbstractAgent.doStep(AbstractAgent.java:271)
at gama.core.metamodel.agent.MinimalAgent.doStep(MinimalAgent.java:260)
at gama.core.metamodel.agent.AbstractAgent.step(AbstractAgent.java:242)
at gama.core.runtime.ExecutionScope.step(ExecutionScope.java:547)
... 2 more
Java error: ConcurrentModificationException
at gama.core.runtime.exceptions.GamaRuntimeException.create(GamaRuntimeException.java:72)
at gama.core.runtime.ExecutionScope.step(ExecutionScope.java:553)
at gama.core.common.interfaces.IScopedStepable.step(IScopedStepable.java:27)
at gama.core.runtime.concurrent.SimulationRunner$1.run(SimulationRunner.java:118)
Caused by: java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1605)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1638)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1636)
at gama.core.runtime.concurrent.BufferingController.flushAllFilesOfOwner(BufferingController.java:306)
at gama.core.runtime.concurrent.BufferingController.flushSaveFilesOfOwner(BufferingController.java:346)
at gama.core.runtime.GAMA.flushSaveFilePerOwner(GAMA.java:124)
at gama.core.kernel.simulation.SimulationAgent.dispose(SimulationAgent.java:459)
at gama.core.metamodel.agent.AbstractAgent.primDie(AbstractAgent.java:558)
at gaml.additions.core.GamlAdditions.lambda$1193(GamlAdditions.java:1247)
at gama.gaml.compilation.GamaHelper.run(GamaHelper.java:75)
at gama.gaml.compilation.IGamaHelper.run(IGamaHelper.java:51)
at gama.gaml.statements.PrimitiveStatement.privateExecuteIn(PrimitiveStatement.java:98)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:427)
at gama.gaml.statements.DoStatement.privateExecuteIn(DoStatement.java:308)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.IfStatement.privateExecuteIn(IfStatement.java:215)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.statements.AbstractStatementSequenceWithArgs.privateExecuteIn(AbstractStatementSequenceWithArgs.java:59)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:427)
at gama.gaml.statements.DoStatement.privateExecuteIn(DoStatement.java:308)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.statements.AbstractStatementSequence.privateExecuteIn(AbstractStatementSequence.java:69)
at gama.gaml.architecture.reflex.ReflexStatement.privateExecuteIn(ReflexStatement.java:90)
at gama.gaml.statements.AbstractStatement.executeOn(AbstractStatement.java:47)
at gama.gaml.statements.AbstractStatementSequence.executeOn(AbstractStatementSequence.java:59)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.runtime.IScope.execute(IScope.java:414)
at gama.gaml.architecture.reflex.ReflexArchitecture.executeReflexes(ReflexArchitecture.java:126)
at gama.gaml.architecture.reflex.ReflexArchitecture.executeOn(ReflexArchitecture.java:112)
at gama.core.runtime.ExecutionScope.execute(ExecutionScope.java:510)
at gama.core.runtime.IScope.execute(IScope.java:443)
at gama.core.metamodel.agent.AbstractAgent.doStep(AbstractAgent.java:271)
at gama.core.metamodel.agent.MinimalAgent.doStep(MinimalAgent.java:260)
at gama.core.metamodel.agent.AbstractAgent.step(AbstractAgent.java:242)
at gama.core.runtime.ExecutionScope.step(ExecutionScope.java:547)
... 2 more
To Reproduce
Steps to reproduce the behavior:
- run a model that writes files in batch mode
- set a buffering strategy different than
no_buffering
- See error
Expected behavior
The batch runs normally
Describe the bug
I'm running a batch of multiple parallel simulations that write files and at the end of the first batch of parallel simulations I have a ConcurrentModificationException because they all are accessing the same map to flush their write requests.
Here is the eclipse stack:
To Reproduce
Steps to reproduce the behavior:
no_bufferingExpected behavior
The batch runs normally