Recover cancellation when close responses flow #344
Merged
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.
When streaming call is cancelled it's handled in
sender
coroutine (lines 311-319). Both client call cancellation (line 316) and failure propagation (line 317) eventually reach the listeneronClose
callback (whereresponses
flow is closed), but which one reaches the place first is racy. When failure propagation reaches the callback first, the flow is cancelled with cancellation exception (expected). But if the client call cancel reaches the callback first, the flow is cancelled with GRPC status exception (unexpected).This change recovers the cancellation from GRPC status exception if it was the cause to make the behavior deterministic and aligned with expectations.
I don't know how to test this change reliably. I succeeded to reproduce the issue via slow emulator tests only with some chance over 100+ runs.