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();
You have saved me hours of troubleshooting. We had leaked gspeech session threads in our telecom server because of this locking issue. Thanks for making this post.
God’s work. Saved me hours of troubleshooting too. Thanks alot!
I had that exact same issue on bidirectional gRPCs and this behavior is not clearly defined in Google’s examples… Thanks a bunch! 🙂
Is there any way to set timeout in Finish function. It will stuck for 5 min. How about new grpc c++ 1.66.0 lib version