From 34d6e3c981a4a4d9a4d8186b7e74c80110ebe57d Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 26 Feb 2025 13:04:37 -0500 Subject: [PATCH] Expose `hide_tb: bool` from `.open_nursery()` Such that it gets passed through to `.open_root_actor()` in the `implicit_runtime==True` case - useful for debugging cases where `.devx._debug` APIs might be used to avoid REPL clobbering in subactors. --- tractor/_root.py | 8 +++++++- tractor/_supervise.py | 21 ++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/tractor/_root.py b/tractor/_root.py index ed71f69..2a9beaa 100644 --- a/tractor/_root.py +++ b/tractor/_root.py @@ -111,8 +111,8 @@ async def open_root_actor( Runtime init entry point for ``tractor``. ''' - __tracebackhide__: bool = hide_tb _debug.hide_runtime_frames() + __tracebackhide__: bool = hide_tb # TODO: stick this in a `@cm` defined in `devx._debug`? # @@ -390,6 +390,12 @@ async def open_root_actor( BaseExceptionGroup, ) as err: + # TODO, in beginning to handle the subsubactor with + # crashed grandparent cases.. + # + # was_locked: bool = await _debug.maybe_wait_for_debugger( + # child_in_debug=True, + # ) # XXX NOTE XXX see equiv note inside # `._runtime.Actor._stream_handler()` where in the # non-root or root-that-opened-this-mahually case we diff --git a/tractor/_supervise.py b/tractor/_supervise.py index b07498b..4ecc1a2 100644 --- a/tractor/_supervise.py +++ b/tractor/_supervise.py @@ -402,7 +402,7 @@ async def _open_and_supervise_one_cancels_all_nursery( try: # This is the inner level "run in actor" nursery. It is # awaited first since actors spawned in this way (using - # ``ActorNusery.run_in_actor()``) are expected to only + # `ActorNusery.run_in_actor()`) are expected to only # return a single result and then complete (i.e. be canclled # gracefully). Errors collected from these actors are # immediately raised for handling by a supervisor strategy. @@ -478,8 +478,8 @@ async def _open_and_supervise_one_cancels_all_nursery( ContextCancelled, }: log.cancel( - 'Actor-nursery caught remote cancellation\n\n' - + 'Actor-nursery caught remote cancellation\n' + '\n' f'{inner_err.tb_str}' ) else: @@ -571,7 +571,9 @@ async def _open_and_supervise_one_cancels_all_nursery( @acm # @api_frame async def open_nursery( + hide_tb: bool = False, **kwargs, + # ^TODO, paramspec for `open_root_actor()` ) -> typing.AsyncGenerator[ActorNursery, None]: ''' @@ -589,7 +591,7 @@ async def open_nursery( which cancellation scopes correspond to each spawned subactor set. ''' - __tracebackhide__: bool = True + __tracebackhide__: bool = hide_tb implicit_runtime: bool = False actor: Actor = current_actor(err_on_no_runtime=False) an: ActorNursery|None = None @@ -605,7 +607,10 @@ async def open_nursery( # mark us for teardown on exit implicit_runtime: bool = True - async with open_root_actor(**kwargs) as actor: + async with open_root_actor( + hide_tb=hide_tb, + **kwargs, + ) as actor: assert actor is current_actor() try: @@ -643,8 +648,10 @@ async def open_nursery( # show frame on any internal runtime-scope error if ( an - and not an.cancelled - and an._scope_error + and + not an.cancelled + and + an._scope_error ): __tracebackhide__: bool = False