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.
dereg_on_oserror
Tyler Goodlet 2023-08-20 16:22:46 -04:00
parent 83ce2275b9
commit 9f5b112d19
1 changed files with 17 additions and 3 deletions

View File

@ -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