Skip to content

xds-client/retry: add jitter to connection backoff#2738

Open
W4lspirit wants to merge 2 commits into
grpc:masterfrom
W4lspirit:xds-client-reconnect-backoff-jitter
Open

xds-client/retry: add jitter to connection backoff#2738
W4lspirit wants to merge 2 commits into
grpc:masterfrom
W4lspirit:xds-client-reconnect-backoff-jitter

Conversation

@W4lspirit

Copy link
Copy Markdown

Motivation

The reconnect backoff was fully deterministic: every client that lost its xDS stream at the same time (control-plane restart or a network blip) computed the identical delay schedule and retried in lockstep. That synchronized retry storm hammers the management server right when it's least able to absorb it.

Solution

Randomize each delay by a configurable factor per gRFC A6 so clients spread their reconnects across a window instead of colliding. Default jitter is 0.2 (±20%) ; with_jitter validates the factor is in [0.0, 1.0], and 0.0 restores the old deterministic behavior.

Random

I hesitated between rand crate and fastrand, in the end I fallback to the same dep grpc is already using for the jitter in named_resolution

Randomize each backoff delay by a configurable factor (gRFC A6) so
reconnecting clients don't retry in lockstep.

Default jitter is 0.2 (±20%); `with_jitter` validates the factor is in
[0.0, 1.0] and 0.0 disables it.
Adds the `rand` dependency.
@gu0keno0
gu0keno0 requested a review from YutaoMa July 17, 2026 15:46
self.attempt += 1;
Some(duration)
let factor = 1.0 + self.policy.jitter * rand::rng().random_range(-1.0..1.0);
Some(base.mul_f64(factor))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

negative value would cause panic here, and because currently RetryPolicy fields are public, the [0.0, 1.0] range isn't a type level invariant. grpc-go clamps backoff to be non-negative, but I'm good with privatize RetryPolicy and enforce invariant there if you want.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@YutaoMa Addressed in eeca7f2 (all fields are private)

Let me know what you think .

@YutaoMa

YutaoMa commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Thanks for the PR! All logic and tests looks great to me, my only comment is regarding the negative delay issue above. Feel free to address it and ping me again for approval.

Even after constructing a valid retry policy, a user could still
manually mutate any field with invalid values.
@W4lspirit
W4lspirit requested a review from YutaoMa July 21, 2026 21:26
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.

2 participants