From 160ce4875de5557d76e973809eebdef9cc2a5bb6 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Tue, 27 Jan 2026 14:10:50 -0500 Subject: [PATCH 1/2] impl(v3): add generator support for connection cq access --- generator/generator_config.proto | 6 ++++ generator/generator_config.textproto | 1 + generator/internal/connection_generator.cc | 34 ++++++++++++++++++- .../internal/connection_impl_generator.cc | 24 +++++++++++++ generator/internal/service_code_generator.cc | 5 +++ generator/internal/service_code_generator.h | 2 ++ generator/standalone_main.cc | 5 +++ 7 files changed, 76 insertions(+), 1 deletion(-) diff --git a/generator/generator_config.proto b/generator/generator_config.proto index 40e94d9b00290..7743c2e80e90f 100644 --- a/generator/generator_config.proto +++ b/generator/generator_config.proto @@ -167,6 +167,12 @@ message ServiceConfiguration { // RPCs. If set to false (the default), a no-op resumption function will be // generated. bool omit_streaming_updater = 29; + + // In rare cases, specifically bigtable::WaitForConsistency, the + // CompletionQueue from the BackgroundThreads owned by the Connection is + // needed elsewhere. This emits a protected accessor and friend function for + // that purpose. + bool emit_completion_queue_accessor = 30; } message DiscoveryDocumentDefinedProduct { diff --git a/generator/generator_config.textproto b/generator/generator_config.textproto index 2baa260f186e1..380d664e48846 100644 --- a/generator/generator_config.textproto +++ b/generator/generator_config.textproto @@ -588,6 +588,7 @@ service { {rpc_name: "BigtableTableAdmin.CheckConsistency", idempotency: IDEMPOTENT} ] omit_repo_metadata: true + emit_completion_queue_accessor: true } # Billing diff --git a/generator/internal/connection_generator.cc b/generator/internal/connection_generator.cc index 65c34c7f855cf..1130dd396a65e 100644 --- a/generator/internal/connection_generator.cc +++ b/generator/internal/connection_generator.cc @@ -57,6 +57,8 @@ Status ConnectionGenerator::GenerateHeader() { {vars("idempotency_policy_header_path"), vars("retry_traits_header_path"), HasLongrunningMethod() ? "google/cloud/no_await_tag.h" : "", IsExperimental() ? "google/cloud/experimental_tag.h" : "", + HasEmitCompletionQueueAccessor() ? "google/cloud/completion_queue.h" + : "", "google/cloud/backoff_policy.h", HasLongrunningMethod() || HasAsyncMethod() ? "google/cloud/future.h" : "", @@ -91,7 +93,21 @@ Status ConnectionGenerator::GenerateHeader() { } } - auto result = HeaderOpenNamespaces(); + Status result; + if (HasEmitCompletionQueueAccessor()) { + result = HeaderOpenNamespaces(); + if (!result.ok()) return result; + HeaderPrint(R"""(class $connection_class_name$;)"""); + HeaderCloseNamespaces(); + + result = HeaderOpenNamespaces(NamespaceType::kInternal); + if (!result.ok()) return result; + HeaderPrint( + R"""(StatusOr completion_queue($product_namespace$::$connection_class_name$ const& conn);)"""); + HeaderCloseNamespaces(); + } + + result = HeaderOpenNamespaces(); if (!result.ok()) return result; HeaderPrint(R"""( @@ -315,6 +331,13 @@ class $connection_class_name$ { __FILE__, __LINE__); } + if (HasEmitCompletionQueueAccessor()) { + HeaderPrint(R"""( protected: + friend StatusOr $product_internal_namespace$::completion_queue( + $connection_class_name$ const& conn); + virtual StatusOr completion_queue() const; +)"""); + } // close abstract interface Connection base class HeaderPrint("};\n"); @@ -490,6 +513,15 @@ future> __FILE__, __LINE__); } + if (HasEmitCompletionQueueAccessor()) { + CcPrint( + R"""( +StatusOr $connection_class_name$::completion_queue() const { + return Status(StatusCode::kUnimplemented, "not implemented"); +} +)"""); + } + if (HasGenerateGrpcTransport()) { EmitFactoryFunctionDefinition(EndpointLocationStyle()); } diff --git a/generator/internal/connection_impl_generator.cc b/generator/internal/connection_impl_generator.cc index b1cac8680e984..dda37fc86532e 100644 --- a/generator/internal/connection_impl_generator.cc +++ b/generator/internal/connection_impl_generator.cc @@ -133,6 +133,13 @@ class $connection_class_name$Impl std::make_shared();)"""); } + if (HasEmitCompletionQueueAccessor()) { + HeaderPrint( + R"""( + StatusOr completion_queue() const override; +)"""); + } + // This closes the *ConnectionImpl class definition. HeaderPrint("\n};\n"); @@ -208,6 +215,15 @@ std::unique_ptr polling_policy(Options const& options) { } // namespace )"""); + if (HasEmitCompletionQueueAccessor()) { + CcPrint(R"""( +StatusOr completion_queue( + $product_namespace$::$connection_class_name$ const& conn) { + return conn.completion_queue(); +} +)"""); + } + // streaming updater functions if (!OmitStreamingUpdater(vars())) { for (auto const& method : methods()) { @@ -242,6 +258,14 @@ void $service_name$$method_name$StreamingUpdater( CcPrintMethod(method, __FILE__, __LINE__, AsyncMethodDefinition(method)); } + if (HasEmitCompletionQueueAccessor()) { + CcPrint(R"""( +StatusOr $connection_class_name$Impl::completion_queue() const { + return background_->cq(); +} +)"""); + } + CcCloseNamespaces(); return {}; } diff --git a/generator/internal/service_code_generator.cc b/generator/internal/service_code_generator.cc index 8f9f22f226699..87138654c0765 100644 --- a/generator/internal/service_code_generator.cc +++ b/generator/internal/service_code_generator.cc @@ -511,6 +511,11 @@ bool ServiceCodeGenerator::IsDeprecated() const { return service_descriptor_->options().deprecated(); } +bool ServiceCodeGenerator::HasEmitCompletionQueueAccessor() const { + return vars().find("emit_completion_queue_accessor") != vars().end() && + vars().at("emit_completion_queue_accessor") == "true"; +} + } // namespace generator_internal } // namespace cloud } // namespace google diff --git a/generator/internal/service_code_generator.h b/generator/internal/service_code_generator.h index 691140d74b274..e4347db6e0a9e 100644 --- a/generator/internal/service_code_generator.h +++ b/generator/internal/service_code_generator.h @@ -246,6 +246,8 @@ class ServiceCodeGenerator : public GeneratorInterface { */ bool IsDeprecated() const; + bool HasEmitCompletionQueueAccessor() const; + private: void SetMethods(); diff --git a/generator/standalone_main.cc b/generator/standalone_main.cc index af80d03c3f031..44f626ccd85a5 100644 --- a/generator/standalone_main.cc +++ b/generator/standalone_main.cc @@ -296,6 +296,11 @@ std::vector> GenerateCodeFromProtos( if (service.omit_streaming_updater()) { args.emplace_back("--cpp_codegen_opt=omit_streaming_updater=true"); } + if (service.emit_completion_queue_accessor()) { + args.emplace_back( + "--cpp_codegen_opt=emit_completion_queue_accessor=true"); + } + if (service.generate_round_robin_decorator()) { args.emplace_back( "--cpp_codegen_opt=generate_round_robin_decorator=true"); From c98296c84f8ef9d689ef6085cfa2ba5177e00eb0 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Tue, 27 Jan 2026 14:27:01 -0500 Subject: [PATCH 2/2] generate code --- .../admin/bigtable_table_admin_connection.cc | 5 ++++ .../admin/bigtable_table_admin_connection.h | 27 +++++++++++++++++++ .../bigtable_table_admin_connection_impl.cc | 10 +++++++ .../bigtable_table_admin_connection_impl.h | 1 + 4 files changed, 43 insertions(+) diff --git a/google/cloud/bigtable/admin/bigtable_table_admin_connection.cc b/google/cloud/bigtable/admin/bigtable_table_admin_connection.cc index 8f6f803ee33f4..26613c3f155e6 100644 --- a/google/cloud/bigtable/admin/bigtable_table_admin_connection.cc +++ b/google/cloud/bigtable/admin/bigtable_table_admin_connection.cc @@ -382,6 +382,11 @@ BigtableTableAdminConnection::AsyncCheckConsistency( Status(StatusCode::kUnimplemented, "not implemented")); } +StatusOr BigtableTableAdminConnection::completion_queue() + const { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + std::shared_ptr MakeBigtableTableAdminConnection( Options options) { internal::CheckExpectedOptions +namespace google { +namespace cloud { +namespace bigtable_admin { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +class BigtableTableAdminConnection; +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace bigtable_admin +} // namespace cloud +} // namespace google + +namespace google { +namespace cloud { +namespace bigtable_admin_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +StatusOr completion_queue( + bigtable_admin::BigtableTableAdminConnection const& conn); +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace bigtable_admin_internal +} // namespace cloud +} // namespace google + namespace google { namespace cloud { namespace bigtable_admin { @@ -359,6 +381,11 @@ class BigtableTableAdminConnection { StatusOr> AsyncCheckConsistency( google::bigtable::admin::v2::CheckConsistencyRequest const& request); + + protected: + friend StatusOr bigtable_admin_internal::completion_queue( + BigtableTableAdminConnection const& conn); + virtual StatusOr completion_queue() const; }; /** diff --git a/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.cc b/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.cc index 233be86979261..c2cc66d3cff53 100644 --- a/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.cc +++ b/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.cc @@ -60,6 +60,11 @@ std::unique_ptr polling_policy(Options const& options) { } // namespace +StatusOr completion_queue( + bigtable_admin::BigtableTableAdminConnection const& conn) { + return conn.completion_queue(); +} + BigtableTableAdminConnectionImpl::BigtableTableAdminConnectionImpl( std::unique_ptr background, std::shared_ptr stub, @@ -1293,6 +1298,11 @@ BigtableTableAdminConnectionImpl::AsyncCheckConsistency( std::move(current), std::move(request_copy), __func__); } +StatusOr BigtableTableAdminConnectionImpl::completion_queue() + const { + return background_->cq(); +} + GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END } // namespace bigtable_admin_internal } // namespace cloud diff --git a/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.h b/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.h index 5d8c95b19e690..0fa8d168eabb1 100644 --- a/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.h +++ b/google/cloud/bigtable/admin/internal/bigtable_table_admin_connection_impl.h @@ -238,6 +238,7 @@ class BigtableTableAdminConnectionImpl std::unique_ptr background_; std::shared_ptr stub_; Options options_; + StatusOr completion_queue() const override; }; GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END