mirror of https://github.com/grpc/grpc.git
Merge pull request #17435 from yang-g/health_service_shutdown
Add a Shutdown call to HealthCheckServiceInterfacereviewable/pr16008/r1^2
commit
b590167cf2
12 changed files with 306 additions and 56 deletions
@ -0,0 +1,97 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2018 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#include "test/cpp/end2end/test_health_check_service_impl.h" |
||||
|
||||
#include <grpc/grpc.h> |
||||
|
||||
using grpc::health::v1::HealthCheckRequest; |
||||
using grpc::health::v1::HealthCheckResponse; |
||||
|
||||
namespace grpc { |
||||
namespace testing { |
||||
|
||||
Status HealthCheckServiceImpl::Check(ServerContext* context, |
||||
const HealthCheckRequest* request, |
||||
HealthCheckResponse* response) { |
||||
std::lock_guard<std::mutex> lock(mu_); |
||||
auto iter = status_map_.find(request->service()); |
||||
if (iter == status_map_.end()) { |
||||
return Status(StatusCode::NOT_FOUND, ""); |
||||
} |
||||
response->set_status(iter->second); |
||||
return Status::OK; |
||||
} |
||||
|
||||
Status HealthCheckServiceImpl::Watch( |
||||
ServerContext* context, const HealthCheckRequest* request, |
||||
::grpc::ServerWriter<HealthCheckResponse>* writer) { |
||||
auto last_state = HealthCheckResponse::UNKNOWN; |
||||
while (!context->IsCancelled()) { |
||||
{ |
||||
std::lock_guard<std::mutex> lock(mu_); |
||||
HealthCheckResponse response; |
||||
auto iter = status_map_.find(request->service()); |
||||
if (iter == status_map_.end()) { |
||||
response.set_status(response.SERVICE_UNKNOWN); |
||||
} else { |
||||
response.set_status(iter->second); |
||||
} |
||||
if (response.status() != last_state) { |
||||
writer->Write(response, ::grpc::WriteOptions()); |
||||
} |
||||
} |
||||
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), |
||||
gpr_time_from_millis(1000, GPR_TIMESPAN))); |
||||
} |
||||
return Status::OK; |
||||
} |
||||
|
||||
void HealthCheckServiceImpl::SetStatus( |
||||
const grpc::string& service_name, |
||||
HealthCheckResponse::ServingStatus status) { |
||||
std::lock_guard<std::mutex> lock(mu_); |
||||
if (shutdown_) { |
||||
status = HealthCheckResponse::NOT_SERVING; |
||||
} |
||||
status_map_[service_name] = status; |
||||
} |
||||
|
||||
void HealthCheckServiceImpl::SetAll(HealthCheckResponse::ServingStatus status) { |
||||
std::lock_guard<std::mutex> lock(mu_); |
||||
if (shutdown_) { |
||||
return; |
||||
} |
||||
for (auto iter = status_map_.begin(); iter != status_map_.end(); ++iter) { |
||||
iter->second = status; |
||||
} |
||||
} |
||||
|
||||
void HealthCheckServiceImpl::Shutdown() { |
||||
std::lock_guard<std::mutex> lock(mu_); |
||||
if (shutdown_) { |
||||
return; |
||||
} |
||||
shutdown_ = true; |
||||
for (auto iter = status_map_.begin(); iter != status_map_.end(); ++iter) { |
||||
iter->second = HealthCheckResponse::NOT_SERVING; |
||||
} |
||||
} |
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
@ -0,0 +1,58 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2018 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
#ifndef GRPC_TEST_CPP_END2END_TEST_HEALTH_CHECK_SERVICE_IMPL_H |
||||
#define GRPC_TEST_CPP_END2END_TEST_HEALTH_CHECK_SERVICE_IMPL_H |
||||
|
||||
#include <map> |
||||
#include <mutex> |
||||
|
||||
#include <grpcpp/server_context.h> |
||||
#include <grpcpp/support/status.h> |
||||
|
||||
#include "src/proto/grpc/health/v1/health.grpc.pb.h" |
||||
|
||||
namespace grpc { |
||||
namespace testing { |
||||
|
||||
// A sample sync implementation of the health checking service. This does the
|
||||
// same thing as the default one.
|
||||
class HealthCheckServiceImpl : public health::v1::Health::Service { |
||||
public: |
||||
Status Check(ServerContext* context, |
||||
const health::v1::HealthCheckRequest* request, |
||||
health::v1::HealthCheckResponse* response) override; |
||||
Status Watch(ServerContext* context, |
||||
const health::v1::HealthCheckRequest* request, |
||||
ServerWriter<health::v1::HealthCheckResponse>* writer) override; |
||||
void SetStatus(const grpc::string& service_name, |
||||
health::v1::HealthCheckResponse::ServingStatus status); |
||||
void SetAll(health::v1::HealthCheckResponse::ServingStatus status); |
||||
|
||||
void Shutdown(); |
||||
|
||||
private: |
||||
std::mutex mu_; |
||||
bool shutdown_ = false; |
||||
std::map<const grpc::string, health::v1::HealthCheckResponse::ServingStatus> |
||||
status_map_; |
||||
}; |
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPC_TEST_CPP_END2END_TEST_HEALTH_CHECK_SERVICE_IMPL_H
|
Loading…
Reference in new issue