client: fix stream creation issue with transparent retry #5503
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.
Note: I am fairly sure the comment formatting change is caused by using a preview version of Go 1.19, meaning we all will see that behavior forced by
gofmt
soon.Fixes #5341
Description:
We need to create a brand new attempt every time we retry the initial op that gets the transport and creates the stream. Once that op is committed and added to the replay log, it is handled by the retry+replay logic, but until then, it currently does retries using the original attempt. This was mostly OK, but leads to a potential infinite loop:
getTransport()
- succeedsnewStream()
- fails with a transparently retryable error, as the transport died at the exact right momentgetTransport
- failsshouldRetry
should not allow transparent retry in this case, but it does because the original attempt had the field set.If no transport is ever attainable after this, it will loop until the RPC's context expires.
RELEASE NOTES: