diff options
Diffstat (limited to 'grpc/spm-cpp-include/grpcpp/xds_server_builder.h')
-rw-r--r-- | grpc/spm-cpp-include/grpcpp/xds_server_builder.h | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/grpc/spm-cpp-include/grpcpp/xds_server_builder.h b/grpc/spm-cpp-include/grpcpp/xds_server_builder.h index 1ed9e83a..076c377f 100644 --- a/grpc/spm-cpp-include/grpcpp/xds_server_builder.h +++ b/grpc/spm-cpp-include/grpcpp/xds_server_builder.h @@ -26,15 +26,52 @@ namespace grpc { namespace experimental { +class XdsServerServingStatusNotifierInterface { + public: + virtual ~XdsServerServingStatusNotifierInterface() = default; + + // \a uri contains the listening target associated with the notification. Note + // that a single target provided to XdsServerBuilder can get resolved to + // multiple listening addresses. + // The callback is invoked each time there is an update to the serving status. + // The API does not provide any guarantees around duplicate updates. + // Status::OK signifies that the server is serving, while a non-OK status + // signifies that the server is not serving. + virtual void OnServingStatusUpdate(std::string uri, grpc::Status status) = 0; +}; + class XdsServerBuilder : public ::grpc::ServerBuilder { public: - std::unique_ptr<Server> BuildAndStart() override { - grpc_server_config_fetcher* fetcher = - grpc_server_config_fetcher_xds_create(); - if (fetcher == nullptr) return nullptr; - set_fetcher(fetcher); - return ServerBuilder::BuildAndStart(); + // It is the responsibility of the application to make sure that \a notifier + // outlasts the life of the server. Notifications will start being made + // asynchronously once `BuildAndStart()` has been called. Note that it is + // possible for notifications to be made before `BuildAndStart()` returns. + void set_status_notifier(XdsServerServingStatusNotifierInterface* notifier) { + notifier_ = notifier; } + + private: + // Called at the beginning of BuildAndStart(). + ChannelArguments BuildChannelArgs() override { + ChannelArguments args = ServerBuilder::BuildChannelArgs(); + grpc_channel_args c_channel_args = args.c_channel_args(); + grpc_server_config_fetcher* fetcher = grpc_server_config_fetcher_xds_create( + {OnServingStatusUpdate, notifier_}, &c_channel_args); + if (fetcher != nullptr) set_fetcher(fetcher); + return args; + } + + static void OnServingStatusUpdate(void* user_data, const char* uri, + grpc_status_code code, + const char* error_message) { + if (user_data == nullptr) return; + XdsServerServingStatusNotifierInterface* notifier = + static_cast<XdsServerServingStatusNotifierInterface*>(user_data); + notifier->OnServingStatusUpdate( + uri, grpc::Status(static_cast<StatusCode>(code), error_message)); + } + + XdsServerServingStatusNotifierInterface* notifier_ = nullptr; }; } // namespace experimental |