Skip to content

servlet: Register response trailers before stream writes - #13029

Open
NianJiuZst wants to merge 1 commit into
grpc:masterfrom
NianJiuZst:codex/jetty-rst-stream-flake
Open

servlet: Register response trailers before stream writes#13029
NianJiuZst wants to merge 1 commit into
grpc:masterfrom
NianJiuZst:codex/jetty-rst-stream-flake

Conversation

@NianJiuZst

Copy link
Copy Markdown
Contributor

Summary

  • register the servlet response trailer supplier when the server stream is created
  • avoid registering trailers from writeHeaders(), after a client RST_STREAM may already have caused Jetty to commit the response
  • preserve the existing trailer population and write behavior

This removes the race where HttpServletResponse.setTrailerFields() throws IllegalStateException: Committed.

Testing

  • ./gradlew :grpc-servlet:jettyTest -PskipCodegen=true -PskipAndroid=true (80 tests, 19 skipped)
  • ./gradlew :grpc-servlet:tomcat9Test -PskipCodegen=true -PskipAndroid=true (78 tests, 29 skipped)
  • ./gradlew :grpc-servlet:undertowTest -PskipCodegen=true -PskipAndroid=true (78 tests, 23 skipped)
  • ./gradlew :grpc-servlet:checkstyleMain -PskipCodegen=true -PskipAndroid=true

Fixes #12777

Register the trailer supplier while creating the servlet stream, before a peer reset can cause the container to commit the response. This removes the race where Jetty throws IllegalStateException from writeHeaders after receiving RST_STREAM.

Fixes grpc#12777
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.

servlet: JettyTransportTest.frameAfterRstStreamShouldNotBreakClientChannel is flaky

1 participant