Skip to content

[batch][file-buffering] ConcurrentModificationException at the end of simulation #288

Description

@lesquoyb

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:

  1. run a model that writes files in batch mode
  2. set a buffering strategy different than no_buffering
  3. See error

Expected behavior
The batch runs normally

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    About BatchThis issue concerns batch experiments

    Type

    No type

    Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions