Skip to content

Commit 870d1df

Browse files
committed
xds: buffer responses during ext-proc request draining
When the external processor stream state is DRAINING, response headers, status, and trailers received from the upstream server should not be processed or forwarded immediately. Modify ExternalProcessorClientInterceptor to buffer these response headers and status/trailers in savedHeaders, savedStatus, and savedTrailers, returning early when in DRAINING state. These will be flushed and delivered to the application call listener once the sidecar stream completes.
1 parent 6b309ce commit 870d1df

2 files changed

Lines changed: 272 additions & 94 deletions

File tree

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,10 @@ public void onHeaders(Metadata headers) {
12001200
System.out.println("=== CLIENT RECEIVED RESPONSE HEADERS: " + headers + " ===");
12011201
dataPlaneClientCall.serverHeadersStartNanos = System.nanoTime();
12021202
responseHeadersSent.set(true);
1203+
if (dataPlaneClientCall.extProcStreamState.get().isDraining()) {
1204+
this.savedHeaders = headers;
1205+
return;
1206+
}
12031207
boolean sendResponseHeaders =
12041208
dataPlaneClientCall.currentProcessingMode.getResponseHeaderMode()
12051209
== ProcessingMode.HeaderSendMode.SEND
@@ -1284,6 +1288,10 @@ public void onClose(Status status, Metadata trailers) {
12841288
return;
12851289
}
12861290

1291+
if (dataPlaneClientCall.extProcStreamState.get().isDraining()) {
1292+
return;
1293+
}
1294+
12871295
if (!responseHeadersSent.get()) {
12881296
trailersOnly.set(true);
12891297
}

0 commit comments

Comments
 (0)