diff --git a/examples/trio/send_chan_aclose_masks_beg.py b/examples/trio/send_chan_aclose_masks_beg.py index 74611682..e7f895b7 100644 --- a/examples/trio/send_chan_aclose_masks_beg.py +++ b/examples/trio/send_chan_aclose_masks_beg.py @@ -9,8 +9,10 @@ import tractor import trio -log = tractor.log.get_logger(__name__) -tractor.log.get_console_log('info') +log = tractor.log.get_logger( + name=__name__ +) + @cm def teardown_on_exc( @@ -54,6 +56,7 @@ def teardown_on_exc( async def finite_stream_to_rent( tx: trio.abc.SendChannel, child_errors_mid_stream: bool, + raise_unmasked: bool, task_status: trio.TaskStatus[ trio.CancelScope, @@ -68,20 +71,41 @@ async def finite_stream_to_rent( # inside the child task! # # TODO, uncomment next LoC to see the supprsessed beg[RTE]! - # tractor.trionics.maybe_raise_from_masking_exc(), + tractor.trionics.maybe_raise_from_masking_exc( + raise_unmasked=raise_unmasked, + ), tx as tx, # .aclose() is the guilty masker chkpt! - trio.open_nursery() as _tn, + + # XXX, this ONLY matters in the + # `child_errors_mid_stream=False` case oddly!? + # THAT IS, if no tn is opened in that case then the + # test will not fail; it raises the RTE correctly? + # + # -> so it seems this new scope somehow affects the form of + # eventual in the parent EG? + tractor.trionics.maybe_open_nursery( + nursery=( + None + if not child_errors_mid_stream + else True + ), + ) as _tn, ): # pass our scope back to parent for supervision\ # control. - task_status.started(_tn.cancel_scope) + cs: trio.CancelScope|None = ( + None + if _tn is True + else _tn.cancel_scope + ) + task_status.started(cs) with teardown_on_exc( raise_from_handler=not child_errors_mid_stream, ): for i in range(100): - log.info( + log.debug( f'Child tx {i!r}\n' ) if ( @@ -107,23 +131,31 @@ async def main( # bug and raises. # child_errors_mid_stream: bool, + + raise_unmasked: bool = False, + loglevel: str = 'info', ): + tractor.log.get_console_log(level=loglevel) + + # the `.aclose()` being checkpoints on these + # is the source of the problem.. tx, rx = trio.open_memory_channel(1) async with ( + tractor.trionics.collapse_eg(), trio.open_nursery() as tn, rx as rx, ): - _child_cs = await tn.start( partial( finite_stream_to_rent, child_errors_mid_stream=child_errors_mid_stream, + raise_unmasked=raise_unmasked, tx=tx, ) ) async for msg in rx: - log.info( + log.debug( f'Rent rx {msg!r}\n' ) @@ -139,7 +171,25 @@ async def main( tn.cancel_scope.cancel() +# XXX, manual test as script if __name__ == '__main__': - + tractor.log.get_console_log(level='info') for case in [True, False]: - trio.run(main, case) + log.info( + f'\n' + f'------ RUNNING SCRIPT TRIAL ------\n' + f'child_errors_midstream: {case!r}\n' + ) + try: + trio.run(partial( + main, + child_errors_mid_stream=case, + # raise_unmasked=True, + loglevel='info', + )) + except Exception as _exc: + exc = _exc + log.exception( + 'Should have raised an RTE or Cancelled?\n' + ) + breakpoint()