I have a C++ client, that connects to a C# server. The connection is being 
made by a RPC function (called 
*InitializeStream()*), that sends a single request and receives a stream of 
responses from the server. This RPC function is executed with 'max' timeout 
(if the server is unavailable, later call to stream->Read() will return an 
error. This is good enough for me).
I encountered a weird bug, which happened on a VM. (I couldn't reproduce it 
on any other machine, but it reproduces easily on that VM). On that single 
VM, the 
*InitializeStream()* RPC function never returns.

Further debugging of this issue reveled the following:

   1. The main thread (thread #1) is blocked inside InitializeStream(), in 
* grpc_iocp_work()*. The exact line is 
* iocp_windows.c@83* - in Windows's 
* GetQueuedCompletionStatus()* function.
   As far as I understand, here we wait for a task completion, for 
   unlimited timeout (I used the 'max' timeout).
     [External Code] 
   > Test.exe!grpc_iocp_work(grpc_exec_ctx * exec_ctx, gpr_timespec deadline
   ) Line 83 C
     Test.exe!grpc_pollset_work(grpc_exec_ctx * exec_ctx, grpc_pollset * 
   pollset, grpc_pollset_worker * * worker_hdl, gpr_timespec now, 
   gpr_timespec deadline) Line 140 C
     Test.exe!grpc_completion_queue_pluck(grpc_completion_queue * cc, void * 
   tag, gpr_timespec deadline, void * reserved) Line 614 C
     
Test.exe!grpc::CoreCodegen::grpc_completion_queue_pluck(grpc_completion_queue 
   * cq, void * tag, gpr_timespec deadline, void * reserved) Line 70 C++
     Test.exe!grpc::CompletionQueue::Pluck(grpc::CompletionQueueTag * tag) 
   Line 230 C++
     Test.exe!grpc::ClientReader<test::TestRequest>::ClientReader<test::
   TestRequest><test::InitMessage>(grpc::ChannelInterface * channel, const 
   grpc::RpcMethod & method, grpc::ClientContext * context, const test::
   InitMessage & request) Line 151 C++
     Test.exe!test::testInterface::Stub::InitializeStreamRaw(grpc::
   ClientContext * context, const test::InitMessage & request) Line 46 C++
     Test.exe!test::testInterface::Stub::InitializeStream(grpc::
   ClientContext * context, const test::InitMessage & request) Line 86 C++
     Test.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * 
   __formal, int __formal) Line 17 C++
     [External Code]
   
   2. One of gRPC's threads [from the thread pool] (thread #2), called the 
   function 
* do_request_thread()* in 
* resolve_address_windows.c@153*, which called 
* grpc_blocking_resolve_address()* (blocking function, by its name) that 
   called 
* getaddrinfo()* that never returns!

My guess is that thread #1 waits (*GetQueuedCompletionStatus*) for thread 
#2's task completion. 
*getaddrinfo()* never returns, so 
*GetQueuedCompletionStatus()* is blocking, and the main thread is stuck.

Have you encountered this error before? Do you have any idea what can I do 
(beside adding a timeout to the function, which I consider as a bypass and 
not a solution).
I use gRPC v1.2.0 for both C++ and C#.

Thanks

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/89b0a161-9830-4635-80a1-ca3214d35861%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to