Skip to content

Commit 3df984d

Browse files
authored
feat(spanner): introduce the RouteToLeaderOption (#10885)
This will be used in upcoming code that will add a routing header to RPCs that should be served in the leader region. The boolean option defaults to on (unset), but the default can be changed with a suitably-negative value in `${GOOGLE_CLOUD_CPP_SPANNER_ROUTE_TO_LEADER}`.
1 parent a6a362d commit 3df984d

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

google/cloud/spanner/internal/defaults.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,19 @@ Options DefaultOptions(Options opts) {
104104
min_sessions =
105105
(std::min)(min_sessions, max_sessions_per_channel * num_channels);
106106

107+
if (!opts.has<spanner::RouteToLeaderOption>()) {
108+
if (auto e = internal::GetEnv("GOOGLE_CLOUD_CPP_SPANNER_ROUTE_TO_LEADER")) {
109+
for (auto const* disable : {"N", "n", "F", "f", "0", "off"}) {
110+
if (*e == disable) {
111+
// Change the default from "for RW/PartitionedDml transactions"
112+
// to "never".
113+
opts.set<spanner::RouteToLeaderOption>(false);
114+
break;
115+
}
116+
}
117+
}
118+
}
119+
107120
return opts;
108121
}
109122

google/cloud/spanner/internal/defaults_test.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ TEST(Options, Defaults) {
5555
absl::nullopt);
5656
testing_util::ScopedEnvironment user_project_env(
5757
"GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt);
58+
testing_util::ScopedEnvironment route_to_leader_env(
59+
"GOOGLE_CLOUD_CPP_SPANNER_ROUTE_TO_LEADER", absl::nullopt);
5860
auto opts = spanner_internal::DefaultOptions();
5961

6062
EXPECT_EQ(opts.get<EndpointOption>(), "spanner.googleapis.com");
@@ -82,6 +84,8 @@ TEST(Options, Defaults) {
8284
EXPECT_TRUE(opts.has<SpannerRetryPolicyOption>());
8385
EXPECT_TRUE(opts.has<SpannerBackoffPolicyOption>());
8486
EXPECT_TRUE(opts.has<spanner_internal::SessionPoolClockOption>());
87+
88+
EXPECT_FALSE(opts.has<spanner::RouteToLeaderOption>());
8589
}
8690

8791
TEST(Options, AdminDefaults) {
@@ -150,6 +154,14 @@ TEST(Options, SpannerEmulatorHost) {
150154
EXPECT_NE(opts.get<GrpcCredentialOption>(), nullptr);
151155
}
152156

157+
TEST(Options, RouteToLeaderFromEnv) {
158+
testing_util::ScopedEnvironment route_to_leader_env(
159+
"GOOGLE_CLOUD_CPP_SPANNER_ROUTE_TO_LEADER", "off");
160+
auto opts = spanner_internal::DefaultOptions();
161+
EXPECT_TRUE(opts.has<spanner::RouteToLeaderOption>());
162+
EXPECT_FALSE(opts.get<spanner::RouteToLeaderOption>());
163+
}
164+
153165
TEST(Options, TracingComponentsFromEnv) {
154166
testing_util::ScopedEnvironment tracing_components_env(
155167
"GOOGLE_CLOUD_CPP_ENABLE_TRACING", "c1,c2,c3");

google/cloud/spanner/options.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ using SessionPoolOptionList =
188188
SessionPoolActionOnExhaustionOption,
189189
SessionPoolKeepAliveIntervalOption, SessionPoolLabelsOption>;
190190

191+
/**
192+
* Option for `google::cloud::Options` to, when present and false, suppress
193+
* adding headers to distinguish requests served by the leader v/s non-leader
194+
* region.
195+
*
196+
* @ingroup spanner-options
197+
*/
198+
struct RouteToLeaderOption {
199+
using Type = bool;
200+
};
201+
191202
/**
192203
* Option for `google::cloud::Options` to set the optimizer version used in an
193204
* SQL query.

0 commit comments

Comments
 (0)