Skip to content

Commit 850fd1f

Browse files
authored
impl(bigtable): add StubManager class (#16022)
1 parent c03a750 commit 850fd1f

File tree

8 files changed

+437
-18
lines changed

8 files changed

+437
-18
lines changed

ci/cloudbuild/dockerfiles/demo-opensuse-leap.Dockerfile

Lines changed: 94 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,15 @@ ARG NCPU=4
2727
# ```bash
2828
RUN zypper refresh && \
2929
zypper install --allow-downgrade -y automake cmake curl \
30-
gcc8 gcc8-c++ git gzip libtool make patch tar wget
30+
gcc9 gcc9-c++ git gzip libtool make patch tar wget
3131
# ```
3232

3333
# Install some of the dependencies for `google-cloud-cpp`.
3434

3535
# ```bash
3636
RUN zypper refresh && \
37-
zypper install --allow-downgrade -y abseil-cpp-devel c-ares-devel \
38-
libcurl-devel libopenssl-devel nlohmann_json-devel \
39-
grpc-devel libprotobuf-devel
37+
zypper install --allow-downgrade -y \
38+
libcurl-devel libopenssl-devel nlohmann_json-devel
4039
# ```
4140

4241
# The following steps will install libraries and tools in `/usr/local`. openSUSE
@@ -52,19 +51,52 @@ ENV PATH=/usr/local/bin:${PATH}
5251

5352
# Use the following environment variables to configure the compiler used by
5453
# CMake.
55-
ENV CC=gcc-8
56-
ENV CXX=g++-8
54+
ENV CC=gcc-9
55+
ENV CXX=g++-9
5756

58-
# #### opentelemetry-cpp
57+
# #### Abseil
58+
59+
# ```bash
60+
WORKDIR /var/tmp/build/abseil-cpp
61+
RUN curl -fsSL https://github.com/abseil/abseil-cpp/archive/20250814.2.tar.gz | \
62+
tar -xzf - --strip-components=1 && \
63+
cmake \
64+
-DCMAKE_BUILD_TYPE=Debug \
65+
-DCMAKE_CXX_STANDARD=17 \
66+
-DABSL_BUILD_TESTING=OFF \
67+
-DBUILD_SHARED_LIBS=yes \
68+
-S . -B cmake-out && \
69+
cmake --build cmake-out -- -j ${NCPU:-4} && \
70+
cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
71+
ldconfig
72+
# ```
73+
74+
# #### Protobuf
75+
76+
# ```bash
77+
WORKDIR /var/tmp/build/protobuf
78+
RUN curl -fsSL https://github.com/protocolbuffers/protobuf/archive/v33.1.tar.gz | \
79+
tar -xzf - --strip-components=1 && \
80+
cmake \
81+
-DCMAKE_BUILD_TYPE=Debug \
82+
-DCMAKE_CXX_STANDARD=17 \
83+
-DBUILD_SHARED_LIBS=yes \
84+
-Dprotobuf_BUILD_TESTS=OFF \
85+
-Dprotobuf_ABSL_PROVIDER=package \
86+
-S . -B cmake-out && \
87+
cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
88+
ldconfig && \
89+
ln -s /usr/local/bin/protoc /usr/bin/protoc
90+
# ```
5991

60-
# The project has a dependency on the OpenTelemetry library.
92+
# #### opentelemetry-cpp
6193

6294
# ```bash
6395
WORKDIR /var/tmp/build/opentelemetry-cpp
6496
RUN curl -fsSL https://github.com/open-telemetry/opentelemetry-cpp/archive/v1.24.0.tar.gz | \
6597
tar -xzf - --strip-components=1 && \
6698
cmake \
67-
-DCMAKE_BUILD_TYPE=Release \
99+
-DCMAKE_BUILD_TYPE=Debug \
68100
-DCMAKE_CXX_STANDARD=17 \
69101
-DBUILD_SHARED_LIBS=yes \
70102
-DWITH_EXAMPLES=OFF \
@@ -77,6 +109,58 @@ RUN curl -fsSL https://github.com/open-telemetry/opentelemetry-cpp/archive/v1.24
77109
ldconfig
78110
# ```
79111

112+
# #### c-ares
113+
114+
# ```bash
115+
WORKDIR /var/tmp/build/c-ares
116+
RUN curl -fsSL https://github.com/c-ares/c-ares/archive/refs/tags/cares-1_17_1.tar.gz | \
117+
tar -xzf - --strip-components=1 && \
118+
cmake \
119+
-DCMAKE_BUILD_TYPE=Debug \
120+
-DBUILD_SHARED_LIBS=yes \
121+
-S . -B cmake-out && \
122+
cmake --build cmake-out --target install && \
123+
ldconfig
124+
# ```
125+
126+
# #### RE2
127+
128+
# ```bash
129+
WORKDIR /var/tmp/build/re2
130+
RUN curl -fsSL https://github.com/google/re2/archive/2025-07-22.tar.gz | \
131+
tar -xzf - --strip-components=1 && \
132+
cmake -DCMAKE_BUILD_TYPE=Debug \
133+
-DBUILD_SHARED_LIBS=ON \
134+
-DRE2_BUILD_TESTING=OFF \
135+
-S . -B cmake-out && \
136+
cmake --build cmake-out --target install && \
137+
ldconfig
138+
# ```
139+
140+
# #### gRPC
141+
142+
# ```bash
143+
WORKDIR /var/tmp/build/grpc
144+
RUN curl -fsSL https://github.com/grpc/grpc/archive/v1.71.1.tar.gz | \
145+
tar -xzf - --strip-components=1 && \
146+
cmake \
147+
-DCMAKE_BUILD_TYPE=Debug \
148+
-DCMAKE_CXX_STANDARD=17 \
149+
-DBUILD_SHARED_LIBS=yes \
150+
-DgRPC_INSTALL=ON \
151+
-DgRPC_BUILD_TESTS=OFF \
152+
-DgRPC_ABSL_PROVIDER=package \
153+
-DgRPC_CARES_PROVIDER=package \
154+
-DgRPC_PROTOBUF_PROVIDER=package \
155+
-DgRPC_RE2_PROVIDER=package \
156+
-DgRPC_SSL_PROVIDER=package \
157+
-DgRPC_ZLIB_PROVIDER=package \
158+
-DgRPC_OPENTELEMETRY_PROVIDER=package \
159+
-S . -B cmake-out && \
160+
cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
161+
ldconfig
162+
# ```
163+
80164
## [DONE packaging.md]
81165

82166
RUN zypper refresh && \
@@ -91,5 +175,5 @@ RUN curl -fsSL https://github.com/mozilla/sccache/releases/download/v0.10.0/scca
91175

92176
# Update the ld.conf cache in case any libraries were installed in /usr/local/lib*
93177
RUN ldconfig /usr/local/lib*
94-
95178
ENV DEMO_CORD_WORKAROUND=OFF
179+
RUN echo 'root:cloudcxx' | chpasswd

doc/packaging.md

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -332,16 +332,15 @@ use GCC 8 or higher to compile `google-cloud-cpp`.
332332
```bash
333333
sudo zypper refresh && \
334334
sudo zypper install --allow-downgrade -y automake cmake curl \
335-
gcc8 gcc8-c++ git gzip libtool make patch tar wget
335+
gcc9 gcc9-c++ git gzip libtool make patch tar wget
336336
```
337337

338338
Install some of the dependencies for `google-cloud-cpp`.
339339

340340
```bash
341341
sudo zypper refresh && \
342-
sudo zypper install --allow-downgrade -y abseil-cpp-devel c-ares-devel \
343-
libcurl-devel libopenssl-devel nlohmann_json-devel \
344-
grpc-devel libprotobuf-devel
342+
sudo zypper install --allow-downgrade -y \
343+
libcurl-devel libopenssl-devel nlohmann_json-devel
345344
```
346345

347346
The following steps will install libraries and tools in `/usr/local`. openSUSE
@@ -356,18 +355,51 @@ export PATH=/usr/local/bin:${PATH}
356355
```
357356

358357
Use the following environment variables to configure the compiler used by CMake.
359-
export CC=gcc-8 export CXX=g++-8
358+
export CC=gcc-9 export CXX=g++-9
360359

361-
#### opentelemetry-cpp
360+
#### Abseil
362361

363-
The project has a dependency on the OpenTelemetry library.
362+
```bash
363+
mkdir -p $HOME/Downloads/abseil-cpp && cd $HOME/Downloads/abseil-cpp
364+
curl -fsSL https://github.com/abseil/abseil-cpp/archive/20250814.2.tar.gz | \
365+
tar -xzf - --strip-components=1 && \
366+
cmake \
367+
-DCMAKE_BUILD_TYPE=Debug \
368+
-DCMAKE_CXX_STANDARD=17 \
369+
-DABSL_BUILD_TESTING=OFF \
370+
-DBUILD_SHARED_LIBS=yes \
371+
-S . -B cmake-out && \
372+
cmake --build cmake-out -- -j ${NCPU:-4} && \
373+
sudo cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
374+
sudo ldconfig
375+
```
376+
377+
#### Protobuf
378+
379+
```bash
380+
mkdir -p $HOME/Downloads/protobuf && cd $HOME/Downloads/protobuf
381+
curl -fsSL https://github.com/protocolbuffers/protobuf/archive/v33.1.tar.gz | \
382+
tar -xzf - --strip-components=1 && \
383+
cmake \
384+
-DCMAKE_BUILD_TYPE=Debug \
385+
-DCMAKE_CXX_STANDARD=17 \
386+
-DBUILD_SHARED_LIBS=yes \
387+
-Dprotobuf_BUILD_TESTS=OFF \
388+
-Dprotobuf_ABSL_PROVIDER=package \
389+
-S . -B cmake-out && \
390+
sudo cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
391+
sudo ldconfig && \
392+
ln -s /usr/local/bin/protoc /usr/bin/protoc
393+
```
394+
395+
#### opentelemetry-cpp
364396

365397
```bash
366398
mkdir -p $HOME/Downloads/opentelemetry-cpp && cd $HOME/Downloads/opentelemetry-cpp
367399
curl -fsSL https://github.com/open-telemetry/opentelemetry-cpp/archive/v1.24.0.tar.gz | \
368400
tar -xzf - --strip-components=1 && \
369401
cmake \
370-
-DCMAKE_BUILD_TYPE=Release \
402+
-DCMAKE_BUILD_TYPE=Debug \
371403
-DCMAKE_CXX_STANDARD=17 \
372404
-DBUILD_SHARED_LIBS=yes \
373405
-DWITH_EXAMPLES=OFF \
@@ -380,6 +412,58 @@ sudo cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
380412
sudo ldconfig
381413
```
382414

415+
#### c-ares
416+
417+
```bash
418+
mkdir -p $HOME/Downloads/c-ares && cd $HOME/Downloads/c-ares
419+
curl -fsSL https://github.com/c-ares/c-ares/archive/refs/tags/cares-1_17_1.tar.gz | \
420+
tar -xzf - --strip-components=1 && \
421+
cmake \
422+
-DCMAKE_BUILD_TYPE=Debug \
423+
-DBUILD_SHARED_LIBS=yes \
424+
-S . -B cmake-out && \
425+
sudo cmake --build cmake-out --target install && \
426+
sudo ldconfig
427+
```
428+
429+
#### RE2
430+
431+
```bash
432+
mkdir -p $HOME/Downloads/re2 && cd $HOME/Downloads/re2
433+
curl -fsSL https://github.com/google/re2/archive/2025-07-22.tar.gz | \
434+
tar -xzf - --strip-components=1 && \
435+
cmake -DCMAKE_BUILD_TYPE=Debug \
436+
-DBUILD_SHARED_LIBS=ON \
437+
-DRE2_BUILD_TESTING=OFF \
438+
-S . -B cmake-out && \
439+
sudo cmake --build cmake-out --target install && \
440+
sudo ldconfig
441+
```
442+
443+
#### gRPC
444+
445+
```bash
446+
mkdir -p $HOME/Downloads/grpc && cd $HOME/Downloads/grpc
447+
curl -fsSL https://github.com/grpc/grpc/archive/v1.71.1.tar.gz | \
448+
tar -xzf - --strip-components=1 && \
449+
cmake \
450+
-DCMAKE_BUILD_TYPE=Debug \
451+
-DCMAKE_CXX_STANDARD=17 \
452+
-DBUILD_SHARED_LIBS=yes \
453+
-DgRPC_INSTALL=ON \
454+
-DgRPC_BUILD_TESTS=OFF \
455+
-DgRPC_ABSL_PROVIDER=package \
456+
-DgRPC_CARES_PROVIDER=package \
457+
-DgRPC_PROTOBUF_PROVIDER=package \
458+
-DgRPC_RE2_PROVIDER=package \
459+
-DgRPC_SSL_PROVIDER=package \
460+
-DgRPC_ZLIB_PROVIDER=package \
461+
-DgRPC_OPENTELEMETRY_PROVIDER=package \
462+
-S . -B cmake-out && \
463+
sudo cmake --build cmake-out --target install -- -j ${NCPU:-4} && \
464+
sudo ldconfig
465+
```
466+
383467
#### Compile and install the main project
384468

385469
We can now compile and install `google-cloud-cpp`:

google/cloud/bigtable/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ add_library(
214214
internal/row_reader_impl.h
215215
internal/rpc_policy_parameters.h
216216
internal/rpc_policy_parameters.inc
217+
internal/stub_manager.cc
218+
internal/stub_manager.h
217219
internal/traced_row_reader.cc
218220
internal/traced_row_reader.h
219221
internal/tuple_utils.h
@@ -461,6 +463,7 @@ if (BUILD_TESTING)
461463
internal/query_plan_test.cc
462464
internal/rate_limiter_test.cc
463465
internal/retry_traits_test.cc
466+
internal/stub_manager_test.cc
464467
internal/traced_row_reader_test.cc
465468
internal/tuple_utils_test.cc
466469
mocks/mock_row_reader_test.cc

google/cloud/bigtable/bigtable_client_unit_tests.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ bigtable_client_unit_tests = [
6363
"internal/query_plan_test.cc",
6464
"internal/rate_limiter_test.cc",
6565
"internal/retry_traits_test.cc",
66+
"internal/stub_manager_test.cc",
6667
"internal/traced_row_reader_test.cc",
6768
"internal/tuple_utils_test.cc",
6869
"mocks/mock_row_reader_test.cc",

google/cloud/bigtable/google_cloud_cpp_bigtable.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ google_cloud_cpp_bigtable_hdrs = [
107107
"internal/row_reader_impl.h",
108108
"internal/rpc_policy_parameters.h",
109109
"internal/rpc_policy_parameters.inc",
110+
"internal/stub_manager.h",
110111
"internal/traced_row_reader.h",
111112
"internal/tuple_utils.h",
112113
"internal/unary_client_utils.h",
@@ -213,6 +214,7 @@ google_cloud_cpp_bigtable_srcs = [
213214
"internal/rate_limiter.cc",
214215
"internal/readrowsparser.cc",
215216
"internal/retry_traits.cc",
217+
"internal/stub_manager.cc",
216218
"internal/traced_row_reader.cc",
217219
"mutation_batcher.cc",
218220
"mutations.cc",
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright 2026 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// https://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include "google/cloud/bigtable/internal/stub_manager.h"
16+
#include <utility>
17+
18+
namespace google {
19+
namespace cloud {
20+
namespace bigtable_internal {
21+
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
22+
23+
StubManager::StubManager(std::shared_ptr<BigtableStub> stub)
24+
: stub_(std::move(stub)) {}
25+
26+
StubManager::StubManager(
27+
absl::flat_hash_map<std::string, std::shared_ptr<BigtableStub>>
28+
affinity_stubs,
29+
StubCreationFn stub_creation_fn)
30+
: stub_creation_fn_(std::move(stub_creation_fn)),
31+
affinity_stubs_(std::move(affinity_stubs)) {}
32+
33+
std::shared_ptr<BigtableStub> StubManager::GetStub(
34+
std::string_view instance_name) {
35+
if (stub_) return stub_;
36+
37+
std::scoped_lock lk(mu_);
38+
if (auto iter = affinity_stubs_.find(instance_name);
39+
iter != affinity_stubs_.end()) {
40+
return iter->second;
41+
}
42+
auto inserted = affinity_stubs_.emplace(
43+
std::string{instance_name},
44+
stub_creation_fn_(instance_name, Priming::kNoPriming));
45+
return inserted.first->second;
46+
}
47+
48+
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
49+
} // namespace bigtable_internal
50+
} // namespace cloud
51+
} // namespace google

0 commit comments

Comments
 (0)