From 73302d9d16c005b74c4d3981f44d58a37ddd05c2 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 13 Jun 2021 18:03:50 -0400 Subject: [PATCH] Specially raise a `ContextCancelled` for a task-context rpc --- tractor/_actor.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tractor/_actor.py b/tractor/_actor.py index 0169784..4b215f8 100644 --- a/tractor/_actor.py +++ b/tractor/_actor.py @@ -28,6 +28,7 @@ from ._exceptions import ( unpack_error, ModuleNotExposed, is_multi_cancelled, + ContextCancelled, TransportClosed, ) from . import _debug @@ -152,9 +153,12 @@ async def _invoke( task_status.started(cs) await chan.send({'return': await coro, 'cid': cid}) - # if cs.cancelled_caught: - # # task was cancelled so relay to the cancel to caller - # await chan.send({'return': await coro, 'cid': cid}) + if cs.cancelled_caught: + # task-contex was cancelled so relay to the cancel to caller + raise ContextCancelled( + f'{func.__name__} cancelled itself', + suberror_type=trio.Cancelled, + ) else: # regular async function @@ -168,7 +172,8 @@ async def _invoke( # TODO: maybe we'll want differnet "levels" of debugging # eventualy such as ('app', 'supervisory', 'runtime') ? if not isinstance(err, trio.ClosedResourceError) and ( - not is_multi_cancelled(err) + not is_multi_cancelled(err)) and ( + not isinstance(err, ContextCancelled) ): # XXX: is there any case where we'll want to debug IPC # disconnects? I can't think of a reason that inspecting