mars-sim / mars-sim

Mars Simulation Project Official Codebase
https://mars-sim.com
GNU General Public License v3.0
99 stars 35 forks source link

Concurrent access of containerSet #1104

Open mokun opened 8 months ago

mokun commented 8 months ago

Describe the bug

Expected and unexpected behavior

Java classes involved

Stacktrace

01-Adir-06:232.723 (Warning) RespondToStudyInvitation : [Arcadia] Aimar Pérez - Doing too many studies to accept Botany #9
01-Adir-06:232.723 (Info) Mining [x17] : [Kyocera] 9.0000 N 163.7999 E has a Mining Value of 0.0.
01-Adir-06:232.723 (Info) ReviewMissionPlan : [Kyocera] Yamato Ogawa - Grading Mineral Exploration #188 Plan - Rels: 9, Site: 0.0, Review: 2; Subtotal: 11.0
01-Adir-06:232.723 (Info) ReviewMissionPlan : [Kyocera] Yamato Ogawa - Done reviewing Rui Kaneko's Mineral Exploration #188 mission plan.
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Ice Prospecting' score: Score:0.64 (base:1,settlementratio:1,minerals:4,leader:0.36,extrovert:1,goods:1,population:0.444)
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Regolith Prospecting' score: Score:0.892 (base:1,settlementratio:1.3,minerals:4.286,leader:0.36,extrovert:1,goods:1,population:0.444)
01-Adir-06:240.256 (Info) DeliveryMeta [x2] : [Heritage] Drone 025 - Available for delivery mission.
01-Adir-06:240.256 (Info) CommerceUtil : [Heritage] New best deal for DELIVERY to Dream City profit 1267.2064200636312.
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Delivery' score: Score:200 (base:126.721,settlementratio:1,citizen:6,extrovert:1)
01-Adir-06:240.256 (Info) Settlement [x7] : [System] Investigating mineral site at 22.4000 N 17.9999 W (1.0 km).
01-Adir-06:240.256 (Info) Exploration : [Heritage] A site has an Exploration Value of 73.41.
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Mineral Exploration' score: Score:1.314 (base:1,settlementratio:1.2,minerals:3.65,leader:0.36,extrovert:1,goods:1.25,population:0.667)
01-Adir-06:240.256 (Severe) PersonTaskManager : [Heritage] Anna Novák - Trouble calling performTask(): 
java.util.ConcurrentModificationException
    at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1694)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:258)
    at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:248)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.count(ReferencePipeline.java:709)
    at com.mars_sim.core.equipment.EquipmentInventory.findNumEmptyContainersOfType(EquipmentInventory.java:499)
    at com.mars_sim.core.structure.Settlement.findNumEmptyContainersOfType(Settlement.java:3622)
    at com.mars_sim.core.goods.CommerceUtil.getAvailableContainerForResource(CommerceUtil.java:421)
    at com.mars_sim.core.goods.CommerceUtil.determineLoad(CommerceUtil.java:282)
    at com.mars_sim.core.goods.CommerceUtil.getDesiredBuyLoad(CommerceUtil.java:212)
    at com.mars_sim.core.goods.CommerceUtil.getPotentialDeal(CommerceUtil.java:112)
    at com.mars_sim.core.goods.CommerceUtil.getBestDeal(CommerceUtil.java:73)
    at com.mars_sim.core.goods.GoodsManager.getBestDeal(GoodsManager.java:768)
    at com.mars_sim.core.person.ai.mission.meta.TradeMeta.getSettlementProbability(TradeMeta.java:98)
    at com.mars_sim.core.person.ai.mission.meta.TradeMeta.getProbability(TradeMeta.java:71)
    at com.mars_sim.core.person.ai.mission.MissionManager.getNewMission(MissionManager.java:224)
    at com.mars_sim.core.person.ai.Mind.getNewMission(Mind.java:443)
    at com.mars_sim.core.person.ai.task.PlanMission.selectingPhase(PlanMission.java:137)
    at com.mars_sim.core.person.ai.task.PlanMission.performMappedPhase(PlanMission.java:114)
    at com.mars_sim.core.person.ai.task.util.Task.executeMappedPhase(Task.java:671)
    at com.mars_sim.core.person.ai.task.util.Task.performTask(Task.java:626)
    at com.mars_sim.core.person.ai.task.util.PersonTaskManager.executeTask(PersonTaskManager.java:100)
    at com.mars_sim.core.person.ai.Mind.takeAction(Mind.java:203)
    at com.mars_sim.core.person.ai.Mind.decideTask(Mind.java:175)
    at com.mars_sim.core.person.ai.Mind.timePassing(Mind.java:118)
    at com.mars_sim.core.person.Person.timePassing(Person.java:856)
    at com.mars_sim.core.structure.Settlement.timePassingCitizens(Settlement.java:1183)
    at com.mars_sim.core.structure.Settlement.timePassing(Settlement.java:904)
    at com.mars_sim.core.UnitManager$SettlementTask.call(UnitManager.java:900)
    at com.mars_sim.core.UnitManager$SettlementTask.call(UnitManager.java:1)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Ice Prospecting' score: Score:0.64 (base:1,settlementratio:1,minerals:4,leader:0.36,extrovert:1,goods:1,population:0.444)
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Regolith Prospecting' score: Score:0.892 (base:1,settlementratio:1.3,minerals:4.286,leader:0.36,extrovert:1,goods:1,population:0.444)
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Delivery' score: Score:200 (base:126.721,settlementratio:1,citizen:6,extrovert:1)
01-Adir-06:240.256 (Info) MissionManager : [Heritage] Anna Novák - Mission 'Mineral Exploration' score: Score:1.314 (base:1,settlementratio:1.2,minerals:3.65,leader:0.36,extrovert:1,goods:1.25,population:0.667)

