aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/cpp/server
diff options
context:
space:
mode:
authorGravatar yang-g <yangg@google.com>2016-12-06 14:20:17 -0800
committerGravatar yang-g <yangg@google.com>2016-12-27 15:37:59 -0800
commitc9d2954e556db3f102a858d97e339edb9db0388c (patch)
tree372b546eca8e0bceccd661f3024969b2d0a11c81 /src/cpp/server
parent08137362d0c27d9908d91333c2825f09b30bad2b (diff)
more
Diffstat (limited to 'src/cpp/server')
-rw-r--r--src/cpp/server/default_health_check_service.cc23
-rw-r--r--src/cpp/server/default_health_check_service.h22
-rw-r--r--src/cpp/server/health_check_service_server_builder_option.cc50
-rw-r--r--src/cpp/server/server_cc.cc29
4 files changed, 103 insertions, 21 deletions
diff --git a/src/cpp/server/default_health_check_service.cc b/src/cpp/server/default_health_check_service.cc
index eec7e2cd58..45f51a97b6 100644
--- a/src/cpp/server/default_health_check_service.cc
+++ b/src/cpp/server/default_health_check_service.cc
@@ -34,6 +34,29 @@
#include "src/cpp/server/default_health_check_service.h"
namespace grpc {
+namespace {
+
+const char kHealthCheckMethodName[] = "/grpc.health.v1.Health/Check";
+
+} // namespace
+
+SyncHealthCheckServiceImpl::SyncHealthCheckServiceImpl(
+ DefaultHealthCheckService* service)
+ : service_(service) {
+ auto* handler =
+ new RpcMethodHandler<SyncHealthCheckServiceImpl, ByteBuffer, ByteBuffer>(
+ std::mem_fn(&SyncHealthCheckServiceImpl::Check), this);
+ auto* method = new RpcServiceMethod(kHealthCheckMethodName,
+ RpcMethod::NORMAL_RPC, handler);
+ AddMethod(mehtod);
+}
+
+Status SyncHealthCheckServiceImpl::Check(ServerContext* context,
+ const ByteBuffer* request,
+ ByteBuffer* response) {
+ // TODO nanopb
+ return Status::OK;
+}
DefaultHealthCheckService::DefaultHealthCheckService() {
services_map_.insert("", true);
diff --git a/src/cpp/server/default_health_check_service.h b/src/cpp/server/default_health_check_service.h
index 51afa6491e..a2545c50e7 100644
--- a/src/cpp/server/default_health_check_service.h
+++ b/src/cpp/server/default_health_check_service.h
@@ -37,21 +37,37 @@
#include <mutex>
#include <grpc++/health_check_service_interface.h>
+#include <grpc++/impl/codegen/service_types.h>
namespace grpc {
+class SyncHealthCheckServiceImpl : public Service {
+ public:
+ explicit SyncHealthCheckServiceImpl(DefaultHealthCheckService* service);
+ Status Check(ServerContext* context, const ByteBuffer* request,
+ ByteBuffer* response);
+
+ private:
+ const DefaultHealthCheckService* service_;
+};
+
+// Default implementation of HealthCheckServiceInterface. Server will create and
+// own it.
class DefaultHealthCheckService : public HealthCheckServiceInterface {
public:
DefaultHealthCheckService();
- void SetServingStatus(const grpc::string& service_name,
- bool serving) override;
- void SetServingStatus(bool serving) override;
+ void SetServingStatus(const grpc::string& service_name, bool serving) final;
+ void SetServingStatus(bool serving) final;
enum ServingStatus { NOT_FOUND, SERVING, NOT_SERVING };
ServingStatus GetServingStatus(const grpc::string& service_name) const;
+ SyncHealthCheckServiceImpl* GetSyncHealthCheckService() const {
+ return sync_service_.get();
+ }
private:
std::mutex mu_;
std::map<grpc::string, bool> services_map_;
+ std::unique_ptr<SyncHealthCheckServiceImpl> sync_service_;
};
} // namespace grpc
diff --git a/src/cpp/server/health_check_service_server_builder_option.cc b/src/cpp/server/health_check_service_server_builder_option.cc
new file mode 100644
index 0000000000..80004b77fa
--- /dev/null
+++ b/src/cpp/server/health_check_service_server_builder_option.cc
@@ -0,0 +1,50 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc++/ext/health_check_service_server_builder_option.h>
+
+namespace grpc {
+
+HealthCheckServiceServerBuilderOption::HealthCheckServiceServerBuilderOption(
+ std::unique_ptr<HealthCheckServiceInterface> hc)
+ : hc_(std::move(hc)) {}
+// Hand over hc_ to the server.
+void HealthCheckServiceServerBuilderOption::UpdateArguments(
+ ChannelArguments* args) override {
+ args->SetPointer(kDefaultHealthCheckServiceInterfaceArg, hc_.release());
+}
+
+void HealthCheckServiceServerBuilderOption::UpdatePlugins(
+ std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override {}
+
+} // namespace grpc
diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc
index 5d4da92f2b..03210883bf 100644
--- a/src/cpp/server/server_cc.cc
+++ b/src/cpp/server/server_cc.cc
@@ -370,8 +370,7 @@ Server::Server(
shutdown_notified_(false),
has_generic_service_(false),
server_(nullptr),
- server_initializer_(new ServerInitializer(this)),
- health_check_service_disabled_(false) {
+ server_initializer_(new ServerInitializer(this)) {
g_gli_initializer.summon();
gpr_once_init(&g_once_init_callbacks, InitGlobalCallbacks);
global_callbacks_ = g_callbacks;
@@ -387,6 +386,7 @@ Server::Server(
grpc_channel_args channel_args;
args->SetChannelArgs(&channel_args);
+ bool health_check_service_disabled = false;
for (size_t i = 0; i < channel_args.num_args; i++) {
if (0 == strcmp(channel_args.args[i].key,
kDefaultHealthCheckServiceInterfaceArg)) {
@@ -398,6 +398,15 @@ Server::Server(
break;
}
}
+ // Only create default health check service when user did not provide an
+ // explicit one.
+ if (health_check_service_ == nullptr && !health_check_service_disabled &&
+ EnableDefaultHealthCheckService()) {
+ health_check_service_.reset(new DefaultHealthCheckService);
+ if (!sync_server_cqs->empty()) { // Has sync methods.
+ RegisterService(health_check_service_->GetSyncHealthCheckService());
+ }
+ }
server_ = grpc_server_create(&channel_args, nullptr);
}
@@ -506,22 +515,6 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) {
started_ = true;
grpc_server_start(server_);
- // Only create default health check service when user did not provide an
- // explicit one.
- if (health_check_service_ == nullptr && !health_check_service_disabled_ &&
- EnableDefaultHealthCheckService()) {
- health_check_service_.reset(new DefaultHealthCheckService);
- for (auto it = sync_req_mgrs_.begin(); it != sync_req_mgrs_.end(); it++) {
- (*it)->AddHealthCheckSyncMethod();
- }
-
- for (size_t i = 0; i < num_cqs; i++) {
- if (cqs[i]->IsFrequentlyPolled()) {
- // new UnimplementedAsyncRequest(this, cqs[i]);
- }
- }
- }
-
if (!has_generic_service_) {
for (auto it = sync_req_mgrs_.begin(); it != sync_req_mgrs_.end(); it++) {
(*it)->AddUnknownSyncMethod();