|
|
@ -119,11 +119,24 @@ class Server::UnimplementedAsyncResponse final |
|
|
|
UnimplementedAsyncRequest* const request_; |
|
|
|
UnimplementedAsyncRequest* const request_; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HealthCheckAsyncResponseWriter final |
|
|
|
|
|
|
|
: public ServerAsyncStreamingInterface { |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
HealthCheckAsyncResponseWriter() : call_(nullptr, nullptr, nullptr) {} |
|
|
|
|
|
|
|
void SendInitialMetadata(void* tag) override { |
|
|
|
|
|
|
|
abort(); // should not be called.
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
void BindCall(Call* call) override { call_ = *call; } |
|
|
|
|
|
|
|
Call* call() { return &call_; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
Call call_; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
class Server::HealthCheckAsyncRequestContext { |
|
|
|
class Server::HealthCheckAsyncRequestContext { |
|
|
|
protected: |
|
|
|
protected: |
|
|
|
HealthCheckAsyncRequestContext() : rpc_(&server_context_) {} |
|
|
|
|
|
|
|
ServerContext server_context_; |
|
|
|
ServerContext server_context_; |
|
|
|
ServerAsyncResponseWriter<ByteBuffer> rpc_; |
|
|
|
HealthCheckAsyncResponseWriter rpc_; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
class Server::HealthCheckAsyncRequest final |
|
|
|
class Server::HealthCheckAsyncRequest final |
|
|
@ -137,49 +150,86 @@ class Server::HealthCheckAsyncRequest final |
|
|
|
false), |
|
|
|
false), |
|
|
|
service_(service), |
|
|
|
service_(service), |
|
|
|
server_(server), |
|
|
|
server_(server), |
|
|
|
cq_(cq), |
|
|
|
cq_(cq) { |
|
|
|
had_request_(false) { |
|
|
|
|
|
|
|
IssueRequest(service->method()->server_tag(), &payload_, cq); |
|
|
|
IssueRequest(service->method()->server_tag(), &payload_, cq); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool FinalizeResult(void** tag, bool* status) override; |
|
|
|
bool FinalizeResult(void** tag, bool* status) override; |
|
|
|
|
|
|
|
Call* call() { return rpc_.call(); } |
|
|
|
|
|
|
|
ByteBuffer* response() { return &response_; } |
|
|
|
|
|
|
|
Status* status() { return &status_; } |
|
|
|
|
|
|
|
ServerContext* server_context() { return &server_context_; } |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
DefaultHealthCheckService::AsyncHealthCheckServiceImpl* service_; |
|
|
|
DefaultHealthCheckService::AsyncHealthCheckServiceImpl* service_; |
|
|
|
Server* const server_; |
|
|
|
Server* const server_; |
|
|
|
ServerCompletionQueue* const cq_; |
|
|
|
ServerCompletionQueue* const cq_; |
|
|
|
grpc_byte_buffer* payload_; |
|
|
|
grpc_byte_buffer* payload_; |
|
|
|
bool had_request_; |
|
|
|
|
|
|
|
ByteBuffer request_; |
|
|
|
ByteBuffer request_; |
|
|
|
ByteBuffer response_; |
|
|
|
ByteBuffer response_; |
|
|
|
|
|
|
|
Status status_; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, |
|
|
|
|
|
|
|
CallOpServerSendStatus> |
|
|
|
|
|
|
|
HealthCheckAsyncResponseOp; |
|
|
|
|
|
|
|
class Server::HealthCheckAsyncResponse final |
|
|
|
|
|
|
|
: public HealthCheckAsyncResponseOp { |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
HealthCheckAsyncResponse(HealthCheckAsyncRequest* request); |
|
|
|
|
|
|
|
~HealthCheckAsyncResponse() { delete request_; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FinalizeResult(void** tag, bool* status) override { |
|
|
|
|
|
|
|
HealthCheckAsyncResponseOp::FinalizeResult(tag, status); |
|
|
|
|
|
|
|
delete this; |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
HealthCheckAsyncRequest* const request_; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
bool Server::HealthCheckAsyncRequest::FinalizeResult(void** tag, bool* status) { |
|
|
|
bool Server::HealthCheckAsyncRequest::FinalizeResult(void** tag, bool* status) { |
|
|
|
if (!had_request_) { |
|
|
|
bool serialization_status = |
|
|
|
had_request_ = true; |
|
|
|
*status && payload_ && |
|
|
|
bool serialization_status = |
|
|
|
SerializationTraits<ByteBuffer>::Deserialize( |
|
|
|
*status && payload_ && |
|
|
|
payload_, &request_, server_->max_receive_message_size()) |
|
|
|
SerializationTraits<ByteBuffer>::Deserialize( |
|
|
|
.ok(); |
|
|
|
payload_, &request_, server_->max_receive_message_size()) |
|
|
|
RegisteredAsyncRequest::FinalizeResult(tag, status); |
|
|
|
.ok(); |
|
|
|
*status = serialization_status && *status; |
|
|
|
RegisteredAsyncRequest::FinalizeResult(tag, status); |
|
|
|
if (*status) { |
|
|
|
*status = serialization_status && *status; |
|
|
|
new HealthCheckAsyncRequest(service_, server_, cq_); |
|
|
|
if (*status) { |
|
|
|
status_ = service_->Check(&server_context_, &request_, &response_); |
|
|
|
new HealthCheckAsyncRequest(service_, server_, cq_); |
|
|
|
new HealthCheckAsyncResponse(this); |
|
|
|
Status s = service_->Check(&server_context_, &request_, &response_); |
|
|
|
return false; |
|
|
|
rpc_.Finish(response_, s, this); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// TODO what to do here
|
|
|
|
|
|
|
|
delete this; |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
delete this; |
|
|
|
delete this; |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Server::HealthCheckAsyncResponse::HealthCheckAsyncResponse( |
|
|
|
|
|
|
|
HealthCheckAsyncRequest* request) |
|
|
|
|
|
|
|
: request_(request) { |
|
|
|
|
|
|
|
ServerContext* context = request_->server_context(); |
|
|
|
|
|
|
|
if (!context->sent_initial_metadata_) { |
|
|
|
|
|
|
|
SendInitialMetadata(context->initial_metadata_, |
|
|
|
|
|
|
|
context->initial_metadata_flags()); |
|
|
|
|
|
|
|
if (context->compression_level_set()) { |
|
|
|
|
|
|
|
set_compression_level(context->compression_level()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
context->sent_initial_metadata_ = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Status* status = request_->status(); |
|
|
|
|
|
|
|
if (status->ok()) { |
|
|
|
|
|
|
|
ServerSendStatus(context->trailing_metadata_, |
|
|
|
|
|
|
|
SendMessage(*request_->response())); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
ServerSendStatus(context->trailing_metadata_, *status); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
request_->call()->PerformOps(this); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class ShutdownTag : public CompletionQueueTag { |
|
|
|
class ShutdownTag : public CompletionQueueTag { |
|
|
|
public: |
|
|
|
public: |
|
|
|
bool FinalizeResult(void** tag, bool* status) { return false; } |
|
|
|
bool FinalizeResult(void** tag, bool* status) { return false; } |
|
|
@ -567,9 +617,10 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) { |
|
|
|
auto* default_hc_service = new DefaultHealthCheckService; |
|
|
|
auto* default_hc_service = new DefaultHealthCheckService; |
|
|
|
health_check_service_.reset(default_hc_service); |
|
|
|
health_check_service_.reset(default_hc_service); |
|
|
|
if (!sync_server_cqs_->empty()) { // Has sync methods.
|
|
|
|
if (!sync_server_cqs_->empty()) { // Has sync methods.
|
|
|
|
|
|
|
|
gpr_log(GPR_ERROR, "register sync"); // XXX
|
|
|
|
RegisterService(nullptr, default_hc_service->GetSyncHealthCheckService()); |
|
|
|
RegisterService(nullptr, default_hc_service->GetSyncHealthCheckService()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (sync_server_cqs_->empty()) { // No sync methods.
|
|
|
|
gpr_log(GPR_ERROR, "register async"); // XXX
|
|
|
|
async_health_service = default_hc_service->GetAsyncHealthCheckService(); |
|
|
|
async_health_service = default_hc_service->GetAsyncHealthCheckService(); |
|
|
|
RegisterService(nullptr, async_health_service); |
|
|
|
RegisterService(nullptr, async_health_service); |
|
|
|
} |
|
|
|
} |
|
|
|