Fix a BinderServerTransport crash in the rare shutdown-before-start case#12440
Merged
jdcormie merged 1 commit intogrpc:masterfrom Oct 24, 2025
Merged
Fix a BinderServerTransport crash in the rare shutdown-before-start case#12440jdcormie merged 1 commit intogrpc:masterfrom
jdcormie merged 1 commit intogrpc:masterfrom
Conversation
47778b6 to
ef64165
Compare
ef64165 to
0e95a1d
Compare
ejona86
approved these changes
Oct 24, 2025
Member
ejona86
left a comment
There was a problem hiding this comment.
OkHttp/Netty on server-side don't notify shutdown/termination from the calling thread. They instead trigger operations for the reader and the reader calls the methods. For example, shutdownNow() when still starting will close the connection's file descriptor, which the reading thread will see and notify termination, the same way it does if the client closes the connection. I can see why Binder would be different in this regard.
AgraVator
pushed a commit
to AgraVator/grpc-java
that referenced
this pull request
Nov 3, 2025
…ase (grpc#12440) The `isShutdown()` clause of `BinderServerTransport#start()` code was completely untested and did not in fact work. The problem is that if the listener does in fact arrive via start() after shutdown, BinderTransport's `shutdownInternal()` has already set the state to `SHUTDOWN_TERMINATED` (which is not a valid transition from itself). It has also already scheduled a call to notifyTerminated() and releaseExecutors(). This causes a duplicate call to `transportTerminated` and releasing the same executor twice. This commit changes `start()` to leave changing state and releasing executors to `shutdownInternal()`'s. `notifyTerminated()` either runs then (if already started) or from within `start()` (if not yet started) Fixes grpc#12439.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The following
BinderServerTransport#start()code was completely untested and did not in fact work:The problem is that if the listener does in fact arrive via start() after shutdown, BinderTransport's
shutdownInternal()has already set the state toSHUTDOWN_TERMINATED(which is not a valid transition from itself). It has also already scheduled a call to notifyTerminated() and releaseExecutors(). This causes a duplicate call totransportTerminatedand releasing the same executor twice.This PR changes
start()to leave changing state and releasing executors toshutdownInternal()'s.notifyTerminated()either runs then (if already started) or from withinstart()(if not yet started)Fixes #12439.