|  | @@ -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;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*
 |