Skip to content

Commit 53d2ba4

Browse files
xds: Make RawMessageClientInterceptor conditional on ext_proc flags (v1.83.x backport) (#13018)
Backport of #13015 to v1.83.x. --- Only add RawMessageClientInterceptor to the interceptor chain in XdsNameResolver when either GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT or GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER is true. This prevents RawMessageClientInterceptor from corrupting method descriptors and causing empty payloads on retry attempts for regular xDS channels. Temporary fix for #13010
1 parent e6c3e3e commit 53d2ba4

2 files changed

Lines changed: 85 additions & 3 deletions

File tree

xds/src/main/java/io/grpc/xds/XdsNameResolver.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,10 @@ private ClientInterceptor createFilters(
905905
}
906906

907907
ImmutableList.Builder<ClientInterceptor> withRawMessage = ImmutableList.builder();
908-
withRawMessage.add(new RawMessageClientInterceptor());
908+
if (GrpcUtil.getFlag("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", false)
909+
|| GrpcUtil.getFlag("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", false)) {
910+
withRawMessage.add(new RawMessageClientInterceptor());
911+
}
909912
withRawMessage.addAll(filterInterceptors.build());
910913
return combineInterceptors(withRawMessage.build());
911914
}

xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,7 +2934,7 @@ private final class TestChannel extends Channel {
29342934
@Override
29352935
public <ReqT, RespT> ClientCall<ReqT, RespT> newCall(
29362936
MethodDescriptor<ReqT, RespT> methodDescriptor, CallOptions callOptions) {
2937-
TestCall<ReqT, RespT> call = new TestCall<>(callOptions);
2937+
TestCall<ReqT, RespT> call = new TestCall<>(methodDescriptor, callOptions);
29382938
testCall = call;
29392939
return call;
29402940
}
@@ -2946,11 +2946,13 @@ public String authority() {
29462946
}
29472947

29482948
private static final class TestCall<ReqT, RespT> extends NoopClientCall<ReqT, RespT> {
2949+
final MethodDescriptor<ReqT, RespT> methodDescriptor;
29492950
// CallOptions actually received from the channel when the call is created.
29502951
final CallOptions callOptions;
29512952
ClientCall.Listener<RespT> listener;
29522953

2953-
TestCall(CallOptions callOptions) {
2954+
TestCall(MethodDescriptor<ReqT, RespT> methodDescriptor, CallOptions callOptions) {
2955+
this.methodDescriptor = methodDescriptor;
29542956
this.callOptions = callOptions;
29552957
}
29562958

@@ -3038,4 +3040,81 @@ public void onMessage(String message) {
30383040
channel, METHOD_SAY_HELLO, CallOptions.DEFAULT, "World");
30393041
assertThat(response).isEqualTo("Hello World");
30403042
}
3043+
3044+
@Test
3045+
public void rawMessageClientInterceptor_flagFalse() {
3046+
String origClientProp = System.getProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT");
3047+
String origServerProp = System.getProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER");
3048+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", "false");
3049+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", "false");
3050+
try {
3051+
filterStateTestSetupResolver();
3052+
FakeXdsClient xdsClient = (FakeXdsClient) resolver.getXdsClient();
3053+
VirtualHost vhost = filterStateTestVhost();
3054+
3055+
xdsClient.deliverLdsUpdateWithFilters(vhost, filterStateTestConfigs(STATEFUL_1));
3056+
createAndDeliverClusterUpdates(xdsClient, cluster1);
3057+
3058+
// When flags are false, RawMessageClientInterceptor is not added.
3059+
assertClusterResolutionResult(call1, cluster1);
3060+
assertThat(testCall.methodDescriptor).isSameInstanceAs(call1.methodDescriptor);
3061+
} finally {
3062+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", origClientProp);
3063+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", origServerProp);
3064+
}
3065+
}
3066+
3067+
@Test
3068+
public void rawMessageClientInterceptor_flagTrue() {
3069+
String origClientProp = System.getProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT");
3070+
String origServerProp = System.getProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER");
3071+
3072+
// When GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT is true, RawMessageClientInterceptor is added.
3073+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", "true");
3074+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", "false");
3075+
try {
3076+
filterStateTestSetupResolver();
3077+
FakeXdsClient xdsClient = (FakeXdsClient) resolver.getXdsClient();
3078+
VirtualHost vhost = filterStateTestVhost();
3079+
3080+
xdsClient.deliverLdsUpdateWithFilters(vhost, filterStateTestConfigs(STATEFUL_1));
3081+
createAndDeliverClusterUpdates(xdsClient, cluster1);
3082+
3083+
assertClusterResolutionResult(call1, cluster1);
3084+
assertThat(testCall.methodDescriptor).isNotSameInstanceAs(call1.methodDescriptor);
3085+
} finally {
3086+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", origClientProp);
3087+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", origServerProp);
3088+
}
3089+
3090+
resolver.shutdown();
3091+
reset(mockListener);
3092+
when(mockListener.onResult2(any())).thenReturn(Status.OK);
3093+
3094+
// When GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER is true, RawMessageClientInterceptor is added.
3095+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", "false");
3096+
System.setProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", "true");
3097+
try {
3098+
filterStateTestSetupResolver();
3099+
FakeXdsClient xdsClient = (FakeXdsClient) resolver.getXdsClient();
3100+
VirtualHost vhost = filterStateTestVhost();
3101+
3102+
xdsClient.deliverLdsUpdateWithFilters(vhost, filterStateTestConfigs(STATEFUL_1));
3103+
createAndDeliverClusterUpdates(xdsClient, cluster1);
3104+
3105+
assertClusterResolutionResult(call1, cluster1);
3106+
assertThat(testCall.methodDescriptor).isNotSameInstanceAs(call1.methodDescriptor);
3107+
} finally {
3108+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_CLIENT", origClientProp);
3109+
restoreProperty("GRPC_EXPERIMENTAL_XDS_EXT_PROC_ON_SERVER", origServerProp);
3110+
}
3111+
}
3112+
3113+
private static void restoreProperty(String key, @Nullable String value) {
3114+
if (value == null) {
3115+
System.clearProperty(key);
3116+
} else {
3117+
System.setProperty(key, value);
3118+
}
3119+
}
30413120
}

0 commit comments

Comments
 (0)