grpc_completion_queue_pluck doesn't return shutdown event

15 views
Skip to first unread message

kishan nerella

unread,
Jan 22, 2021, 6:27:22 AM1/22/21
to grpc.io
Hello,

I'm using grpc-c library(link) which provides a c-wrapper around the core library. The following is the pseudo code for a unary client call(modified to handle failure cases).

cq = grpc_completion_queue_create();
call = grpc_channel_create_call(cq);

// Start a batch on the call to do an unary RPC.
grpc_call_start_batch(call);

gpr_timespec tout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
                                gpr_time_from_millis(15000, GPR_TIMESPAN));

ev = grpc_completion_queue_pluck(context->gcc_cq, context, tout, NULL);
if (ev.type == GRPC_QUEUE_TIMEOUT &&
    grpc_call_cancel(context->gcc_call, NULL) == GRPC_CALL_OK) {
  gpr_log(GPR_ERROR, "Sync call timedout");
  grpc_completion_queue_shutdown(cq);
  while (grpc_completion_queue_pluck(cq, context,
                                     gpr_inf_past(GPR_CLOCK_REALTIME), NULL)
             .type != GRPC_QUEUE_SHUTDOWN)
    ;
  grpc_completion_queue_destroy(cq);
}

1. Is the above handling of completion queue destruction correct when the RPC times out?
2. Once in a while, I see a case where the grpc_completion_queue_pluck() doesn't return shutdown event ever when a timeout occurs. Can there be a reason this can happen?

Note that in our setup, upto 5 RPCs can be made in parallel on the same client.


Thanks,
Kishan.
Reply all
Reply to author
Forward
0 new messages