diff options
author | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2016-04-05 14:31:33 -0700 |
---|---|---|
committer | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2016-04-05 14:31:33 -0700 |
commit | abb4f5f3ab911d0b0c5bc7d76c27592a1656bd12 (patch) | |
tree | 24545de119aefca873a79dc50e4f7139051fbf4d /src/cpp | |
parent | e3e91a3d3f1fa5ee731d40253223587e68e4fc9b (diff) | |
parent | 725aaf23367d88ef83c0fce538120eb35b9bf641 (diff) |
Merge pull request #6070 from ctiller/head-of-line-blocking
Fix a head of line blocking issue in the C++ server
Diffstat (limited to 'src/cpp')
-rw-r--r-- | src/cpp/server/server.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 3e44c502fc..fafe31e84c 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -321,6 +321,19 @@ void Server::SetGlobalCallbacks(GlobalCallbacks* callbacks) { g_callbacks.reset(callbacks); } +static grpc_server_register_method_payload_handling PayloadHandlingForMethod( + RpcServiceMethod* method) { + switch (method->method_type()) { + case RpcMethod::NORMAL_RPC: + case RpcMethod::SERVER_STREAMING: + return GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER; + case RpcMethod::CLIENT_STREAMING: + case RpcMethod::BIDI_STREAMING: + return GRPC_SRM_PAYLOAD_NONE; + } + GPR_UNREACHABLE_CODE(return GRPC_SRM_PAYLOAD_NONE;); +} + bool Server::RegisterService(const grpc::string* host, Service* service) { bool has_async_methods = service->has_async_methods(); if (has_async_methods) { @@ -334,8 +347,9 @@ bool Server::RegisterService(const grpc::string* host, Service* service) { continue; } RpcServiceMethod* method = it->get(); - void* tag = grpc_server_register_method(server_, method->name(), - host ? host->c_str() : nullptr, 0); + void* tag = grpc_server_register_method( + server_, method->name(), host ? host->c_str() : nullptr, + PayloadHandlingForMethod(method), 0); if (tag == nullptr) { gpr_log(GPR_DEBUG, "Attempt to register %s multiple times", method->name()); |