From f369df84117aa9e44fd1fdb461980fc1f447aa8c Mon Sep 17 00:00:00 2001 From: Igor Berntein Date: Thu, 12 Jan 2023 12:22:36 -0500 Subject: [PATCH] fix: defer instance admin api errors to RPC time rather then client construction time Will fix https://github.com/googleapis/java-bigtable-hbase/issues/3518 Change-Id: If5201705a8fd4b8757fac0206b6e563c8cd0ae65 --- .../v2/BigtableInstanceAdminSettings.java | 52 +++++++++++++++++-- .../admin/v2/BigtableTableAdminSettings.java | 12 ++--- .../data/v2/BigtableDataSettings.java | 12 ++--- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java index f89142828d..42b0ea9b5d 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java @@ -18,11 +18,17 @@ import static com.google.cloud.bigtable.admin.v2.BigtableTableAdminSettings.BIGTABLE_EMULATOR_HOST_ENV_VAR; import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.ChannelPoolSettings; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.cloud.bigtable.admin.v2.stub.BigtableInstanceAdminStubSettings; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import com.google.common.base.Verify; +import io.grpc.ManagedChannelBuilder; import java.io.IOException; +import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -47,6 +53,9 @@ * } */ public final class BigtableInstanceAdminSettings { + private static final Logger LOGGER = + Logger.getLogger(BigtableInstanceAdminSettings.class.getName()); + private final String projectId; private final BigtableInstanceAdminStubSettings stubSettings; @@ -115,12 +124,49 @@ public Builder toBuilder() { /** Returns a new builder for this class. */ public static Builder newBuilder() { - Preconditions.checkState( - System.getenv(BIGTABLE_EMULATOR_HOST_ENV_VAR) == null, - "BigtableInstanceAdminSettings doesn't supported on Emulator"); + String hostAndPort = System.getenv(BIGTABLE_EMULATOR_HOST_ENV_VAR); + if (!Strings.isNullOrEmpty(hostAndPort)) { + int port; + try { + port = Integer.parseInt(hostAndPort.substring(hostAndPort.lastIndexOf(":") + 1)); + return newBuilderForEmulator(hostAndPort.substring(0, hostAndPort.lastIndexOf(":")), port); + } catch (NumberFormatException | IndexOutOfBoundsException ex) { + throw new RuntimeException( + "Invalid host/port in " + + BIGTABLE_EMULATOR_HOST_ENV_VAR + + " environment variable: " + + hostAndPort); + } + } return new Builder(); } + /** Create a new builder preconfigured to connect to the Bigtable emulator with port number. */ + public static Builder newBuilderForEmulator(int port) { + return newBuilderForEmulator("localhost", port); + } + + /** + * Creates a new builder preconfigured to connect to the Bigtable emulator with host name and port + * number. + */ + public static Builder newBuilderForEmulator(String hostname, int port) { + Builder builder = new Builder(); + + builder + .stubSettings() + .setCredentialsProvider(NoCredentialsProvider.create()) + .setEndpoint(hostname + ":" + port) + .setTransportChannelProvider( + InstantiatingGrpcChannelProvider.newBuilder() + .setChannelPoolSettings(ChannelPoolSettings.staticallySized(1)) + .setChannelConfigurator(ManagedChannelBuilder::usePlaintext) + .build()); + + LOGGER.info("Connecting to the Bigtable emulator at " + hostname + ":" + port); + return builder; + } + /** Builder for BigtableInstanceAdminSettings. */ public static final class Builder { @Nullable private String projectId; diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java index ce05f0a2d8..4d3a71155a 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java @@ -15,9 +15,9 @@ */ package com.google.cloud.bigtable.admin.v2; -import com.google.api.core.ApiFunction; import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.ChannelPoolSettings; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.cloud.bigtable.admin.v2.stub.BigtableTableAdminStubSettings; import com.google.common.base.MoreObjects; @@ -174,14 +174,8 @@ public static Builder newBuilderForEmulator(String hostname, int port) { .setEndpoint(hostname + ":" + port) .setTransportChannelProvider( InstantiatingGrpcChannelProvider.newBuilder() - .setPoolSize(1) - .setChannelConfigurator( - new ApiFunction() { - @Override - public ManagedChannelBuilder apply(ManagedChannelBuilder input) { - return input.usePlaintext(); - } - }) + .setChannelPoolSettings(ChannelPoolSettings.staticallySized(1)) + .setChannelConfigurator(ManagedChannelBuilder::usePlaintext) .build()); LOGGER.info("Connecting to the Bigtable emulator at " + hostname + ":" + port); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java index 28265b282d..8579c0e4cd 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java @@ -15,12 +15,12 @@ */ package com.google.cloud.bigtable.data.v2; -import com.google.api.core.ApiFunction; import com.google.api.core.BetaApi; import com.google.api.gax.batching.Batcher; import com.google.api.gax.batching.FlowController; import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.ChannelPoolSettings; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.auth.Credentials; @@ -129,14 +129,8 @@ public static Builder newBuilderForEmulator(String hostname, int port) { .setTransportChannelProvider( InstantiatingGrpcChannelProvider.newBuilder() .setMaxInboundMessageSize(256 * 1024 * 1024) - .setPoolSize(1) - .setChannelConfigurator( - new ApiFunction() { - @Override - public ManagedChannelBuilder apply(ManagedChannelBuilder input) { - return input.usePlaintext(); - } - }) + .setChannelPoolSettings(ChannelPoolSettings.staticallySized(1)) + .setChannelConfigurator(ManagedChannelBuilder::usePlaintext) .setKeepAliveTime(Duration.ofSeconds(61)) // sends ping in this interval .setKeepAliveTimeout( Duration.ofSeconds(10)) // wait this long before considering the connection dead