Correctly propagate and catch request_call failure

pull/20805/head
Lidi Zheng 5 years ago
parent 980bcaf076
commit a978449c3f
  1. 15
      src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi

@ -203,10 +203,10 @@ async def _handle_rpc(list generic_handlers, RPCState rpc_state, object loop):
)
def _FINISH_FUTURE(future):
future.set_result(None)
class _RequestCallError(Exception): pass
cdef CallbackFailureHandler IGNORE_FAILURE = CallbackFailureHandler(callback=_FINISH_FUTURE)
cdef CallbackFailureHandler REQUEST_CALL_FAILURE_HANDLER = CallbackFailureHandler(
'grpc_server_request_call', 'server shutdown', _RequestCallError)
async def _server_call_request_call(Server server,
@ -217,7 +217,7 @@ async def _server_call_request_call(Server server,
cdef object future = loop.create_future()
cdef CallbackWrapper wrapper = CallbackWrapper(
future,
IGNORE_FAILURE)
REQUEST_CALL_FAILURE_HANDLER)
# NOTE(lidiz) Without Py_INCREF, the wrapper object will be destructed
# when calling "await". This is an over-optimization by Cython.
cpython.Py_INCREF(wrapper)
@ -365,8 +365,11 @@ cdef class AioServer:
self._server.is_shutting_down = True
self._status = AIO_SERVER_STATUS_STOPPING
# Ensures the serving task (coroutine) exits normally
await self._serving_task
# Ensures the serving task (coroutine) exits.
try:
await self._serving_task
except _RequestCallError:
pass
if grace is None:
# Directly cancels all calls

Loading…
Cancel
Save