Reactor-netty: SSLException on request cancellation

Created on 19 Jun 2020  Â·  17Comments  Â·  Source: reactor/reactor-netty

In our SDK we are seeing javax.net.ssl.SSLException: SSLEngine closed already exceptions.
We are using fixed channel pool - ConnectionProvider with 1000 as pool size.

Expected Behavior

On cancel operation, channel should be closed / disposed quietly since the operation has been cancelled. Whether that channel is reusable or not can be a point of discussion.

Actual Behavior

Combination of pagination + takeUntil operator causes SSLException. In high load, the error keeps happening, and thus causing Out of Memory issue.

Steps to Reproduce

I was able to reproduce the issue on an isolated project - which is exactly same we have reactor-netty http client in Azure CosmosDB Java SDK.

Here is the link to the project I have created : https://github.com/kushagraThapar/reactor-netty-ssl-error

Run the MainApplication.java in IDE for couple of minutes and the error starts happening.

For testing purpose, I have kept the connection pool size to 5.

Your Environment

macOS / linux machines
reactor-netty: 0.9.7.RELEASE
reactor-core: 3.3.5.RELEASE

Here is the complete stack trace:

18 Jun 2020 16:04:31,770       [reactor-http-nio-12] WARN reactor.netty.http.client.HttpClientConnect - [id: 0xbb8e3529, L:/192.168.0.10:54545 - R:rel.ink/104.24.122.41:443] The connection observed an error
javax.net.ssl.SSLException: SSLEngine closed already
    at io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:848)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoIgnoreThen] :
    reactor.core.publisher.Mono.thenEmpty
    reactor.netty.ReactorNetty$OutboundThen.<init>(ReactorNetty.java:553)
Error has been observed at the following site(s):
    |_  Mono.thenEmpty ⇢ at reactor.netty.ReactorNetty$OutboundThen.<init>(ReactorNetty.java:553)
    |_                 ⇢ at reactor.netty.ReactorNetty$OutboundThen.then(ReactorNetty.java:598)
    |_ Mono.fromDirect ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.lambda$onStateChange$0(HttpClientConnect.java:437)
    |_      Mono.defer ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:437)
Stack trace:
        at io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:848)
        at io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:811)
        at io.netty.handler.ssl.SslHandler.flush(SslHandler.java:792)
        at io.netty.handler.ssl.SslHandler.flush(SslHandler.java:1931)
        at io.netty.handler.ssl.SslHandler.closeOutboundAndChannel(SslHandler.java:1899)
        at io.netty.handler.ssl.SslHandler.close(SslHandler.java:743)
        at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:622)
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:606)
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.close(CombinedChannelDuplexHandler.java:505)
        at io.netty.channel.ChannelOutboundHandlerAdapter.close(ChannelOutboundHandlerAdapter.java:77)
        at io.netty.channel.CombinedChannelDuplexHandler.close(CombinedChannelDuplexHandler.java:316)
        at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:622)
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:606)
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:472)
        at io.netty.channel.DefaultChannelPipeline.close(DefaultChannelPipeline.java:957)
        at io.netty.channel.AbstractChannel.close(AbstractChannel.java:232)
        at reactor.netty.http.client.HttpClientOperations.onInboundCancel(HttpClientOperations.java:258)
        at reactor.netty.channel.FluxReceive.unsubscribeReceiver(FluxReceive.java:436)
        at reactor.netty.channel.FluxReceive.lambda$new$0(FluxReceive.java:80)
        at reactor.netty.channel.FluxReceive.cancelReceiver(FluxReceive.java:148)
        at reactor.netty.channel.FluxReceive.cancel(FluxReceive.java:90)
        at reactor.netty.channel.ChannelOperations.dispose(ChannelOperations.java:160)
        at reactor.core.publisher.MonoCreate$DefaultMonoSink.onCancel(MonoCreate.java:222)
        at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$TcpClientSubscriber.onNext(HttpClientConnect.java:344)
        at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$TcpClientSubscriber.onNext(HttpClientConnect.java:329)
        at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:156)
        at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.run(PooledConnectionProvider.java:604)
        at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onNext(PooledConnectionProvider.java:485)
        at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onNext(PooledConnectionProvider.java:436)
        at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.deliver(AbstractPool.java:388)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool.lambda$drainLoop$13(SimplePool.java:244)
        at reactor.core.scheduler.ImmediateScheduler.schedule(ImmediateScheduler.java:47)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool.drainLoop(SimplePool.java:244)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool.drain(SimplePool.java:172)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool.maybeRecycleAndDrain(SimplePool.java:159)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool$QueuePoolRecyclerInner.onComplete(SimplePool.java:401)
        at reactor.core.publisher.Operators.complete(Operators.java:135)
        at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:45)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4218)
        at reactor.netty.internal.shaded.reactor.pool.SimplePool$QueuePoolRecyclerMono.subscribe(SimplePool.java:452)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4218)
        at reactor.core.publisher.Mono.subscribeWith(Mono.java:4329)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4189)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4125)
        at reactor.netty.resources.PooledConnectionProvider$PooledConnection.onStateChange(PooledConnectionProvider.java:401)
        at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:426)
        at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:607)
        at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1518)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        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(Thread.java:834)
typbug

All 17 comments

@kushagraThapar From the reproducible example I do not see how this SSLEngine closed already can cause an OOM.
The exception is thrown right after acquiring from the pool and before sending any request. However I see that you use responseConnection and I do not see how you handle cancellations. Recently there was similar issue with Spring WebClient, you might want to look at it https://github.com/spring-projects/spring-framework/issues/25216
Meanwhile I'm looking at SSLEngine closed already.

@violetagg Thank you for looking at the issue.
OOM doesn't happen directly or soon, but after a very long running operation under heavy work load. We use 1000 as the number of connections for the fixed Connection pool.

Regarding cancellations, what should be the recommended way to handle cancellations. I think that is one part of the problem, or in fact could be the major issue here.

@kushagraThapar You do not subscribe for the inbound but you "wrap" the connection that Reactor Netty provides.
https://github.com/kushagraThapar/reactor-netty-ssl-error/blob/1d87eac3e0646160de0d62fcc689e68b2dc8cdc6/src/main/java/com/example/ReactorNettyClient.java#L99
If a cancellation is received before you are able to subscribe for the body, the cancellation is not propagated to Reactor Netty and thus we are not able to clean the memory.
When you use responseConnection you are responsible to clean the memory when a cancellation/error happens.
For the other methods that we expose response, responseSingle you do not have problems because we subscribe immediately to the inbound and we handle the memory cleanup. See here https://github.com/reactor/reactor-netty/blob/10c7f7067b56f80167c9ede3dfafba6a515e6296/src/main/java/reactor/netty/http/client/HttpClientFinalizer.java#L95-L97 and here https://github.com/reactor/reactor-netty/blob/10c7f7067b56f80167c9ede3dfafba6a515e6296/src/main/java/reactor/netty/http/client/HttpClientFinalizer.java#L119-L121
In the issue above that I mentioned the solution that was applied to WebClient is when a cancellation is received, they consume/drain the inbound.
https://github.com/spring-projects/spring-framework/commit/21d069695f301851254ff2d03b44478303f24806

@violetagg - Thank you for these wonderful insights and the explanation, it makes sense.
I updated my example with the same logic that is used in https://github.com/spring-projects/spring-framework/commit/21d069695f301851254ff2d03b44478303f24806

I am still facing the issue, though one interesting thing I noticed is - for my scenario, the cancellation is happening before the response comes on the http client, because of which I am not able to consume/drain the inbound.

I added more logging to verify this. If you take a look or run the example, you will notice that this atomicReference always logs null: https://github.com/kushagraThapar/reactor-netty-ssl-error/blob/master/src/main/java/com/example/ReactorNettyClient.java#L82

@kushagraThapar Yes as I wrote with this concrete example I do not see how this SSLEngine closed already can cause an OOM.
The issue with responseConnection, cancellation and the possibility of not draining the incoming data is something that I saw while reviewing the example.

@violetagg - I agree and it is possible that SSLEngine closed already might not be causing OOM directly, but rather could a be side effect of this issue.
Since this exception happens on all connections eventually (1000 connections in the fixed connection pool), causing the logger to print too many exception stack traces can also lead to using too much heap memory and thus causing the OOM.

Though at this point, our main concern is to get this issue fixed, since OOM happens rarely and it can be worked around by increasing the heap size for now.

@kushagraThapar Will you be able to test PR #1198 ?

@violetagg - Thanks for the PR, I can definitely try it out. Will post the update once I am able to test it, hopefully today.

@violetagg - I was able to test the PR and it definitely fixes the issue in the example test application, thank you so much for that.

However, in my SDK, I am still seeing the issue with the fix PR version. Here are some interesting observations from my debugging today in SDK code.

  1. When calling doOnCancel() on http client - the response was always already subscribed before cancellation happens, so the current state was always 1 based on below code.
// 0 - not subscribed, 1 - subscribed, 2 - cancelled, 3 - cancelled via connector (before subscribe)
private final AtomicInteger state = new AtomicInteger(0);
  1. Even if I change the releaseAfterCancel method logic to compare state to 1, I still get the error.
/**
         * Called by {@link ReactorNettyClient} when a cancellation is detected
         * but the content has not been subscribed to. If the subscription never
         * materializes then the content will remain not drained. Or it could still
         * materialize if the cancellation happened very early, or the response
         * reading was delayed for some reason.
         */
        private void releaseAfterCancel(HttpMethod method) {
            boolean mayHaveBody = mayHaveBody(method);
            logger.info("May have body : {}, current state : {}, to be new state: {}", mayHaveBody, this.state.get(), 3);
            boolean newState = this.state.compareAndSet(1, 3);
            if (mayHaveBody && newState) {
                logger.info("Releasing body, not yet subscribed");
                if (logger.isDebugEnabled()) {
                    logger.debug("Releasing body, not yet subscribed");
                }
                this.bodyIntern()
                    .doOnNext(byteBuf -> {})
                    .subscribe(byteBuf -> {}, ex -> {});
            }
        }
  1. That being said, the number of SSLExceptions that I used to get earlier have reduced by a big number in your PR fix, which I am guessing is fixing most of the cancellation cases, but may be few edge cases are still remaining.

Here is the latests stack trace that I am getting now, not sure if this is same as the above one, but just wanted to provide this.

2020-07-06 17:04:03,711       [reactor-http-nio-5] WARN  reactor.netty.http.client.HttpClientConnect - [id: 0x3de7e1e9, L:/192.168.0.10:62268 - R:paged-flux-test-account-westus2.documents.azure.com/40.78.250.5:443] The connection observed an error
javax.net.ssl.SSLException: SSLEngine closed already
    at io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:848) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoIgnoreThen] :
    reactor.core.publisher.Mono.thenEmpty
    reactor.netty.ReactorNetty$OutboundThen.<init>(ReactorNetty.java:553)
Error has been observed at the following site(s):
    |_  Mono.thenEmpty ⇢ at reactor.netty.ReactorNetty$OutboundThen.<init>(ReactorNetty.java:553)
    |_                 ⇢ at reactor.netty.ReactorNetty$OutboundThen.then(ReactorNetty.java:598)
    |_ Mono.fromDirect ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.lambda$onStateChange$0(HttpClientConnect.java:440)
    |_      Mono.defer ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:440)
Stack trace:
        at io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:848) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:811) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.flush(SslHandler.java:792) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.flush(SslHandler.java:1931) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.closeOutboundAndChannel(SslHandler.java:1899) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.close(SslHandler.java:743) ~[netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:622) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:606) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.close(CombinedChannelDuplexHandler.java:505) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.ChannelOutboundHandlerAdapter.close(ChannelOutboundHandlerAdapter.java:77) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.CombinedChannelDuplexHandler.close(CombinedChannelDuplexHandler.java:316) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:622) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:606) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:472) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.DefaultChannelPipeline.close(DefaultChannelPipeline.java:957) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannel.close(AbstractChannel.java:232) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at reactor.netty.http.client.HttpClientOperations.onInboundCancel(HttpClientOperations.java:260) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.FluxReceive.unsubscribeReceiver(FluxReceive.java:448) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.FluxReceive.lambda$new$0(FluxReceive.java:88) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.FluxReceive.cancelReceiver(FluxReceive.java:187) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.FluxReceive.cancel(FluxReceive.java:98) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.ChannelOperations.dispose(ChannelOperations.java:165) ~[reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.core.publisher.FluxCreate$SinkDisposable.cancel(FluxCreate.java:1039) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoCreate$DefaultMonoSink.disposeResource(MonoCreate.java:307) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoCreate$DefaultMonoSink.cancel(MonoCreate.java:296) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.cancel(FluxRetryWhen.java:151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.SerializedSubscriber.cancel(SerializedSubscriber.java:157) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.cancel(MonoFlatMapMany.java:123) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.cancel(FluxPeekFuseable.java:152) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.cancel(MonoSingle.java:101) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators.terminate(Operators.java:1199) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoFlatMap$FlatMapMain.cancel(MonoFlatMap.java:180) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.cancel(MonoSingle.java:101) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.cancel(FluxRetryWhen.java:151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.SerializedSubscriber.cancel(SerializedSubscriber.java:157) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.cancel(MonoSingle.java:101) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.cancel(FluxRetryWhen.java:151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.SerializedSubscriber.cancel(SerializedSubscriber.java:157) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxExpand$ExpandBreathSubscriber.cancel(FluxExpand.java:146) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.cancel(FluxPublishOn.java:276) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.cancel(FluxMapFuseable.java:167) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drainLoop(Operators.java:2182) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.drain(Operators.java:2151) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.cancel(Operators.java:1963) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators.set(Operators.java:1119) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMergeSequential$MergeSequentialInner.cancel(FluxMergeSequential.java:593) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMergeSequential$MergeSequentialMain.cancelAll(FluxMergeSequential.java:278) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMergeSequential$MergeSequentialMain.drain(FluxMergeSequential.java:378) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMergeSequential$MergeSequentialMain.innerComplete(FluxMergeSequential.java:321) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMergeSequential$MergeSequentialInner.onComplete(FluxMergeSequential.java:576) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1989) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.doComplete(FluxPublishOn.java:504) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.checkTerminated(FluxPublishOn.java:551) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.runAsync(FluxPublishOn.java:431) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.run(FluxPublishOn.java:526) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.scheduler.ImmediateScheduler$ImmediateSchedulerWorker.schedule(ImmediateScheduler.java:79) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.trySchedule(FluxPublishOn.java:311) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.onComplete(FluxPublishOn.java:257) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxExpand$ExpandBreathSubscriber.drainQueue(FluxExpand.java:162) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxExpand$ExpandBreathSubscriber.onComplete(FluxExpand.java:141) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.SerializedSubscriber.onComplete(SerializedSubscriber.java:146) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onComplete(FluxRetryWhen.java:188) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1756) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:171) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1989) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.SerializedSubscriber.onComplete(SerializedSubscriber.java:146) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onComplete(FluxRetryWhen.java:188) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1756) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:171) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1989) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1756) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1755) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:171) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:270) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:270) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onComplete(FluxHandleFuseable.java:223) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onComplete(FluxMapFuseable.java:336) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onComplete(FluxDoFinally.java:138) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onComplete(FluxHandleFuseable.java:223) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onComplete(FluxContextStart.java:115) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1756) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:121) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:270) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
        at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:378) [reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:372) [reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:428) [reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:617) [reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) [reactor-netty-0.9.10.BUILD-SNAPSHOT.jar:0.9.10.BUILD-SNAPSHOT]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1518) [netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267) [netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314) [netty-handler-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) [netty-common-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.49.Final.jar:4.1.49.Final]
        at java.lang.Thread.run(Thread.java:834) [?:?]

@kushagraThapar Thanks. I committed an additional fix to the PR, if you can test it, it will be great!

Definitely, let me test it out .. will update you with the results.

@violetagg - for some reason I am not able to build the latest changes in the PR. I tried multiple times, and the build is not completing..

Here are the commands I tried :

./gradlew build
AND
./gradlew build -x test  

I am seeing a lot of test failures as well , which I don't remember seeing last time (but I could be wrong)

Starting a Gradle Daemon (subsequent builds will be faster)

> Task :downloadBaseline UP-TO-DATE
Will download and perform baseline comparison with 0.9.9.RELEASE

> Task :shadedJarTest

reactor.netty.tcp.TcpServerTests > testGracefulShutdown FAILED
    java.lang.AssertionError at TcpServerTests.java:929

reactor.netty.tcp.TcpServerTests > testChannelGroupClosesAllConnections FAILED
    java.lang.AssertionError at TcpServerTests.java:841

reactor.netty.tcp.TcpServerTests > testIssue688 FAILED
    java.lang.AssertionError at TcpServerTests.java:883

reactor.netty.tcp.TcpClientTests > testIssue585_1 FAILED
    reactor.core.Exceptions$ReactiveException at TcpClientTests.java:930
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.tcp.TcpClientTests > testIssue585_2 FAILED
    reactor.core.Exceptions$ReactiveException at TcpClientTests.java:988
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.tcp.TcpClientTests > testIssue600_1 FAILED
    java.lang.AssertionError at TcpClientTests.java:820

reactor.netty.tcp.TcpClientTests > testIssue600_2 FAILED
    java.lang.AssertionError at TcpClientTests.java:820

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionPredicateFalse FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:292
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionDisabled FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:124
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > compressionServerEnabledClientDisabledIsNone FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:375
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionDefault FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:90
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > trueEnabledIncludeContentEncoding FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:64
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > compressionServerDefaultClientDefaultIsNone FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:406
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionPredicateTrue FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:245
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionEnabledBigResponse FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:330
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionEnabledSmallResponse FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:205
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > compressionActivatedOnClientAddsHeader FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:436
        Caused by: io.netty.channel.ConnectTimeoutException

reactor.netty.http.HttpCompressionClientServerTests > serverCompressionAlwaysEnabled FAILED
    reactor.core.Exceptions$ReactiveException at HttpCompressionClientServerTests.java:159
        Caused by: io.netty.channel.ConnectTimeoutException
<===========--> 87% EXECUTING [10m 0s]

reactor.netty.http.server.HttpServerTests > testGracefulShutdown FAILEDests
    org.junit.ComparisonFailure at HttpServerTests.java:1710

reactor.netty.http.server.HttpServerTests > testCustomHandlerInvokedBeforeIOHandler FAILED
    java.lang.AssertionError at HttpServerTests.java:1104

reactor.netty.http.server.HttpServerTests > testExpectErrorWhenConnectionClosed FAILED
    java.lang.AssertionError

reactor.netty.http.server.HttpServerTests > contextShouldBeTransferredFromDownStreamToUpStream FAILED
    java.lang.AssertionError at HttpServerTests.java:810

reactor.netty.http.server.HttpServerTests > testIssue186 FAILED
    java.lang.AssertionError at HttpServerTests.java:746

Please let me know if there is a faster way to build the library locally ?

@kushagraThapar can you try just ./gradlew publishToMavenLocal this will just build the artefact and publish it to the local maven repo

@violetagg - I verified and this fix works well :)
I am not seeing the issue anymore at all.

Thank you so much for your efforts and fixing this issue.

Let me know once this gets released, I will update the azure java sdks to the released version.

@kushagraThapar Thanks for testing the fix. It will be available with next release 0.9.10.

@violetagg - can you please let me know the tentative release date for 0.9.10.RELEASE ?
Also, once this is out, do we need to upgrade reactor-core versions as well (as part of compatible changes) ?

@kushagraThapar the current plan is for 20.07. We will release both reactor core + netty.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

eugene-sadovsky picture eugene-sadovsky  Â·  8Comments

violetagg picture violetagg  Â·  8Comments

nebhale picture nebhale  Â·  4Comments

magx2 picture magx2  Â·  6Comments

philwebb picture philwebb  Â·  3Comments