Skip to content

Commit 1825a74

Browse files
committed
xds: support protocol config and request attributes propagation in server interceptor
Defer protocol configuration and request attributes propagation in ExternalProcessorServerInterceptor to occur on the first applicable request sent to the external processor instead of strictly on request headers. - Updated ExternalProcessorServerInterceptor to store collected request attributes during initialization in start() and propagate them on the first client-to-server request (either request headers or request body). - Updated protocol configuration to be sent on the very first request sent to the external processor. - Added Category 3 (Protocol Config Propagation) and Category 4 (Request Attributes Propagation) integration tests in ExternalProcessorServerInterceptorTest matching the category structuring of the client interceptor tests. - Re-categorized existing server interceptor tests to maintain consistency.
1 parent 40b3889 commit 1825a74

2 files changed

Lines changed: 938 additions & 292 deletions

File tree

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

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ private enum EventType {
319319
private volatile Status savedStatus;
320320
private volatile Metadata savedTrailers;
321321

322+
private boolean protocolConfigSent = false;
323+
private ImmutableMap<String, Struct> collectedAttributes;
324+
private boolean requestAttributesSent = false;
325+
322326
private long clientHeadersStartNanos;
323327
private long clientHalfCloseStartNanos;
324328
private long serverHeadersStartNanos;
@@ -512,6 +516,8 @@ private void applyHeaderMutations(Metadata metadata, HeaderMutation mutation)
512516

513517
void start() {
514518
clientHeadersStartNanos = System.nanoTime();
519+
this.collectedAttributes = collectAttributes(
520+
config.getRequestAttributes(), method, authority, requestHeaders);
515521

516522
extProcStub.process(new ClientResponseObserver<ProcessingRequest, ProcessingResponse>() {
517523
@Override
@@ -660,12 +666,6 @@ public void onCompleted() {
660666
.setHeaders(toHeaderMap(requestHeaders, config.getForwardRulesConfig()))
661667
.setEndOfStream(false)
662668
.build())
663-
.putAllAttributes(
664-
collectAttributes(config.getRequestAttributes(), method, authority, requestHeaders))
665-
.setProtocolConfig(ProtocolConfiguration.newBuilder()
666-
.setRequestBodyMode(currentProcessingMode.getRequestBodyMode())
667-
.setResponseBodyMode(currentProcessingMode.getResponseBodyMode())
668-
.build())
669669
.build());
670670
}
671671

@@ -679,20 +679,49 @@ private void sendToExtProc(ProcessingRequest request) {
679679
if (isExtProcStreamCompleted()) {
680680
return;
681681
}
682+
683+
ProcessingRequest requestToSend = request;
684+
if (!protocolConfigSent) {
685+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
686+
.setProtocolConfig(ProtocolConfiguration.newBuilder()
687+
.setRequestBodyMode(currentProcessingMode.getRequestBodyMode())
688+
.setResponseBodyMode(currentProcessingMode.getResponseBodyMode())
689+
.build())
690+
.build();
691+
protocolConfigSent = true;
692+
}
693+
694+
boolean isClientServerMessage =
695+
requestToSend.hasRequestHeaders() || requestToSend.hasRequestBody();
696+
if (isClientServerMessage
697+
&& !requestAttributesSent
698+
&& collectedAttributes != null
699+
&& !collectedAttributes.isEmpty()) {
700+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
701+
.putAllAttributes(collectedAttributes)
702+
.build();
703+
requestAttributesSent = true;
704+
}
705+
706+
if (config.getObservabilityMode()) {
707+
requestToSend = ProcessingRequest.newBuilder(requestToSend)
708+
.setObservabilityMode(true)
709+
.build();
710+
}
682711

683-
if (request.hasRequestHeaders()) {
712+
if (requestToSend.hasRequestHeaders()) {
684713
expectedResponses.add(EventType.REQUEST_HEADERS);
685-
} else if (request.hasRequestBody()) {
714+
} else if (requestToSend.hasRequestBody()) {
686715
expectedResponses.add(EventType.REQUEST_BODY);
687-
} else if (request.hasResponseHeaders()) {
716+
} else if (requestToSend.hasResponseHeaders()) {
688717
expectedResponses.add(EventType.RESPONSE_HEADERS);
689-
} else if (request.hasResponseBody()) {
718+
} else if (requestToSend.hasResponseBody()) {
690719
expectedResponses.add(EventType.RESPONSE_BODY);
691-
} else if (request.hasResponseTrailers()) {
720+
} else if (requestToSend.hasResponseTrailers()) {
692721
expectedResponses.add(EventType.RESPONSE_TRAILERS);
693722
}
694723

695-
extProcClientCallRequestObserver.onNext(request);
724+
extProcClientCallRequestObserver.onNext(requestToSend);
696725
}
697726
}
698727

0 commit comments

Comments
 (0)