@@ -185,6 +185,14 @@ public static EnhancedBigtableStubSettings finalizeSettings(
185
185
// workaround JWT audience issues
186
186
patchCredentials (builder );
187
187
188
+ // patch cookies interceptor
189
+ InstantiatingGrpcChannelProvider .Builder transportProvider = null ;
190
+ if (builder .getTransportChannelProvider () instanceof InstantiatingGrpcChannelProvider ) {
191
+ transportProvider =
192
+ ((InstantiatingGrpcChannelProvider ) builder .getTransportChannelProvider ()).toBuilder ();
193
+ transportProvider .setInterceptorProvider (() -> ImmutableList .of (new CookiesInterceptor ()));
194
+ }
195
+
188
196
// Inject channel priming
189
197
if (settings .isRefreshingChannel ()) {
190
198
// Fix the credentials so that they can be shared
@@ -194,20 +202,18 @@ public static EnhancedBigtableStubSettings finalizeSettings(
194
202
}
195
203
builder .setCredentialsProvider (FixedCredentialsProvider .create (credentials ));
196
204
197
- // Inject the primer
198
- InstantiatingGrpcChannelProvider transportProvider =
199
- (InstantiatingGrpcChannelProvider ) settings .getTransportChannelProvider ();
200
-
201
- builder .setTransportChannelProvider (
202
- transportProvider
203
- .toBuilder ()
204
- .setChannelPrimer (
205
- BigtableChannelPrimer .create (
206
- credentials ,
207
- settings .getProjectId (),
208
- settings .getInstanceId (),
209
- settings .getAppProfileId ()))
210
- .build ());
205
+ if (transportProvider != null ) {
206
+ transportProvider .setChannelPrimer (
207
+ BigtableChannelPrimer .create (
208
+ credentials ,
209
+ settings .getProjectId (),
210
+ settings .getInstanceId (),
211
+ settings .getAppProfileId ()));
212
+ }
213
+ }
214
+
215
+ if (transportProvider != null ) {
216
+ builder .setTransportChannelProvider (transportProvider .build ());
211
217
}
212
218
213
219
ImmutableMap <TagKey , TagValue > attributes =
@@ -365,7 +371,11 @@ public <RowT> ServerStreamingCallable<Query, RowT> createReadRowsCallable(
365
371
new TracedServerStreamingCallable <>(
366
372
readRowsUserCallable , clientContext .getTracerFactory (), span );
367
373
368
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
374
+ // CookieHolder needs to be injected to the CallOptions outside of retries, otherwise retry
375
+ // attempts won't see a CookieHolder.
376
+ ServerStreamingCallable <Query , RowT > withCookie = new CookiesServerStreamingCallable <>(traced );
377
+
378
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
369
379
}
370
380
371
381
/**
@@ -401,7 +411,9 @@ public <RowT> UnaryCallable<Query, RowT> createReadRowCallable(RowAdapter<RowT>
401
411
new TracedUnaryCallable <>(
402
412
firstRow , clientContext .getTracerFactory (), getSpanName ("ReadRow" ));
403
413
404
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
414
+ UnaryCallable <Query , RowT > withCookie = new CookiesUnaryCallable <>(traced );
415
+
416
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
405
417
}
406
418
407
419
/**
@@ -642,7 +654,9 @@ private UnaryCallable<BulkMutation, Void> createBulkMutateRowsCallable() {
642
654
new TracedUnaryCallable <>(
643
655
tracedBatcherUnaryCallable , clientContext .getTracerFactory (), spanName );
644
656
645
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
657
+ UnaryCallable <BulkMutation , Void > withCookie = new CookiesUnaryCallable <>(traced );
658
+
659
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
646
660
}
647
661
648
662
/**
@@ -924,7 +938,10 @@ public Map<String, String> extract(
924
938
ServerStreamingCallable <String , ByteStringRange > traced =
925
939
new TracedServerStreamingCallable <>(retrying , clientContext .getTracerFactory (), span );
926
940
927
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
941
+ ServerStreamingCallable <String , ByteStringRange > withCookie =
942
+ new CookiesServerStreamingCallable <>(traced );
943
+
944
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
928
945
}
929
946
930
947
/**
@@ -1004,7 +1021,10 @@ public Map<String, String> extract(
1004
1021
new TracedServerStreamingCallable <>(
1005
1022
readChangeStreamUserCallable , clientContext .getTracerFactory (), span );
1006
1023
1007
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
1024
+ ServerStreamingCallable <ReadChangeStreamQuery , ChangeStreamRecordT > withCookie =
1025
+ new CookiesServerStreamingCallable <>(traced );
1026
+
1027
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
1008
1028
}
1009
1029
1010
1030
/**
@@ -1017,7 +1037,11 @@ private <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUserFacin
1017
1037
UnaryCallable <RequestT , ResponseT > traced =
1018
1038
new TracedUnaryCallable <>(inner , clientContext .getTracerFactory (), getSpanName (methodName ));
1019
1039
1020
- return traced .withDefaultCallContext (clientContext .getDefaultCallContext ());
1040
+ // CookieHolder needs to be injected to the CallOptions outside of retries, otherwise retry
1041
+ // attempts won't see a CookieHolder.
1042
+ UnaryCallable <RequestT , ResponseT > withCookie = new CookiesUnaryCallable <>(traced );
1043
+
1044
+ return withCookie .withDefaultCallContext (clientContext .getDefaultCallContext ());
1021
1045
}
1022
1046
1023
1047
private UnaryCallable <PingAndWarmRequest , PingAndWarmResponse > createPingAndWarmCallable () {
0 commit comments