From 9f5b112d1913441794e5b9bec0138a9acb618c1e Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 20 Aug 2023 16:22:46 -0400 Subject: [PATCH] Add `Arbiter.delete_sockaddr()` to remove addrs Since stale addrs can be leaked where the actor transport server task crashes but doesn't (successfully) unregister from the registrar, we need a remote way to remove such entries; hence this new (registrar) method. To implement this make use of the `bidict` lib for the `._registry` table thus making it super simple to do reverse uuid lookups from an input socket-address. --- tractor/_runtime.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tractor/_runtime.py b/tractor/_runtime.py index f18e0d61..f8671ae4 100644 --- a/tractor/_runtime.py +++ b/tractor/_runtime.py @@ -68,6 +68,7 @@ import textwrap from types import ModuleType import warnings +from bidict import bidict import trio from trio._core import _run as trio_runtime from trio import ( @@ -1879,10 +1880,10 @@ class Arbiter(Actor): **kwargs, ) -> None: - self._registry: dict[ + self._registry: bidict[ tuple[str, str], UnwrappedAddress, - ] = {} + ] = bidict({}) self._waiters: dict[ str, # either an event to sync to receiving an actor uid (which @@ -1988,4 +1989,17 @@ class Arbiter(Actor): uid = (str(uid[0]), str(uid[1])) entry: tuple = self._registry.pop(uid, None) if entry is None: - log.warning(f'Request to de-register {uid} failed?') + log.warning( + f'Request to de-register {uid!r} failed?' + ) + + async def delete_sockaddr( + self, + sockaddr: tuple[str, int|str], + ) -> tuple[str, str]: + uid: tuple = self._registry.inverse.pop(sockaddr) + log.warning( + f'Deleting registry-entry for,\n' + f'{sockaddr!r}@{uid!r}' + ) + return uid