Relay `ContextCancelled` for `Portal.run()` cancelled remote tasks
							parent
							
								
									39feb627a8
								
							
						
					
					
						commit
						2c74db9cb7
					
				| 
						 | 
					@ -58,7 +58,7 @@ async def _invoke(
 | 
				
			||||||
    Invoke local func and deliver result(s) over provided channel.
 | 
					    Invoke local func and deliver result(s) over provided channel.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    __tracebackhide__ = True
 | 
					    # __tracebackhide__ = True
 | 
				
			||||||
    treat_as_gen = False
 | 
					    treat_as_gen = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # possible a traceback (not sure what typing is for this..)
 | 
					    # possible a traceback (not sure what typing is for this..)
 | 
				
			||||||
| 
						 | 
					@ -69,6 +69,7 @@ async def _invoke(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ctx = Context(chan, cid)
 | 
					    ctx = Context(chan, cid)
 | 
				
			||||||
    context: bool = False
 | 
					    context: bool = False
 | 
				
			||||||
 | 
					    fname = func.__name__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if getattr(func, '_tractor_stream_function', False):
 | 
					    if getattr(func, '_tractor_stream_function', False):
 | 
				
			||||||
        # handle decorated ``@tractor.stream`` async functions
 | 
					        # handle decorated ``@tractor.stream`` async functions
 | 
				
			||||||
| 
						 | 
					@ -164,6 +165,7 @@ async def _invoke(
 | 
				
			||||||
                    await chan.send({'return': await coro, 'cid': cid})
 | 
					                    await chan.send({'return': await coro, 'cid': cid})
 | 
				
			||||||
                except trio.Cancelled as err:
 | 
					                except trio.Cancelled as err:
 | 
				
			||||||
                    tb = err.__traceback__
 | 
					                    tb = err.__traceback__
 | 
				
			||||||
 | 
					                    raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if cs.cancelled_caught:
 | 
					            if cs.cancelled_caught:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,7 +173,6 @@ async def _invoke(
 | 
				
			||||||
                # so they can be unwrapped and displayed on the caller
 | 
					                # so they can be unwrapped and displayed on the caller
 | 
				
			||||||
                # side!
 | 
					                # side!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                fname = func.__name__
 | 
					 | 
				
			||||||
                if ctx._cancel_called:
 | 
					                if ctx._cancel_called:
 | 
				
			||||||
                    msg = f'{fname} cancelled itself'
 | 
					                    msg = f'{fname} cancelled itself'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,11 +193,25 @@ async def _invoke(
 | 
				
			||||||
            await chan.send({'functype': 'asyncfunc', 'cid': cid})
 | 
					            await chan.send({'functype': 'asyncfunc', 'cid': cid})
 | 
				
			||||||
            with cancel_scope as cs:
 | 
					            with cancel_scope as cs:
 | 
				
			||||||
                task_status.started(cs)
 | 
					                task_status.started(cs)
 | 
				
			||||||
                await chan.send({'return': await coro, 'cid': cid})
 | 
					                try:
 | 
				
			||||||
 | 
					                    await chan.send({'return': await coro, 'cid': cid})
 | 
				
			||||||
 | 
					                except trio.Cancelled as err:
 | 
				
			||||||
 | 
					                    tb = err.__traceback__
 | 
				
			||||||
 | 
					                    raise
 | 
				
			||||||
 | 
					                # await chan.send({'return': await coro, 'cid': cid})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if cs.cancelled_caught:
 | 
					            if cs.cancelled_caught:
 | 
				
			||||||
 | 
					                # if cs.cancel_called:
 | 
				
			||||||
 | 
					                if cs.cancel_called:
 | 
				
			||||||
 | 
					                    msg = (
 | 
				
			||||||
 | 
					                        f'{fname} was remotely cancelled by its caller '
 | 
				
			||||||
 | 
					                        f'{ctx.chan.uid}'
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    msg = f'{fname} cancelled itself'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                raise ContextCancelled(
 | 
					                raise ContextCancelled(
 | 
				
			||||||
                    'cancelled',
 | 
					                    msg,
 | 
				
			||||||
                    suberror_type=trio.Cancelled,
 | 
					                    suberror_type=trio.Cancelled,
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -561,7 +576,8 @@ class Actor:
 | 
				
			||||||
        send_chan, recv_chan = self._cids2qs[(chan.uid, cid)]
 | 
					        send_chan, recv_chan = self._cids2qs[(chan.uid, cid)]
 | 
				
			||||||
        assert send_chan.cid == cid  # type: ignore
 | 
					        assert send_chan.cid == cid  # type: ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # if 'error' in msg:
 | 
					        if 'error' in msg:
 | 
				
			||||||
 | 
					            recv_chan
 | 
				
			||||||
        #     ctx = getattr(recv_chan, '_ctx', None)
 | 
					        #     ctx = getattr(recv_chan, '_ctx', None)
 | 
				
			||||||
        #     if ctx:
 | 
					        #     if ctx:
 | 
				
			||||||
        #         ctx._error_from_remote_msg(msg)
 | 
					        #         ctx._error_from_remote_msg(msg)
 | 
				
			||||||
| 
						 | 
					@ -1027,7 +1043,7 @@ class Actor:
 | 
				
			||||||
            raise
 | 
					            raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        finally:
 | 
					        finally:
 | 
				
			||||||
            log.info("Runtime nursery complete")
 | 
					            log.runtime("root runtime nursery complete")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # tear down all lifetime contexts if not in guest mode
 | 
					            # tear down all lifetime contexts if not in guest mode
 | 
				
			||||||
            # XXX: should this just be in the entrypoint?
 | 
					            # XXX: should this just be in the entrypoint?
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue