Hi,

I see an occasional when shutting down my server (version 1.4.2, VS 2015, 
Windows). 

My set up: I use async api and have 2 threads. 
1.  Thread 1 processes the tags from the completion queue. It also executes 
the shutdown request.
2. Thread 2 plucks the tags from the completion queue and queues them for 
the thread 1 to process.

After running for a while, on thread 1, I call server shutdown followed by 
the completion queue shutdown. The code looks like 

 if (mServer != nullptr)
        mServer->Shutdown(gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), 
gpr_time_from_micros((deadline - 
TimeValue::getTimeOfDay()).getMicroSeconds(), GPR_TIMESPAN)));

    if (mCQ != nullptr) 
        mCQ->Shutdown();

Meanwhile, thread 2 is doing following

 while (true)
    {
        if (!mCQ->Next((void**)&tagInfo.tagProcessor, &tagInfo.ok))
        {
            
            break;
        }
}


So at some point, thread 2 notices that the completion queue has been 
shutdown and it exits out of the loop. 

Thread 1 continues to process the tags that were received previously. One 
of them happened to be 'done' tag of a previous rpc operation and in 
response to it, I destroy the rpc (my own class). This causes the 
ServerContext held by the rpc to be destroyed and I see following crash. 

ntdll.dll!00007ffe6f7ebbdf() Unknown
  ntdll.dll!00007ffe6f7c4571() Unknown
  ntdll.dll!00007ffe6f7c4490() Unknown
        gpr_mu_lock(gpr_mu * mu) Line 53 C
  interned_slice_destroy(interned_slice_refcount * s) Line 94 C
  interned_slice_unref(grpc_exec_ctx * exec_ctx, void * p) Line 112 C
  grpc_slice_unref_internal(grpc_exec_ctx * exec_ctx, grpc_slice slice) 
Line 76 C
  destroy_channel_elem(grpc_exec_ctx * exec_ctx, grpc_channel_element * 
elem) Line 926 C
  grpc_channel_stack_destroy(grpc_exec_ctx * exec_ctx, grpc_channel_stack * 
stack) Line 166 C
  destroy_channel(grpc_exec_ctx * exec_ctx, void * arg, grpc_error * error) 
Line 383 C
  grpc_exec_ctx_flush(grpc_exec_ctx * exec_ctx) Line 85 C
  grpc_exec_ctx_finish(grpc_exec_ctx * exec_ctx) Line 100 C
  grpc_call_unref(grpc_call * c) Line 579 C
  grpc::ServerContext::~ServerContext() Line 157 C++

Is it possible that the shutdown sequence is just a red herring and the bug 
is something else? Or is my shutdown sequence wrong (I can't delete 
ServerContext after shutting down server and completion queue)? 

Any tips appreciated. 

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/2e7f038e-8d19-4989-8f2a-8e09536afb33%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to