Using during in a foreach loop

Hi,

I’m trying to use Gatling (V2.2.2) to compare the perfs of multiple map servers at different zoom levels with different number of users. So basically, my scenario looks like that:

val scn = scenario("User").group(_ => PerfConfig.nbUsers.toString) {
  foreach(PerfConfig.baseUrls, "base_url") {
    group(session => PerfConfig.baseUrlMap(session("base_url").as[String])) {
      foreach(steps.reverse, "level") {
        exec(session => {
          println("Starting level " + session("level").as[String])
          session
        })
          .during(30 seconds) {
            exec(session => PerfConfig.addRandomTileInfo(session)).exec(fetchTile)
          }
          .exec(session => {
            println("Done level " + session("level").as[String])
            session
          })
      }
    }
  }
}

The full code can be found there:
https://github.com/pvalsecc/ms_perfs/tree/master/perfs/com/camptocamp

My problem is that after the first iteration of “during” is done, I have multiple un-wanted behaviors:

  • “Done level 7” is printed a lot of times (one for each fetchTile execution, I guess). I don’t see why this is like that since it is done after the “during” loop. I’ve tried to put the “during” inside an exec by itself, but it didn’t help.
  • Gatling freezes and doesn’t do anymore query. It just prints the summary report every 5 seconds with no new query in it.

It’s not possible to chain a “during” with other stuff to do after?

Thanks for your help.

Hi,

Could you please provide a runnable reproducer, please?
This similar sample works fine for me.

Stéphane,

I’ve tried your reproducer and it works fine with gatling 2.2.1 (with the denvazh/gatling:2.2.1 docker image). With 2.2.2 (with the denvazh/gatling:2.2.2 docker image) it goes mad and outputs that:
gatling_1 | attr1=1 attr2=1
gatling_1 | Loop Done
gatling_1 | Loop Done

… (tons of them)
gatling_1 | 12:24:24.756 [ERROR] a.a.ActorSystemImpl - Uncaught error from thread [GatlingSystem-akka.actor.default-dispatcher-4] shutting down JVM since ‘akka.jvm-exit-on-fatal-error’ is enabled
gatling_1 | java.lang.StackOverflowError: null
gatling_1 | at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
gatling_1 | at sun.nio.cs.UTF_8.access$200(UTF_8.java:57)
gatling_1 | at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:636)
gatling_1 | at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
gatling_1 | at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
gatling_1 | at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
gatling_1 | at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
gatling_1 | at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
gatling_1 | at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
gatling_1 | at java.io.PrintStream.write(PrintStream.java:526)
gatling_1 | at java.io.PrintStream.print(PrintStream.java:669)
gatling_1 | at java.io.PrintStream.println(PrintStream.java:823)
gatling_1 | at scala.Console$.println(Console.scala:148)
gatling_1 | at scala.Predef$.println(Predef.scala:315)
gatling_1 | at com.camptocamp.ComplexLoopSimulation$$anonfun$2.apply(ComplexLoopSimulation.scala:26)
gatling_1 | at com.camptocamp.ComplexLoopSimulation$$anonfun$2.apply(ComplexLoopSimulation.scala:25)
gatling_1 | at io.gatling.core.action.SessionHook.execute(SessionHook.scala:38)
gatling_1 | at io.gatling.core.action.BlockExit.exitBlock(BlockExit.scala:37)
gatling_1 | at io.gatling.core.action.BlockExit$.noBlockExitTriggered(BlockExit.scala:122)
gatling_1 | at io.gatling.core.action.Loop.execute(Loop.scala:52)
gatling_1 | at io.gatling.core.action.Action$class.$bang(Action.scala:35)
gatling_1 | at io.gatling.core.action.Loop.$bang(Loop.scala:36)
gatling_1 | at io.gatling.core.action.SessionHook.io$gatling$core$action$SessionHook$$$anonfun$1(SessionHook.scala:38)
gatling_1 | at io.gatling.core.action.SessionHook$lambda$$execute$1.apply(SessionHook.scala:38)
gatling_1 | at io.gatling.core.action.SessionHook$lambda$$execute$1.apply(SessionHook.scala:38)
gatling_1 | at io.gatling.commons.validation.Success.map(Validation.scala:32)
gatling_1 | at io.gatling.core.action.SessionHook.execute(SessionHook.scala:38)
gatling_1 | at io.gatling.core.action.BlockExit.exitBlock(BlockExit.scala:37)
gatling_1 | at io.gatling.core.action.BlockExit$.noBlockExitTriggered(BlockExit.scala:122)

… (smells like an infinite recusion)

With 2.2.1, my stuff works fine. So, looks like a bug within the 2.2.2 image.

Thanks for your help.

You’re running into https://github.com/gatling/gatling/issues/3060, which is already fixed.
Use the snapshot for now.