Specifications (please complete the following information)

Additional context

bevans2000 commented 8 months ago

Let's not make any changes for this yet. It needs some careful thought. This is only a problem when the 2 Settlement trading are assigned to different Threads. I have some ideas what we can do but want to close down all the other changes we are doing first.

mokun commented 8 months ago

This is only a problem when the 2 Settlement trading are assigned to different Threads.

Ok later.

mokun commented 7 months ago

Do you think some of these concurrency issues may have to with GenericContainer extending Equipment ?

What if we free GenericContainer from being an Equipment once and for all ?!

In doing so, what will be impacted and what changes do we have to make ?

mokun commented 7 months ago

I have the following again:

01-Adir-12:204.577 (Info) DeliveryMeta [x2] : [Schiaparelli Point] Drone 019 - Available for delivery mission.
01-Adir-12:204.577 (Severe) PersonTaskManager : [Schiaparelli Point] Ruby Cook - Trouble calling performTask(): 
java.util.ConcurrentModificationException
    at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1694)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:258)
    at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:248)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.count(ReferencePipeline.java:709)
    at com.mars_sim.core.equipment.EquipmentInventory.findNumEmptyContainersOfType(EquipmentInventory.java:499)
    at com.mars_sim.core.structure.Settlement.findNumEmptyContainersOfType(Settlement.java:3716)
    at com.mars_sim.core.goods.CommerceUtil.getAvailableContainerForResource(CommerceUtil.java:426)
    at com.mars_sim.core.goods.CommerceUtil.determineLoad(CommerceUtil.java:287)
    at com.mars_sim.core.goods.CommerceUtil.getDesiredBuyLoad(CommerceUtil.java:216)
    at com.mars_sim.core.goods.CommerceUtil.getPotentialDeal(CommerceUtil.java:114)
    at com.mars_sim.core.goods.CommerceUtil.getBestDeal(CommerceUtil.java:73)
    at com.mars_sim.core.goods.GoodsManager.getBestDeal(GoodsManager.java:768)
    at com.mars_sim.core.person.ai.mission.meta.DeliveryMeta.getSettlementProbability(DeliveryMeta.java:105)
    at com.mars_sim.core.person.ai.mission.meta.DeliveryMeta.getProbability(DeliveryMeta.java:69)
    at com.mars_sim.core.person.ai.mission.MissionManager.getNewMission(MissionManager.java:244)
    at com.mars_sim.core.person.ai.Mind.getNewMission(Mind.java:450)
    at com.mars_sim.core.person.ai.task.PlanMission.selectingPhase(PlanMission.java:137)
    at com.mars_sim.core.person.ai.task.PlanMission.performMappedPhase(PlanMission.java:114)
    at com.mars_sim.core.person.ai.task.util.Task.executeMappedPhase(Task.java:688)
    at com.mars_sim.core.person.ai.task.util.Task.performTask(Task.java:643)
    at com.mars_sim.core.person.ai.task.util.PersonTaskManager.executeTask(PersonTaskManager.java:99)
    at com.mars_sim.core.person.ai.Mind.takeAction(Mind.java:203)
    at com.mars_sim.core.person.ai.Mind.decideTask(Mind.java:175)
    at com.mars_sim.core.person.ai.Mind.timePassing(Mind.java:118)
    at com.mars_sim.core.person.Person.timePassing(Person.java:859)
    at com.mars_sim.core.structure.Settlement.timePassingCitizens(Settlement.java:1232)
    at com.mars_sim.core.structure.Settlement.timePassing(Settlement.java:1006)
    at com.mars_sim.core.UnitManager$SettlementTask.call(UnitManager.java:900)
    at com.mars_sim.core.UnitManager$SettlementTask.call(UnitManager.java:1)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

01-Adir-12:204.577 (Info) CommerceUtil : [Schiaparelli Point] New best deal for a delivery mission to Heritage: Profit -1539.7.
bevans2000 commented 7 months ago

Did you have a Trade or ďelivery operation going? I have an idea on this. We create a temporary ResourceHolder when unloading/loading at a remote Settlement and use this as a transition object. We can create and load it in one Thread and pass it to the other Thread in the other Thread. Needs some thought but would work. Would add a single pulse delay the deliver reloading task

mokun commented 7 months ago

It's too late to go back to see if there's a delivery or trade going on that it accessing this thread that is running DeliveryMeta. I've exited the sim.

bevans2000 commented 5 months ago

Same problem as #1118

mokun commented 3 months ago

We create a temporary ResourceHolder when unloading/loading at a remote Settlement and use this as a transition object. We can create and load it in one Thread and pass it to the other Thread in the other Thread. Needs some thought but would work.

So for it to work, where will this transition object be located at what thread ?

Let's say we have 2 settlements, S1 and S2. S1 runs on the thread T1. S2 on T2.

A few settlers from S1 travelled to S2 on a trading mission.

Does this transition object reside on S2 ? or on a new temporary thread T3 that you will create ?

bevans2000 commented 3 months ago

The correct solution to thus and #1118 is to transfer control of the Units to the visiting Settlement when they arrive there. Then when Units interact they are still in the same Thread. This removes the need to specialise every interaction because the golden rule of Units being in the same Thread is maintained. This is a job for 3.9.0