No matter server-side streaming RPC
or bidirectional streaming RPC
, if there is still message for Client to read, but Client callsgrpc::ClientStreamingInterface::Finish()
, it will block here forever. The call stack is like this:
#0 0x00007ffff5b24076 in epoll_pwait () from /usr/lib/libc.so.6
#1 0x00007ffff71c6ae5 in ?? () from /usr/lib/libgrpc.so.4
#2 0x00007ffff71e3a26 in ?? () from /usr/lib/libgrpc.so.4
#3 0x000055555558300f in grpc::CompletionQueue::Pluck (this=0x555555fd5340, tag=0x7fffffffd800)
at /usr/include/grpc++/impl/codegen/completion_queue.h:224
#4 0x0000555555585e46 in grpc::ClientReaderWriter<..., ...>::Finish (
this=0x555555fd5320) at /usr/include/grpc++/impl/codegen/sync_stream.h:494
So please pay attention to it. Before calling grpc::ClientStreamingInterface::Finish()
, make sure the grpc::ReaderInterface::Read()
return false:
while (stream->Read(&server_note)) {
...
}
Status status = stream->Finish();