Skip to content

Accidental StacklessClosedChannelException when using AsyncHttpClient #193

@mitasov-ra

Description

@mitasov-ra

When I use the following Koltin extension for AsyncHttpClient:

client.execute(request) { resp ->
  // ...
}

sometimes requests are failed with this error:

ru.tinkoff.kora.http.client.common.HttpClientConnectionException: io.netty.channel.StacklessClosedChannelException
    at ru.tinkoff.kora.http.client.async.AsyncHttpClient.lambda$execute$1(AsyncHttpClient.java:39)
    at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3763)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
    at ru.tinkoff.kora.common.util.ReactorContextHook$ContextPropagator.onError(ReactorContextHook.java:80)
    at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121)
    at ru.tinkoff.kora.common.util.ReactorContextHook$ContextPropagator.onError(ReactorContextHook.java:75)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:201)
    at ru.tinkoff.kora.http.client.async.MonoSinkStreamAsyncHandler.onThrowable(MonoSinkStreamAsyncHandler.java:66)
    at org.asynchttpclient.netty.NettyResponseFuture.abort(NettyResponseFuture.java:277)
    at org.asynchttpclient.netty.request.WriteListener.abortOnThrowable(WriteListener.java:50)
    at org.asynchttpclient.netty.request.WriteListener.operationComplete(WriteListener.java:61)
    at org.asynchttpclient.netty.request.WriteCompleteListener.operationComplete(WriteCompleteListener.java:28)
    at org.asynchttpclient.netty.request.WriteCompleteListener.operationComplete(WriteCompleteListener.java:20)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
    at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetFailure(AbstractChannel.java:999)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:860)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1367)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:877)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:940)
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:966)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:934)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:943)
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:966)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:934)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:943)
    at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1247)
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: io.netty.channel.StacklessClosedChannelException: null
    at io.netty.channel.AbstractChannel$AbstractUnsafe.write(Object, ChannelPromise)(Unknown Source)

I don't know how to reproduce this, it just happens time to time.

Versions

JVM: corretto-17.0.6
Kora: 0.11.10
Kotlin: 1.8.22
kotlinx-coroutines: 1.7.1
KSP: 1.8.22-1.0.11

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinglang: kotlinRelated for Kotlin languagemodule: http-clientRelated to module - http

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions