Received a `Maximum active streams violated for this endpoint.` from client side
See original GitHub issuearmeria version: 1.8.0
verified client-side isn’t changing MAX_CONCURRENT_STREAMS
java.util.concurrent.CompletionException: com.linecorp.armeria.client.UnprocessedRequestException: io.netty.handler.codec.http2.Http2Exception$StreamException: Maximum active streams violated for this endpoint.
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:331)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:346)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:632)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088)
at com.linecorp.armeria.internal.common.HttpObjectAggregator.fail(HttpObjectAggregator.java:145)
at com.linecorp.armeria.internal.common.HttpObjectAggregator.onError(HttpObjectAggregator.java:61)
at com.linecorp.armeria.common.stream.DeferredStreamMessage$ForwardingSubscriber.onError(DeferredStreamMessage.java:347)
at com.linecorp.armeria.common.stream.AbstractStreamMessage$CloseEvent.notifySubscriber(AbstractStreamMessage.java:276)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.notifySubscriberOfCloseEvent0(DefaultStreamMessage.java:284)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.notifySubscriberOfCloseEvent(DefaultStreamMessage.java:276)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.handleCloseEvent(DefaultStreamMessage.java:448)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.notifySubscriber0(DefaultStreamMessage.java:391)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.doRequest(DefaultStreamMessage.java:259)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.request(DefaultStreamMessage.java:242)
at com.linecorp.armeria.common.stream.AbstractStreamMessage$SubscriptionImpl.request(AbstractStreamMessage.java:218)
at com.linecorp.armeria.common.stream.DeferredStreamMessage$ForwardingSubscriber.onSubscribe(DeferredStreamMessage.java:335)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.subscribe(DefaultStreamMessage.java:147)
at com.linecorp.armeria.common.stream.DefaultStreamMessage.subscribe(DefaultStreamMessage.java:130)
at com.linecorp.armeria.common.stream.AbstractStreamMessage.subscribe(AbstractStreamMessage.java:67)
at com.linecorp.armeria.common.stream.DeferredStreamMessage.safeOnSubscribeToUpstream(DeferredStreamMessage.java:282)
at com.linecorp.armeria.common.stream.DeferredStreamMessage.delegate(DeferredStreamMessage.java:121)
at com.linecorp.armeria.common.DeferredHttpResponse.delegate(DeferredHttpResponse.java:48)
at com.linecorp.armeria.common.DeferredHttpResponse.lambda$delegateWhenComplete$0(DeferredHttpResponse.java:59)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930)
at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:907)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
at com.linecorp.armeria.client.retry.RetryingClient.lambda$handleBackoff$9(RetryingClient.java:398)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930)
at java.base/java.util.concurrent.CompletableFuture.uniHandleStage(CompletableFuture.java:946)
at java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:2266)
at java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:143)
at com.linecorp.armeria.client.retry.RetryingClient.lambda$handleResponse$6(RetryingClient.java:352)
at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:753)
at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731)
at java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2108)
at com.linecorp.armeria.client.retry.RetryingClient.handleResponse(RetryingClient.java:312)
at com.linecorp.armeria.client.retry.RetryingClient.doExecute0(RetryingClient.java:297)
at com.linecorp.armeria.client.retry.RetryingClient.lambda$handleBackoff$8(RetryingClient.java:392)
at com.linecorp.armeria.common.RequestContext.lambda$makeContextAware$3(RequestContext.java:546)
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:384)
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)
Caused by: com.linecorp.armeria.client.UnprocessedRequestException: io.netty.handler.codec.http2.Http2Exception$StreamException: Maximum active streams violated for this endpoint.
at com.linecorp.armeria.client.UnprocessedRequestException.of(UnprocessedRequestException.java:45)
at com.linecorp.armeria.client.HttpRequestSubscriber.operationComplete(HttpRequestSubscriber.java:134)
at com.linecorp.armeria.client.HttpRequestSubscriber.operationComplete(HttpRequestSubscriber.java:54)
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.addListener(DefaultPromise.java:184)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
at com.linecorp.armeria.client.HttpRequestSubscriber.writeFirstHeader(HttpRequestSubscriber.java:205)
at com.linecorp.armeria.client.HttpRequestSubscriber.onSubscribe(HttpRequestSubscriber.java:181)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$DownstreamSubscription.invokeOnSubscribe0(DefaultStreamMessageDuplicator.java:672)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$DownstreamSubscription.invokeOnSubscribe(DefaultStreamMessageDuplicator.java:663)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$StreamMessageProcessor.doSubscribe(DefaultStreamMessageDuplicator.java:292)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$StreamMessageProcessor.subscribe(DefaultStreamMessageDuplicator.java:272)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$ChildStreamMessage.subscribe0(DefaultStreamMessageDuplicator.java:537)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$ChildStreamMessage.subscribe(DefaultStreamMessageDuplicator.java:525)
at com.linecorp.armeria.common.stream.DefaultStreamMessageDuplicator$ChildStreamMessage.subscribe(DefaultStreamMessageDuplicator.java:515)
at com.linecorp.armeria.common.stream.StreamMessageWrapper.subscribe(StreamMessageWrapper.java:80)
at com.linecorp.armeria.client.HttpSessionHandler.invoke(HttpSessionHandler.java:203)
at com.linecorp.armeria.client.HttpClientDelegate.doExecute(HttpClientDelegate.java:276)
at com.linecorp.armeria.client.HttpClientDelegate.acquireConnectionAndExecute(HttpClientDelegate.java:162)
at com.linecorp.armeria.client.HttpClientDelegate.finishResolve(HttpClientDelegate.java:123)
at com.linecorp.armeria.client.HttpClientDelegate.execute(HttpClientDelegate.java:106)
at com.linecorp.armeria.client.HttpClientDelegate.execute(HttpClientDelegate.java:51)
at com.linecorp.armeria.client.metric.AbstractMetricCollectingClient.execute(AbstractMetricCollectingClient.java:62)
at com.linecorp.armeria.internal.client.ClientUtil.pushAndExecute(ClientUtil.java:150)
at com.linecorp.armeria.internal.client.ClientUtil.executeWithFallback(ClientUtil.java:138)
at com.linecorp.armeria.client.retry.RetryingClient.doExecute0(RetryingClient.java:286)
... 11 common frames omitted
Caused by: io.netty.handler.codec.http2.Http2Exception$StreamException: Maximum active streams violated for this endpoint.
at io.netty.handler.codec.http2.Http2Exception.streamError(Http2Exception.java:152)
at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.checkNewStreamAllowed(DefaultHttp2Connection.java:896)
at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.createStream(DefaultHttp2Connection.java:748)
at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.createStream(DefaultHttp2Connection.java:668)
at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders0(DefaultHttp2ConnectionEncoder.java:201)
at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders(DefaultHttp2ConnectionEncoder.java:151)
at io.netty.handler.codec.http2.DecoratingHttp2FrameWriter.writeHeaders(DecoratingHttp2FrameWriter.java:45)
at com.linecorp.armeria.client.ClientHttp2ObjectEncoder.doWriteHeaders(ClientHttp2ObjectEncoder.java:73)
at com.linecorp.armeria.client.ClientHttpObjectEncoder.writeHeaders(ClientHttpObjectEncoder.java:41)
at com.linecorp.armeria.client.HttpRequestSubscriber.writeFirstHeader(HttpRequestSubscriber.java:204)
... 30 common frames omitted
Issue Analytics
- State:
- Created 2 years ago
- Comments:11 (11 by maintainers)
Top Results From Across the Web
“Maximum active streams violated for this endpoint” Error ...
You received this message because you are subscribed to the Google Groups "finaglers" group. To unsubscribe from this group and stop receiving emails...
Read more >Received GOAWAY from APNs server: Maximum active ...
Received GOAWAY from APNs server: Maximum active streams violated for this endpoint. whats does this mean exactly? I am creating a Pool of...
Read more >MAX_CONCURRENT_STREAMS=1 | Apple Developer Forums
Received GOAWAY from APNs server: Maximum active streams violated for this endpoint., errorcode is: 7, last stream id is: 1355.
Read more >Http2Connection.Endpoint (Netty API Reference (4.1.85.Final))
Gets the maximum number of streams (created by this endpoint) that are allowed to be active at the same time. This is the...
Read more >Sampled stream - Handling disconnections - Twitter Developer
A streaming server is restarted on the Twitter side. This is usually related to a code deploy and should be generally expected and...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found

Thanks for the detailed analysis!
I think I understand why the exception occurs for the first case consistently.
The callback in
thenRun()is run from the eventloop where the response is closed. At this point,unfinishedResponseshas been decremented, but netty’snumActiveStreamshasn’t been decremented yet.So I believe the flow is as follows:
unfinishedResponses == 0, butnumActiveStreams == 1.MAX_CONCURRENT_STREAMS = 10)unfinishedResponses == 9, butnumActiveStreams == 10.MAX_CONCURRENT_STREAMSviolation.I’ve also verified that the test code passes for the branch #3908
Demonstration…: https://github.com/ks-yim/max-stream-violated/blob/main/src/test/java/MaxStreamViolatedTest.java
It turns out that I was wrong about the cause in the above comment. It’s not related to decorator or 2 different clients with the same host.
The exception occurs when requests are made in a callback of another request like…:
More on this in the demo code.