ClosedChannelException

I am trying out gatling for my project and sending a lot of request within short time, this is my scenario and I got some exceptions at the console. Wondering if that is the expected behavior of gatling when it can’t handle too much request?

Scenario:

setUp(
s1.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s2.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s3.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s4.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s5.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s6.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s7.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s8.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s9.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s10.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s11.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s12.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s13.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s14.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s15.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s16.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s17.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s18.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s19.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf),
s20.inject(ramp(100 users) over(60 seconds)).protocolConfig(httpConf)

)

Exceptions:

Simulation finished.
Generating reports…
Parsing log file(s)…
09:49:29.128 [WARN ] i.g.h.a.GatlingAsyncHandler - Request ‘/places’ failed
java.nio.channels.ClosedChannelException: null
Wrapped by: java.net.ConnectException: http://ft-lb/places
at com.ning.http.client.providers.netty.NettyConnectListener.operationComplete(NettyConnectListener.java:103) ~[async-http-client-1.7.15.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.notifyListener(DefaultChannelFuture.java:427) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.notifyListeners(DefaultChannelFuture.java:418) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.setFailure(DefaultChannelFuture.java:380) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$1.operationComplete(NioClientSocketPipelineSink.java:115) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.notifyListener(DefaultChannelFuture.java:427) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.notifyListeners(DefaultChannelFuture.java:413) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelFuture.setSuccess(DefaultChannelFuture.java:362) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.AbstractChannel$ChannelCloseFuture.setClosed(AbstractChannel.java:355) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.AbstractChannel.setClosed(AbstractChannel.java:185) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioChannel.setClosed(AbstractNioChannel.java:197) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioSocketChannel.setClosed(NioSocketChannel.java:84) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.close(AbstractNioWorker.java:332) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.eventSunk(NioClientSocketPipelineSink.java:58) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:779) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:54) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.handler.codec.http.HttpClientCodec.handleDownstream(HttpClientCodec.java:97) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.handler.stream.ChunkedWriteHandler.handleDownstream(ChunkedWriteHandler.java:109) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:582) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.Channels.close(Channels.java:812) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java:197) [netty-3.6.5.Final.jar:na]
at org.jboss.netty.channel.group.DefaultChannelGroup.close(DefaultChannelGroup.java:184) [netty-3.6.5.Final.jar:na]
at com.ning.http.util.CleanupChannelGroup.close(CleanupChannelGroup.java:81) [async-http-client-1.7.15.jar:na]
at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.close(NettyAsyncHttpProvider.java:902) [async-http-client-1.7.15.jar:na]
at com.ning.http.client.AsyncHttpClient.close(AsyncHttpClient.java:367) [async-http-client-1.7.15.jar:na]
at io.gatling.http.ahc.GatlingHttpClient$$anonfun$newClient$1.apply$mcV$sp(GatlingHttpClient.scala:133) [gatling-http-2.0.0-M2.jar:na]
at io.gatling.http.ahc.GatlingHttpClient$$anonfun$newClient$1.apply(GatlingHttpClient.scala:133) [gatling-http-2.0.0-M2.jar:na]
at io.gatling.http.ahc.GatlingHttpClient$$anonfun$newClient$1.apply(GatlingHttpClient.scala:133) [gatling-http-2.0.0-M2.jar:na]
at akka.actor.ActorSystemImpl$$anon$4.run(ActorSystem.scala:596) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$run$1.runNext$1(ActorSystem.scala:746) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$run$1.apply$mcV$sp(ActorSystem.scala:749) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$run$1.apply(ActorSystem.scala:742) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$TerminationCallbacks$$anonfun$run$1.apply(ActorSystem.scala:742) [akka-actor_2.10-2.1.2.jar:na]
at akka.util.ReentrantGuard.withGuard(LockUtil.scala:15) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$TerminationCallbacks.run(ActorSystem.scala:742) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$$anonfun$terminationCallbacks$1.apply(ActorSystem.scala:593) [akka-actor_2.10-2.1.2.jar:na]
at akka.actor.ActorSystemImpl$$anonfun$terminationCallbacks$1.apply(ActorSystem.scala:593) [akka-actor_2.10-2.1.2.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:29) [scala-library-2.10.1.jar:na]
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67) [akka-actor_2.10-2.1.2.jar:na]
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82) [akka-actor_2.10-2.1.2.jar:na]
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) [akka-actor_2.10-2.1.2.jar:na]
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) [akka-actor_2.10-2.1.2.jar:na]
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) [scala-library-2.10.1.jar:na]
at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58) [akka-actor_2.10-2.1.2.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:137) [akka-actor_2.10-2.1.2.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:506) [akka-actor_2.10-2.1.2.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262) [scala-library-2.10.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) [scala-library-2.10.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478) [scala-library-2.10.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) [scala-library-2.10.1.jar:na]

We have to find a way to handle this more gracefully.

What happens here is that you have so many open connections that your server decides to close some of them so it can accept new incoming ones, so yes, your request fails.

I thinks what we need is some kind a default retry logic that still counts failures. There’s a retry logic in underlying AHC but it won’t count those.