diff --git a/google/cloud/bigtable/internal/bigtable_stub_factory.cc b/google/cloud/bigtable/internal/bigtable_stub_factory.cc index 9d5add4a61c44..0be9bdfd08f13 100644 --- a/google/cloud/bigtable/internal/bigtable_stub_factory.cc +++ b/google/cloud/bigtable/internal/bigtable_stub_factory.cc @@ -20,12 +20,14 @@ #include "google/cloud/bigtable/internal/bigtable_round_robin_decorator.h" #include "google/cloud/bigtable/internal/bigtable_tracing_stub.h" #include "google/cloud/bigtable/internal/connection_refresh_state.h" +#include "google/cloud/bigtable/internal/defaults.h" #include "google/cloud/bigtable/options.h" #include "google/cloud/common_options.h" #include "google/cloud/grpc_options.h" #include "google/cloud/internal/algorithm.h" #include "google/cloud/internal/api_client_header.h" #include "google/cloud/internal/base64_transforms.h" +#include "google/cloud/internal/getenv.h" #include "google/cloud/internal/opentelemetry.h" #include "google/cloud/internal/unified_grpc_credentials.h" #include "google/cloud/log.h" @@ -47,17 +49,19 @@ std::shared_ptr CreateGrpcChannel( } std::string FeaturesMetadata() { - static auto const* const kFeatures = new auto([] { - google::bigtable::v2::FeatureFlags proto; - proto.set_reverse_scans(true); - proto.set_last_scanned_row_responses(true); - proto.set_mutate_rows_rate_limit(true); - proto.set_mutate_rows_rate_limit2(true); - proto.set_routing_cookie(true); - proto.set_retry_info(true); - return internal::UrlsafeBase64Encode(proto.SerializeAsString()); - }()); - return *kFeatures; + google::bigtable::v2::FeatureFlags proto; + proto.set_reverse_scans(true); + proto.set_last_scanned_row_responses(true); + proto.set_mutate_rows_rate_limit(true); + proto.set_mutate_rows_rate_limit2(true); + proto.set_routing_cookie(true); + proto.set_retry_info(true); + + if (bigtable::internal::EnableDirectAccess()) { + proto.set_traffic_director_enabled(true); + proto.set_direct_access_requested(true); + } + return internal::UrlsafeBase64Encode(proto.SerializeAsString()); } } // namespace diff --git a/google/cloud/bigtable/internal/defaults.cc b/google/cloud/bigtable/internal/defaults.cc index c7c1cd041ea86..163d0d7339a8c 100644 --- a/google/cloud/bigtable/internal/defaults.cc +++ b/google/cloud/bigtable/internal/defaults.cc @@ -144,6 +144,12 @@ Options HandleUniverseDomain(Options opts) { return opts; } +bool EnableDirectAccess() { + absl::optional env_directpath = + google::cloud::internal::GetEnv("CBT_ENABLE_DIRECTPATH"); + return env_directpath.has_value() && env_directpath.value() == "true"; +} + Options DefaultOptions(Options opts) { using ::google::cloud::internal::GetEnv; auto ud = GetEnv("GOOGLE_CLOUD_UNIVERSE_DOMAIN"); @@ -164,18 +170,13 @@ Options DefaultOptions(Options opts) { } } - auto const direct_path = - GetEnv("GOOGLE_CLOUD_ENABLE_DIRECT_PATH").value_or(""); - if (absl::c_any_of(absl::StrSplit(direct_path, ','), - [](absl::string_view v) { return v == "bigtable"; })) { - opts.set( - "google-c2p:///directpath-bigtable.googleapis.com") - .set("directpath-bigtable.googleapis.com"); - - // When using DirectPath the gRPC library already does load balancing across - // multiple sockets, it makes little sense to perform additional load - // balancing in the client library. - if (!opts.has()) opts.set(1); + if (EnableDirectAccess()) { + std::string endpoint = opts.get(); + if (endpoint.empty()) { + endpoint = "bigtable.googleapis.com"; + } + opts.set("c2p:///" + endpoint) + .set(endpoint); } auto emulator = GetEnv("BIGTABLE_EMULATOR_HOST"); diff --git a/google/cloud/bigtable/internal/defaults.h b/google/cloud/bigtable/internal/defaults.h index 8b6a05719b40c..9c5e9102da24f 100644 --- a/google/cloud/bigtable/internal/defaults.h +++ b/google/cloud/bigtable/internal/defaults.h @@ -26,6 +26,8 @@ namespace internal { int DefaultConnectionPoolSize(); +bool EnableDirectAccess(); + /** * Returns an `Options` with the appropriate defaults for Bigtable. * diff --git a/google/cloud/bigtable/internal/defaults_test.cc b/google/cloud/bigtable/internal/defaults_test.cc index 19f666a323504..1978c84283e4e 100644 --- a/google/cloud/bigtable/internal/defaults_test.cc +++ b/google/cloud/bigtable/internal/defaults_test.cc @@ -426,24 +426,20 @@ TEST(EndpointEnvTest, UserCredentialsOverrideEmulatorEnv) { TEST(EndpointEnvTest, DirectPathEnabled) { ScopedEnvironment emulator("BIGTABLE_EMULATOR_HOST", absl::nullopt); - ScopedEnvironment direct_path("GOOGLE_CLOUD_ENABLE_DIRECT_PATH", - "storage,bigtable"); + ScopedEnvironment direct_path("CBT_ENABLE_DIRECTPATH", "true"); auto opts = DefaultOptions(); - EXPECT_EQ("google-c2p:///directpath-bigtable.googleapis.com", - opts.get()); - EXPECT_EQ("directpath-bigtable.googleapis.com", opts.get()); + EXPECT_EQ("c2p:///bigtable.googleapis.com", opts.get()); + EXPECT_EQ("bigtable.googleapis.com", opts.get()); // Admin endpoints are not affected. EXPECT_EQ("bigtableadmin.googleapis.com", opts.get()); EXPECT_EQ("bigtableadmin.googleapis.com", opts.get()); - EXPECT_EQ(1, opts.get()); } -TEST(EndpointEnvTest, DirectPathNoMatch) { +TEST(EndpointEnvTest, DirectPathNotEnabled) { ScopedEnvironment emulator("BIGTABLE_EMULATOR_HOST", absl::nullopt); - ScopedEnvironment direct_path("GOOGLE_CLOUD_ENABLE_DIRECT_PATH", - "bigtable-not,almost-bigtable"); + ScopedEnvironment direct_path("CBT_ENABLE_DIRECTPATH", "false"); auto opts = DefaultDataOptions(Options{}); EXPECT_EQ("bigtable.googleapis.com", opts.get()); @@ -452,18 +448,17 @@ TEST(EndpointEnvTest, DirectPathNoMatch) { TEST(EndpointEnvTest, DirectPathOverridesUserEndpoints) { ScopedEnvironment emulator("BIGTABLE_EMULATOR_HOST", absl::nullopt); - ScopedEnvironment direct_path("GOOGLE_CLOUD_ENABLE_DIRECT_PATH", "bigtable"); + ScopedEnvironment direct_path("CBT_ENABLE_DIRECTPATH", "true"); auto opts = DefaultDataOptions( - Options{}.set("ignored").set("ignored")); - EXPECT_EQ("google-c2p:///directpath-bigtable.googleapis.com", - opts.get()); - EXPECT_EQ("directpath-bigtable.googleapis.com", opts.get()); + Options{}.set("userendpoint").set("userendpoint")); + EXPECT_EQ("c2p:///userendpoint", opts.get()); + EXPECT_EQ("userendpoint", opts.get()); } TEST(EndpointEnvTest, EmulatorOverridesDirectPath) { ScopedEnvironment emulator("BIGTABLE_EMULATOR_HOST", "emulator-host:8000"); - ScopedEnvironment direct_path("GOOGLE_CLOUD_ENABLE_DIRECT_PATH", "bigtable"); + ScopedEnvironment direct_path("CBT_ENABLE_DIRECTPATH", "true"); auto opts = DefaultDataOptions(Options{}); EXPECT_EQ("emulator-host:8000", opts.get());