Skip to content

Move connection window update before stream termination logic - #12990

Open
eado wants to merge 1 commit into
grpc:masterfrom
eado:window
Open

Move connection window update before stream termination logic#12990
eado wants to merge 1 commit into
grpc:masterfrom
eado:window

Conversation

@eado

@eado eado commented Aug 14, 2026

Copy link
Copy Markdown

By RFC 9113, section 6.9, receivers must take frames into account for flow control even if they're errored.

This change moves the stream error response logic after connection window updates

@linux-foundation-easycla

linux-foundation-easycla Bot commented Aug 14, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: eado / name: Omar Elamri (9c9d2c1)

By RFC 9113, section 6.9, receivers must take frames into account for
flow control even if they're errored.

This change moves the stream error response logic after connection
window updates
@eado

eado commented Aug 14, 2026

Copy link
Copy Markdown
Author

I have not been able to repro the below issue locally:

TomcatInteropTest > largeUnary FAILED
    io.grpc.StatusRuntimeException: INTERNAL: Abrupt GOAWAY closed sent stream. HTTP/2 error code: FRAME_SIZE_ERROR, debug data: The payload is [1234123] bytes long but the maximum frame size is [16384]
        at app//io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:368)
        at app//io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:349)
        at app//io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:174)
        at app//io.grpc.testing.integration.TestServiceGrpc$TestServiceBlockingStub.unaryCall(TestServiceGrpc.java:714)
        at app//io.grpc.testing.integration.AbstractInteropTest.largeUnary(AbstractInteropTest.java:450)
        at java.base@11.0.32/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base@11.0.32/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base@11.0.32/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base@11.0.32/java.lang.reflect.Method.invoke(Method.java:566)
        at app//org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
        at app//org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at app//org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
        at app//org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at app//org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at app//org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:299)
        at app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:293)
        at java.base@11.0.32/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base@11.0.32/java.lang.Thread.run(Thread.java:829)

What would cause it to send 1234123 bytes in a frame though?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant