@ -234,6 +234,7 @@ static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue,
grpc_call_error_detail_of ( err ) , err ) ;
return Qnil ;
}
ev = grpc_rb_completion_queue_pluck_event ( cqueue , tag_new , timeout ) ;
if ( ev . type = = GRPC_QUEUE_TIMEOUT ) {
grpc_request_call_stack_cleanup ( & st ) ;
@ -298,36 +299,15 @@ static VALUE grpc_rb_server_destroy(int argc, VALUE *argv, VALUE self) {
if ( s - > wrapped ! = NULL ) {
grpc_server_shutdown_and_notify ( s - > wrapped , cq , NULL ) ;
ev = grpc_rb_completion_queue_pluck_event ( cqueue , Qnil , timeout ) ;
if ( ! ev . success ) {
rb_warn ( " server shutdown failed, there will be a LEAKED object warning " ) ;
return Qnil ;
/*
TODO : renable the rb_raise below .
At the moment if the timeout is INFINITE_FUTURE as recommended , the
pluck blocks forever , even though
the outstanding server_request_calls correctly fail on the other
thread that they are running on .
it ' s almost as if calls that fail on the other thread do not get
cleaned up by shutdown request , even though it caused htem to
terminate .
rb_raise ( rb_eRuntimeError , " grpc server shutdown did not succeed " ) ;
return Qnil ;
The workaround is just to use a timeout and return without really
shutting down the server , and rely on the grpc core garbage collection
it down as a ' LEAKED OBJECT ' .
*/
rb_warn ( " server shutdown failed, cancelling the calls, objects may leak " ) ;
grpc_server_cancel_all_calls ( s - > wrapped ) ;
return Qfalse ;
}
grpc_server_destroy ( s - > wrapped ) ;
s - > wrapped = NULL ;
}
return Qnil ;
return Qtrue ;
}
/*