From 7258d57c69db91bb81da34c54026107cbbfec70f Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 1 Oct 2023 15:36:17 -0400 Subject: [PATCH] Only warn on mismatched `open_registry()` input addrs When a new (actor) caller opens the registry there are 2 possible cases: 1. - some task already opened the registry during init and set the global superset of registrar addrs that are expected to be used, 2. - some task after the init task opens with a subset of addrs. 3. - some task after init opens with a disjoint set - should be an error? In the 2nd case we don't want to error since the may just not need to know about other registrar (multi-homed) addrs and thus only needs specific access - so only warn about the diff in that case. If the caller is requesting some disjoint set then we still runtime raise. Adjust `find_service()` to allow a null `registry_addrs` input in which case we fail over to using whatever pre-set the `Registry.addrs` has; makes it simple for actors that don't want/need to know about the global registrar set for their actor tree. Also, always set pass `tractor.find_actor(only_first=True)` (for now). --- piker/service/_registry.py | 50 ++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/piker/service/_registry.py b/piker/service/_registry.py index 7d98d0ba..a6021717 100644 --- a/piker/service/_registry.py +++ b/piker/service/_registry.py @@ -66,7 +66,13 @@ async def open_registry( ensure_exists: bool = True, ) -> list[tuple[str, int]]: + ''' + Open the service-actor-discovery registry by returning a set of + tranport socket-addrs to registrar actors which may be + contacted and queried for similar addresses for other + non-registrar actors. + ''' global _tractor_kwargs actor = tractor.current_actor() uid = actor.uid @@ -76,11 +82,19 @@ async def open_registry( and addrs ): if preset_reg_addrs != addrs: - raise RuntimeError( - f'`{uid}` has non-matching registrar addresses?\n' - f'request: {addrs}\n' - f'already set: {preset_reg_addrs}' - ) + # if any(addr in preset_reg_addrs for addr in addrs): + diff: set[tuple[str, int]] = set(preset_reg_addrs) - set(addrs) + if diff: + log.warning( + f'`{uid}` requested only subset of registrars: {addrs}\n' + f'However there are more @{diff}' + ) + else: + raise RuntimeError( + f'`{uid}` has non-matching registrar addresses?\n' + f'request: {addrs}\n' + f'already set: {preset_reg_addrs}' + ) was_set: bool = False @@ -122,7 +136,7 @@ async def open_registry( @acm async def find_service( service_name: str, - registry_addrs: list[tuple[str, int]], + registry_addrs: list[tuple[str, int]] | None = None, first_only: bool = True, @@ -130,22 +144,26 @@ async def find_service( reg_addrs: list[tuple[str, int]] async with open_registry( - addrs=registry_addrs, + addrs=( + registry_addrs + # NOTE: if no addr set is passed assume the registry has + # already been opened and use the previously applied + # startup set. + or Registry.addrs + ), ) as reg_addrs: log.info(f'Scanning for service `{service_name}`') # attach to existing daemon by name if possible async with tractor.find_actor( service_name, registry_addrs=reg_addrs, + only_first=first_only, # if set only returns single ref ) as maybe_portals: if not maybe_portals: yield None return - if first_only: - yield maybe_portals[0] - else: - yield maybe_portals[0] + yield maybe_portals async def check_for_service( @@ -156,9 +174,11 @@ async def check_for_service( Service daemon "liveness" predicate. ''' - async with open_registry(ensure_exists=False) as reg_addr: - async with tractor.query_actor( + async with ( + open_registry(ensure_exists=False) as reg_addr, + tractor.query_actor( service_name, arbiter_sockaddr=reg_addr, - ) as sockaddr: - return sockaddr + ) as sockaddr, + ): + return sockaddr