From 0c2341df6cc4dd00d554e84967a7af72b3ca9c44 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:19:22 -0700 Subject: [PATCH 1/2] feat: Adding GrpcRoutingHeaderInterceptorProvider to provide interceptor that adds routing headers that can be possibly used for optimized routing decisions in the backend. --- .../GrpcRoutingHeaderInterceptorProvider.java | 48 +++++++++++++++++++ .../v1/stub/FirestoreStubSettings.java | 6 ++- ...cRoutingHeaderInterceptorProviderTest.java | 33 +++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java create mode 100644 google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java new file mode 100644 index 000000000..409b0f64e --- /dev/null +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.firestore.v1; + +import com.google.api.core.InternalApi; +import com.google.api.gax.grpc.GrpcHeaderInterceptor; +import com.google.api.gax.grpc.GrpcInterceptorProvider; +import io.grpc.ClientInterceptor; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Nonnull; + +@InternalApi +public class GrpcRoutingHeaderInterceptorProvider implements GrpcInterceptorProvider { + private static final String X_GOOG_SKIP_FIRESTORE_DFE = "x-goog-firestore-skip-dfe"; + List clientInterceptors; + + private GrpcRoutingHeaderInterceptorProvider( + @Nonnull GrpcHeaderInterceptor grpcRoutingHeaderInterceptor) { + clientInterceptors = Collections.singletonList(grpcRoutingHeaderInterceptor); + } + + public static GrpcRoutingHeaderInterceptorProvider defaultGrpcRoutingHeaderInterceptorProvider() { + Map staticHeaders = new HashMap(); + staticHeaders.put(X_GOOG_SKIP_FIRESTORE_DFE, "true"); + return new GrpcRoutingHeaderInterceptorProvider(new GrpcHeaderInterceptor(staticHeaders)); + } + + @Override + public List getInterceptors() { + return clientInterceptors; + } +} diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java index 92d6c8a00..74f61bbb4 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java @@ -48,6 +48,7 @@ import com.google.api.gax.rpc.TransportChannelProvider; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.firestore.v1.GrpcRoutingHeaderInterceptorProvider; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -482,7 +483,10 @@ public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProvi } public static TransportChannelProvider defaultTransportChannelProvider() { - return defaultGrpcTransportProviderBuilder().build(); + return defaultGrpcTransportProviderBuilder() + .setInterceptorProvider( + GrpcRoutingHeaderInterceptorProvider.defaultGrpcRoutingHeaderInterceptorProvider()) + .build(); } public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java new file mode 100644 index 000000000..f701e2e48 --- /dev/null +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.firestore.v1; + +import static org.junit.Assert.assertEquals; + +import com.google.api.gax.grpc.GrpcHeaderInterceptor; +import io.grpc.ClientInterceptor; +import org.junit.Test; + +public class GrpcRoutingHeaderInterceptorProviderTest { + @Test + public void testDefaultGrpcRoutingHeaderInterceptorProvider() { + GrpcRoutingHeaderInterceptorProvider interceptorProvider = + GrpcRoutingHeaderInterceptorProvider.defaultGrpcRoutingHeaderInterceptorProvider(); + assertEquals(1, interceptorProvider.getInterceptors().size()); + ClientInterceptor clientInterceptor = interceptorProvider.getInterceptors().get(0); + assertEquals(GrpcHeaderInterceptor.class.getName(), clientInterceptor.getClass().getName()); + } +} From d158cb34b8768cf442d44cac8d19c793617eb90c Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Wed, 26 Mar 2025 20:23:17 +0000 Subject: [PATCH 2/2] chore: generate libraries at Wed Mar 26 20:21:39 UTC 2025 --- .../GrpcRoutingHeaderInterceptorProvider.java | 48 ------------------- .../v1/stub/FirestoreStubSettings.java | 6 +-- ...cRoutingHeaderInterceptorProviderTest.java | 33 ------------- 3 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java delete mode 100644 google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java deleted file mode 100644 index 409b0f64e..000000000 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.cloud.firestore.v1; - -import com.google.api.core.InternalApi; -import com.google.api.gax.grpc.GrpcHeaderInterceptor; -import com.google.api.gax.grpc.GrpcInterceptorProvider; -import io.grpc.ClientInterceptor; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.Nonnull; - -@InternalApi -public class GrpcRoutingHeaderInterceptorProvider implements GrpcInterceptorProvider { - private static final String X_GOOG_SKIP_FIRESTORE_DFE = "x-goog-firestore-skip-dfe"; - List clientInterceptors; - - private GrpcRoutingHeaderInterceptorProvider( - @Nonnull GrpcHeaderInterceptor grpcRoutingHeaderInterceptor) { - clientInterceptors = Collections.singletonList(grpcRoutingHeaderInterceptor); - } - - public static GrpcRoutingHeaderInterceptorProvider defaultGrpcRoutingHeaderInterceptorProvider() { - Map staticHeaders = new HashMap(); - staticHeaders.put(X_GOOG_SKIP_FIRESTORE_DFE, "true"); - return new GrpcRoutingHeaderInterceptorProvider(new GrpcHeaderInterceptor(staticHeaders)); - } - - @Override - public List getInterceptors() { - return clientInterceptors; - } -} diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java index 74f61bbb4..92d6c8a00 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/v1/stub/FirestoreStubSettings.java @@ -48,7 +48,6 @@ import com.google.api.gax.rpc.TransportChannelProvider; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.api.gax.rpc.UnaryCallable; -import com.google.cloud.firestore.v1.GrpcRoutingHeaderInterceptorProvider; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -483,10 +482,7 @@ public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProvi } public static TransportChannelProvider defaultTransportChannelProvider() { - return defaultGrpcTransportProviderBuilder() - .setInterceptorProvider( - GrpcRoutingHeaderInterceptorProvider.defaultGrpcRoutingHeaderInterceptorProvider()) - .build(); + return defaultGrpcTransportProviderBuilder().build(); } public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java deleted file mode 100644 index f701e2e48..000000000 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/v1/GrpcRoutingHeaderInterceptorProviderTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.cloud.firestore.v1; - -import static org.junit.Assert.assertEquals; - -import com.google.api.gax.grpc.GrpcHeaderInterceptor; -import io.grpc.ClientInterceptor; -import org.junit.Test; - -public class GrpcRoutingHeaderInterceptorProviderTest { - @Test - public void testDefaultGrpcRoutingHeaderInterceptorProvider() { - GrpcRoutingHeaderInterceptorProvider interceptorProvider = - GrpcRoutingHeaderInterceptorProvider.defaultGrpcRoutingHeaderInterceptorProvider(); - assertEquals(1, interceptorProvider.getInterceptors().size()); - ClientInterceptor clientInterceptor = interceptorProvider.getInterceptors().get(0); - assertEquals(GrpcHeaderInterceptor.class.getName(), clientInterceptor.getClass().getName()); - } -}