Skip to content

Accidental StacklessClosedChannelException when using AsyncHttpClient #193

Open
mitasov-ra opened this issue Jul 16, 2023 · 0 comments
Open
Assignees
Labels
bug Something isn't working lang: kotlin Related for Kotlin language module: http-client Related to module - http

Comments

@mitasov-ra
Copy link
Contributor

mitasov-ra commented Jul 16, 2023

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

@GoodforGod GoodforGod added lang: kotlin Related for Kotlin language module: http-client Related to module - http labels Jul 17, 2023
@GoodforGod GoodforGod added the bug Something isn't working label Aug 3, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working lang: kotlin Related for Kotlin language module: http-client Related to module - http
Projects
None yet
Development

No branches or pull requests

3 participants