From c0cd99e37420a32e80cb8f0d4cebf8ce9544ca48 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 28 Jul 2022 14:54:03 -0400 Subject: [PATCH] Timeout on arbiter ping, avoid TCP SYN hangs in CI? --- tractor/_root.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tractor/_root.py b/tractor/_root.py index f8305ee..b2bfbfc 100644 --- a/tractor/_root.py +++ b/tractor/_root.py @@ -103,7 +103,6 @@ async def open_root_actor( _default_arbiter_port, ) - loglevel = (loglevel or log._default_loglevel).upper() if debug_mode and _spawn._spawn_method == 'trio': @@ -131,19 +130,22 @@ async def open_root_actor( log.get_console_log(loglevel) - # make a temporary connection to see if an arbiter exists - arbiter_found = False - try: + # make a temporary connection to see if an arbiter exists, + # if one can't be made quickly we assume none exists. + arbiter_found = False + # TODO: this connect-and-bail forces us to have to carefully # rewrap TCP 104-connection-reset errors as EOF so as to avoid # propagating cancel-causing errors to the channel-msg loop # machinery. Likely it would be better to eventually have # a "discovery" protocol with basic handshake instead. - async with _connect_chan(host, port): - arbiter_found = True + with trio.move_on_after(1): + async with _connect_chan(host, port): + arbiter_found = True except OSError: + # TODO: make this a "discovery" log level? logger.warning(f"No actor could be found @ {host}:{port}") # create a local actor and start up its main routine/task @@ -213,7 +215,8 @@ async def open_root_actor( finally: # NOTE: not sure if we'll ever need this but it's # possibly better for even more determinism? - # logger.cancel(f'Waiting on {len(nurseries)} nurseries in root..') + # logger.cancel( + # f'Waiting on {len(nurseries)} nurseries in root..') # nurseries = actor._actoruid2nursery.values() # async with trio.open_nursery() as tempn: # for an in nurseries: