Skip to content

rls: implement stale_header_data caching and propagation in RLS - #12972

Open
AgraVator wants to merge 2 commits into
grpc:masterfrom
AgraVator:fix-rls-stale-header-data-542322498
Open

rls: implement stale_header_data caching and propagation in RLS#12972
AgraVator wants to merge 2 commits into
grpc:masterfrom
AgraVator:fix-rls-stale-header-data-542322498

Conversation

@AgraVator

Copy link
Copy Markdown
Contributor

This PR implements stale_header_data caching and propagation for Route Lookup Service (RLS) in :grpc-rls, addressing gRPC Java does not handle RLS stale_header_data properly).

Background & Context:
The RLS control plane returns a header_data fingerprint token in RouteLookupResponse. The client is expected to cache this token and reuse it in:

  1. Subsequent background control-channel refresh requests (RouteLookupRequest with reason = REASON_STALE and stale_header_data = <cached_token>).
  2. Attached metadata headers (X-Google-RLS-Data) on picked data RPC requests.

This implementation aligns gRPC Java with the Go gRPC client RLS implementation (balancer/rls/picker.go and balancer/rls/control_channel.go).

Fixes b/542322498

This PR implements stale_header_data caching and propagation for Route Lookup Service (RLS) in :grpc-rls, addressing Buganizer issue b/542322498 ([CS][DirectPath] gRPC Java does not handle RLS stale_header_data properly).

Background & Context:
When using Cloud Spanner Route Lookup Service (RLS), the RLS control plane returns a header_data fingerprint token in RouteLookupResponse. The client is expected to cache this token and reuse it in:
1. Subsequent background control-channel refresh requests (RouteLookupRequest with reason = REASON_STALE and stale_header_data = <cached_token>).
2. Attached metadata headers (X-Google-RLS-Data) on picked data RPC requests.

This implementation aligns gRPC Java with the Go gRPC client RLS implementation (balancer/rls/picker.go and balancer/rls/control_channel.go).

Key Changes:
- RlsProtoData.java: Added @nullable String staleHeaderData() property to RouteLookupRequest.
- RlsProtoConverters.java: Updated RouteLookupRequestConverter to serialize/deserialize stale_header_data.
- CachingRlsLbClient.java: Updated asyncRlsCall and DataCacheEntry.maybeRefresh() to pass getHeaderData() on REASON_STALE.
- Unit & Stress Test Coverage: Added tests in RlsProtoConvertersTest, CachingRlsLbClientTest, and StaleHeaderDataStressTest.

Testing & Verification:
- Executed ./gradlew :grpc-rls:test --rerun-tasks
- Result: All 82 unit and stress tests in :grpc-rls passed cleanly.

Fixes b/542322498
@AgraVator
AgraVator marked this pull request as ready for review August 5, 2026 16:22
@AgraVator
AgraVator requested a review from kannanjgithub August 5, 2026 16:23
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.

1 participant