gatling / gatling

Modern Load Testing as Code
https://gatling.io
Apache License 2.0
6.4k stars 1.19k forks source link

Core: Infinite loop in Java SDK's RoundRobinSwitch and UniformRandomSwitch with gatling 3.10 #4494

Closed nvervelle closed 8 months ago

nvervelle commented 8 months ago

Hello,

I just tried to upgrade to gatling 3.10.0 from gatling 3.9.5.6, and I get StackOverflowError when running gatling (it seems to fail when building the simulation). I just have this log, I can try to make a reproducible example but not sure I will success.

07:44:34.854 [ERROR] i.g.a.Gatling$ - Run crashed
java.lang.StackOverflowError: null
        at java.base/java.util.Spliterator.getExactSizeIfKnown(Spliterator.java:414)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:508)
        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.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at io.gatling.javaapi.core.internal.Executables.toChainBuilders(Executables.java:31)
        at io.gatling.javaapi.core.internal.Executables.toChainBuilder(Executables.java:42)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        ...
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
Wrapped by: java.lang.reflect.InvocationTargetException: null
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:79)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
        at io.gatling.app.SimulationClass$Java.params(SimulationClass.scala:35)
        at io.gatling.app.Runner.load(Runner.scala:72)
        at io.gatling.app.Runner.run(Runner.scala:57)
        at io.gatling.app.Gatling$.start(Gatling.scala:92)
        at io.gatling.app.Gatling$.fromArgs(Gatling.scala:54)
        at io.gatling.app.Gatling$.main(Gatling.scala:42)
        at io.gatling.app.Gatling.main(Gatling.scala)
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:79)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
        at io.gatling.app.SimulationClass$Java.params(SimulationClass.scala:35)
        at io.gatling.app.Runner.load(Runner.scala:72)
        at io.gatling.app.Runner.run(Runner.scala:57)
        at io.gatling.app.Gatling$.start(Gatling.scala:92)
        at io.gatling.app.Gatling$.fromArgs(Gatling.scala:54)
        at io.gatling.app.Gatling$.main(Gatling.scala:42)
        at io.gatling.app.Gatling.main(Gatling.scala)
Caused by: java.lang.StackOverflowError
        at java.base/java.util.Spliterator.getExactSizeIfKnown(Spliterator.java:414)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:508)
        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.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at io.gatling.javaapi.core.internal.Executables.toChainBuilders(Executables.java:31)
        at io.gatling.javaapi.core.internal.Executables.toChainBuilder(Executables.java:42)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        ...
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
        at io.gatling.javaapi.core.condition.RoundRobinSwitch$On.on(RoundRobinSwitch.java:74)
nvervelle commented 8 months ago

In fact, I checked the code, and I think I found the problem :

nvervelle commented 8 months ago

The problem seems to come from this commit by @slandelle . I think the problem is present on other classes (at least on UniformRandomSwitch)

slandelle commented 8 months ago

Thanks for reporting.

The same issue happens with UniformRandomSwitch.

slandelle commented 8 months ago

Gatling 3.10.1 is up.

nvervelle commented 8 months ago

Thanks @slandelle

I can now start the simulation with gatling 3.10.1. It seems I have another problem though : I replaced calls CoreDsl.exitBlockOnFail(...) by CoreDsl.exitBlockOnFail().on(...) to take into account the breaking change in gatling DSL, but now errors fail to exit the simulation, the simulation seems to be stucked instead of finishing

I see logs stating that a request has failed, but nothing more happens to the simulation : 11:37:09.847 [DEBUG] i.g.h.e.r.DefaultStatsProcessor - Request 'applicant-submit-challenge' failed for user 2: status.find.is(200), but actually found 415

Any idea what can be causing such problem ?

slandelle commented 8 months ago

@nvervelle Could you please open a distinct ticket?

nvervelle commented 8 months ago

4495 opened