triplea icon indicating copy to clipboard operation
triplea copied to clipboard

Occasional "Not all units present in:Center" running AiGameTest > testAiGame

Open asvitkine opened this issue 2 years ago • 1 comments

I modified the test to do 1000 iterations. One of them hit this:

java.lang.IllegalStateException: Not all units present in:Center.  Trying to remove:[infantry owned by Germans, armour owned by Germans] present:[fighter owned by Germans, fighter owned by Germans, armour owned by Germans]
	at games.strategy.engine.data.changefactory.RemoveUnits.perform(RemoveUnits.java:58)
	at games.strategy.engine.data.CompositeChange.perform(CompositeChange.java:71)
	at games.strategy.engine.data.GameData.performChange(GameData.java:543)
	at games.strategy.engine.framework.ServerGame$1.gameDataChanged(ServerGame.java:105)
	at jdk.internal.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeSingle(EndPoint.java:136)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.lambda$invokeMultiple$0(EndPoint.java:120)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeMultiple(EndPoint.java:121)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeLocal(EndPoint.java:111)
	at games.strategy.engine.message.unifiedmessenger.UnifiedMessenger.invoke(UnifiedMessenger.java:153)
	at games.strategy.engine.message.UnifiedInvocationHandler.invoke(UnifiedInvocationHandler.java:47)
	at com.sun.proxy.$Proxy66.gameDataChanged(Unknown Source)
	at games.strategy.engine.framework.ServerGame.addChange(ServerGame.java:675)
	at games.strategy.engine.delegate.DefaultDelegateBridge.addChange(DefaultDelegateBridge.java:82)
	at games.strategy.engine.delegate.DefaultDelegateBridge.addChange(DefaultDelegateBridge.java:77)
	at games.strategy.triplea.delegate.GameDelegateBridge.addChange(GameDelegateBridge.java:68)
	at games.strategy.engine.history.change.units.RemoveUnitsHistoryChange.perform(RemoveUnitsHistoryChange.java:121)
	at games.strategy.triplea.delegate.battle.MustFightBattle.removeUnits(MustFightBattle.java:604)
	at games.strategy.triplea.delegate.battle.steps.change.RemoveUnprotectedUnits.checkUndefendedTransports(RemoveUnprotectedUnits.java:101)
	at games.strategy.triplea.delegate.battle.steps.change.RemoveUnprotectedUnits.removeUnprotectedUnits(RemoveUnprotectedUnits.java:67)
	at games.strategy.triplea.delegate.battle.steps.change.RemoveUnprotectedUnits.execute(RemoveUnprotectedUnits.java:55)
	at games.strategy.triplea.delegate.ExecutionStack.execute(ExecutionStack.java:34)
	at games.strategy.triplea.delegate.battle.MustFightBattle.fight(MustFightBattle.java:712)
	at games.strategy.triplea.delegate.battle.BattleDelegate.fightBattle(BattleDelegate.java:246)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at games.strategy.engine.delegate.DelegateExecutionManager$1.invoke(DelegateExecutionManager.java:120)
	at com.sun.proxy.$Proxy60.fightBattle(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeSingle(EndPoint.java:136)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.lambda$invokeMultiple$0(EndPoint.java:120)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeMultiple(EndPoint.java:121)
	at games.strategy.engine.message.unifiedmessenger.EndPoint.invokeLocal(EndPoint.java:111)
	at games.strategy.engine.message.unifiedmessenger.UnifiedMessenger.invokeAndWait(UnifiedMessenger.java:97)
	at games.strategy.engine.message.UnifiedInvocationHandler.invoke(UnifiedInvocationHandler.java:55)
	at com.sun.proxy.$Proxy60.fightBattle(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at games.strategy.engine.player.DefaultPlayerBridge$GameOverInvocationHandler.invoke(DefaultPlayerBridge.java:145)
	at com.sun.proxy.$Proxy60.fightBattle(Unknown Source)
	at games.strategy.triplea.ai.AbstractBuiltInAi.battle(AbstractBuiltInAi.java:610)
	at games.strategy.triplea.ai.AbstractBuiltInAi.start(AbstractBuiltInAi.java:518)
	at games.strategy.engine.framework.ServerGame.waitForPlayerToFinishStep(ServerGame.java:574)
	at games.strategy.engine.framework.ServerGame.runStep(ServerGame.java:431)
	at games.strategy.engine.framework.ServerGame.runNextStep(ServerGame.java:326)
	at games.strategy.engine.data.AiGameTest.testAiGame(AiGameTest.java:41)

asvitkine avatar Jun 17 '22 22:06 asvitkine

The very peculiar thing is that the call stack is checkUndefendedTransports(), BUT it's trying to remove "infantry owned by Germans, armour owned by Germans". So there might be some logic error in the battle code that's calling this.

asvitkine avatar Jun 17 '22 22:06 asvitkine

Note: Current ToT AiGameTest has been modified in #11393 to simplify it to make it complete much sooner. This probably needs testing with the original to repro.

asvitkine avatar Aug 01 '23 00:08 asvitkine

I've been running the test with the previous version of the game XML for several hundred iterations and haven't seen this recur. So I think this error is actually gone at this point. Closing!

asvitkine avatar Aug 02 '23 04:08 asvitkine