From 592d91839411619c34334f2a5a5cce8b13ae2888 Mon Sep 17 00:00:00 2001 From: goodboy Date: Thu, 12 Feb 2026 18:17:45 -0500 Subject: [PATCH] Tweak `test_inter_peer_cancellation` for races Adjust `basic_echo_server()` default sequence len to avoid the race where the 'tell_little_bro()` finished streaming **before** the echo-server sub is cancelled by its peer subactor (which is the whole thing we're testing!). Deats, - bump `rng_seed` default from 50 -> 100 to ensure peer cancel req arrives before echo dialog completes on fast hw. - add `trio.sleep(0.001)` between send/receive in msg loop on the "client" streamer side to give cancel request transit more time to arrive. Also, - add more native `tractor`-type hints. - reflow `basic_echo_server()` doc-string for 67 char limit - add masked `pause()` call with comment about unreachable code path - alphabetize imports: mv `current_actor` and `open_nursery` below typed imports (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code --- tests/test_inter_peer_cancellation.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/tests/test_inter_peer_cancellation.py b/tests/test_inter_peer_cancellation.py index 79c454f6..379f6fac 100644 --- a/tests/test_inter_peer_cancellation.py +++ b/tests/test_inter_peer_cancellation.py @@ -11,12 +11,13 @@ import trio import tractor from tractor import ( # typing Actor, - current_actor, - open_nursery, - Portal, Context, ContextCancelled, + MsgStream, + Portal, RemoteActorError, + current_actor, + open_nursery, ) from tractor._testing import ( # tractor_test, @@ -796,8 +797,8 @@ async def basic_echo_server( ) -> None: ''' - Just the simplest `MsgStream` echo server which resays what - you told it but with its uid in front ;) + Just the simplest `MsgStream` echo server which resays what you + told it but with its uid in front ;) ''' actor: Actor = tractor.current_actor() @@ -966,9 +967,14 @@ async def tell_little_bro( caller: str = '', err_after: float|None = None, - rng_seed: int = 50, + rng_seed: int = 100, + # NOTE, ensure ^ is large enough (on fast hw anyway) + # to ensure the peer cancel req arrives before the + # echoing dialog does itself Bp ): # contact target actor, do a stream dialog. + lb: Portal + echo_ipc: MsgStream async with ( tractor.wait_for_actor( name=actor_name @@ -983,7 +989,6 @@ async def tell_little_bro( else None ), ) as (sub_ctx, first), - sub_ctx.open_stream() as echo_ipc, ): actor: Actor = current_actor() @@ -994,6 +999,7 @@ async def tell_little_bro( i, ) await echo_ipc.send(msg) + await trio.sleep(0.001) resp = await echo_ipc.receive() print( f'{caller} => {actor_name}: {msg}\n' @@ -1006,6 +1012,9 @@ async def tell_little_bro( assert sub_uid != uid assert _i == i + # XXX, usually should never get here! + # await tractor.pause() + @pytest.mark.parametrize( 'raise_client_error',