We've started seeing an intermittent StacklessClos...
# ktor
j
We've started seeing an intermittent StacklessClosedChannelException since updating to ktor 2 (Netty). Is there anything we could try to squash them? Attaching stacktrace 🧵
Copy code
i.n.c.StacklessClosedChannelException: null
    at i.n.c.AbstractChannel$AbstractUnsafe.write(Object, ChannelPromise)(Unknown Source)
Wrapped by: i.k.u.c.ChannelWriteException: Cannot write to a channel
    at i.k.s.n.c.NettyHttpResponsePipeline.respondWithFailure(NettyHttpResponsePipeline.kt:108)
    at i.k.s.n.c.NettyHttpResponsePipeline.respondWithBodyAndTrailerMessage(NettyHttpResponsePipeline.kt:258)
    at i.k.s.n.c.NettyHttpResponsePipeline.access$respondWithBodyAndTrailerMessage(NettyHttpResponsePipeline.kt:31)
    at i.k.s.n.c.NettyHttpResponsePipeline$respondWithBodyAndTrailerMessage$1.invokeSuspend(NettyHttpResponsePipeline.kt)
    at k.c.j.i.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at k.c.DispatchedTask.run(DispatchedTask.kt:106)
    at i.n.u.c.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
    at i.n.u.c.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
    at i.n.u.c.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at i.n.c.n.NioEventLoop.run(NioEventLoop.java:503)
    at i.n.u.c.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
    at i.n.u.i.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at i.k.s.n.EventLoopGroupProxy$Companion.create$lambda-1$lambda-0(NettyApplicationEngine.kt:260)
    at i.n.u.c.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Unknown Source)
    Suppressed: i.k.u.c.ChannelWriteException: Cannot write to a channel
    Wrapped by: java.io.IOException: io.ktor.util.cio.ChannelWriteException: Cannot write to a channel
        at i.k.u.i.j.j.OutputAdapter.close(Blocking.kt:139)
        at c.f.j.c.j.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1225)
        at c.f.j.d.u.ClassUtil.closeOnFailAndThrowAsIOE(ClassUtil.java:497)
        at c.f.j.d.ObjectMapper._writeValueAndClose(ObjectMapper.java:4570)
        at c.f.j.d.ObjectMapper.writeValue(ObjectMapper.java:3780)
        at i.k.s.j.JacksonConverter$serialize$2.invokeSuspend(JacksonConverter.kt:36)
        at i.k.s.j.JacksonConverter$serialize$2.invoke(JacksonConverter.kt)
        at i.k.s.j.JacksonConverter$serialize$2.invoke(JacksonConverter.kt)
        at i.k.h.c.OutputStreamContent$writeTo$2.invokeSuspend(OutputStreamContent.kt:28)
        at i.k.h.c.OutputStreamContent$writeTo$2.invoke(OutputStreamContent.kt)
        at i.k.h.c.OutputStreamContent$writeTo$2.invoke(OutputStreamContent.kt)
        at i.k.h.c.BlockingBridgeKt.withBlocking(BlockingBridge.kt:28)
        at i.k.h.c.OutputStreamContent.writeTo(OutputStreamContent.kt:24)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invokeSuspend(Compression.kt:181)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invoke(Compression.kt)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invoke(Compression.kt)
        at k.c.i.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
        at k.c.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
        at i.k.s.p.c.CompressedWriteResponse.writeTo(Compression.kt:179)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invokeSuspend(BaseApplicationResponseJvm.kt:173)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invoke(BaseApplicationResponseJvm.kt)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invoke(BaseApplicationResponseJvm.kt)
        at k.c.i.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
        at k.c.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:166)
        at k.c.BuildersKt.withContext(Unknown Source:1)
        at i.k.s.e.BaseApplicationResponse.respondWriteChannelContent$suspendImpl(BaseApplicationResponseJvm.kt:172)
        at i.k.s.e.BaseApplicationResponse.respondWriteChannelContent(BaseApplicationResponseJvm.kt)
        at i.k.s.e.BaseApplicationResponse.respondOutgoingContent$suspendImpl(BaseApplicationResponseJvm.kt:132)
        at i.k.s.e.BaseApplicationResponse.respondOutgoingContent(BaseApplicationResponseJvm.kt)
        at i.k.s.n.NettyApplicationResponse.respondOutgoingContent$suspendImpl(NettyApplicationResponse.kt:37)
        ... 38 frames truncated
    Suppressed: i.k.u.c.ChannelWriteException: Cannot write to a channel
    Wrapped by: java.io.IOException: io.ktor.util.cio.ChannelWriteException: Cannot write to a channel
        at i.k.u.i.j.j.OutputAdapter.close(Blocking.kt:139)
        at k.io.CloseableKt.closeFinally(Closeable.kt:60)
        at i.k.h.c.OutputStreamContent$writeTo$2.invokeSuspend(OutputStreamContent.kt:27)
        at i.k.h.c.OutputStreamContent$writeTo$2.invoke(OutputStreamContent.kt)
        at i.k.h.c.OutputStreamContent$writeTo$2.invoke(OutputStreamContent.kt)
        at i.k.h.c.BlockingBridgeKt.withBlocking(BlockingBridge.kt:28)
        at i.k.h.c.OutputStreamContent.writeTo(OutputStreamContent.kt:24)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invokeSuspend(Compression.kt:181)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invoke(Compression.kt)
        at i.k.s.p.c.CompressedWriteResponse$writeTo$2.invoke(Compression.kt)
        at k.c.i.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
        at k.c.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
        at i.k.s.p.c.CompressedWriteResponse.writeTo(Compression.kt:179)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invokeSuspend(BaseApplicationResponseJvm.kt:173)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invoke(BaseApplicationResponseJvm.kt)
        at i.k.s.e.BaseApplicationResponse$respondWriteChannelContent$2$1.invoke(BaseApplicationResponseJvm.kt)
        at k.c.i.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
        at k.c.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:166)
        at k.c.BuildersKt.withContext(Unknown Source:1)
        at i.k.s.e.BaseApplicationResponse.respondWriteChannelContent$suspendImpl(BaseApplicationResponseJvm.kt:172)
        at i.k.s.e.BaseApplicationResponse.respondWriteChannelContent(BaseApplicationResponseJvm.kt)
        at i.k.s.e.BaseApplicationResponse.respondOutgoingContent$suspendImpl(BaseApplicationResponseJvm.kt:132)
        at i.k.s.e.BaseApplicationResponse.respondOutgoingContent(BaseApplicationResponseJvm.kt)
        at i.k.s.n.NettyApplicationResponse.respondOutgoingContent$suspendImpl(NettyApplicationResponse.kt:37)
        at i.k.s.n.NettyApplicationResponse.respondOutgoingContent(NettyApplicationResponse.kt)
        at i.k.s.e.BaseApplicationResponse$Companion$setupSendPipeline$1.invokeSuspend(BaseApplicationResponseJvm.kt:316)
        at i.k.s.e.BaseApplicationResponse$Companion$setupSendPipeline$1.invoke(BaseApplicationResponseJvm.kt)
        at i.k.s.e.BaseApplicationResponse$Companion$setupSendPipeline$1.invoke(BaseApplicationResponseJvm.kt)
        at i.k.u.p.SuspendFunctionGun.loop(SuspendFunctionGun.kt:123)
        at i.k.u.p.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:81)