Skip to content

core: DelayedStream should start() real stream immediately#7750

Merged
ejona86 merged 3 commits intogrpc:masterfrom
ejona86:delayedtransportshutdownrace
Jan 20, 2021
Merged

core: DelayedStream should start() real stream immediately#7750
ejona86 merged 3 commits intogrpc:masterfrom
ejona86:delayedtransportshutdownrace

Conversation

@ejona86
Copy link
Copy Markdown
Member

@ejona86 ejona86 commented Dec 22, 2020

DelayedClientTransport needs to avoid becoming terminated while it owns
RPCs. Previously DelayedClientTransport could terminate when some of its
RPCs had their realStream but realStream.start() hadn't yet been called.

To avoid that, we now make sure to call realStream.start()
synchronously with setting realStream. Since start() and the method
calls before start execute quickly, we can run it in-line. But it does
mean we now need to split the Stream methods into "before start" and
"after start" categories for queuing.

Fixes #6283

CC @voidzcy

DelayedClientTransport needs to avoid becoming terminated while it owns
RPCs. Previously DelayedClientTransport could terminate when some of its
RPCs had their realStream but realStream.start() hadn't yet been called.

To avoid that, we now make sure to call realStream.start()
synchronously with setting realStream. Since start() and the method
calls before start execute quickly, we can run it in-line. But it does
mean we now need to split the Stream methods into "before start" and
"after start" categories for queuing.

Fixes grpc#6283
@ejona86
Copy link
Copy Markdown
Member Author

ejona86 commented Dec 22, 2020

A test will be added as part of #7749

@YifeiZhuang
Copy link
Copy Markdown
Member

YifeiZhuang commented Jan 6, 2021

We went through the flow, and here is an over simplified chart to illustrate why RPCs will never be orphaned after the fix.
delayed stream start then set
delayed stream set then start

FYI @dapengzhang0

Copy link
Copy Markdown
Contributor

@dapengzhang0 dapengzhang0 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. A couple of minor comments.

Comment thread core/src/main/java/io/grpc/internal/DelayedClientTransport.java
Comment thread core/src/main/java/io/grpc/internal/DelayedStream.java Outdated
Comment thread core/src/main/java/io/grpc/internal/DelayedStream.java
@ejona86 ejona86 requested a review from YifeiZhuang January 20, 2021 22:46
@ejona86 ejona86 merged commit 7b8105e into grpc:master Jan 20, 2021
@ejona86 ejona86 deleted the delayedtransportshutdownrace branch January 20, 2021 23:01
YifeiZhuang added a commit that referenced this pull request Jan 29, 2021
Add more delayedStream tests related to #7750, where we changed to call realStream.start() synchronously with setting realStream.
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Jun 3, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DelayedClientTransport can trigger RejectedExecutionException

3 participants