Add `enable_transports`/`registry_addrs` proto guard
Raise `ValueError` from `open_root_actor()` when any `registry_addrs` entry uses a transport proto not in `enable_transports` — historically this caused a silent indefinite hang during the registrar handshake (the actor could never connect to register/discover). Also, - update `test_root_passes_tpt_to_sub` to detect a proto mismatch between parametrized `tpt_proto_key` and CLI `tpt_proto`, asserting the new guard raises `ValueError` with expected msg content. - replace old commented-out notes with a clearer explanation of the mismatch foot-gun. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-codesubint_forkserver_backend
parent
7882c37ce0
commit
d036ef7d7f
|
|
@ -59,15 +59,18 @@ async def chk_tpts(
|
||||||
)
|
)
|
||||||
def test_root_passes_tpt_to_sub(
|
def test_root_passes_tpt_to_sub(
|
||||||
tpt_proto_key: str,
|
tpt_proto_key: str,
|
||||||
|
tpt_proto: str,
|
||||||
reg_addr: tuple,
|
reg_addr: tuple,
|
||||||
debug_mode: bool,
|
debug_mode: bool,
|
||||||
):
|
):
|
||||||
# XXX NOTE, the `reg_addr` addr won't be the same type as the
|
# `reg_addr` is sourced from the CLI `--tpt-proto={tpt_proto}`,
|
||||||
# `tpt_proto_key` would deliver here unless you pass `--tpt-proto
|
# so when the parametrized `tpt_proto_key` differs, the test
|
||||||
# <tpt_proto_key>` on the CLI.
|
# asks the runtime to `enable_transports=[<other_proto>]` while
|
||||||
#
|
# pointing `registry_addrs` at a `reg_addr` of the wrong proto.
|
||||||
# if tpt_proto_key == 'uds':
|
# The layer-2 guard in `open_root_actor` is expected to fail
|
||||||
# breakpoint()
|
# fast with `ValueError` on this mismatch (rather than the prior
|
||||||
|
# silent hang during the registrar handshake).
|
||||||
|
proto_mismatch: bool = (tpt_proto_key != tpt_proto)
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
async with tractor.open_nursery(
|
async with tractor.open_nursery(
|
||||||
|
|
@ -99,4 +102,14 @@ def test_root_passes_tpt_to_sub(
|
||||||
# shudown sub-actor(s)
|
# shudown sub-actor(s)
|
||||||
await an.cancel()
|
await an.cancel()
|
||||||
|
|
||||||
|
if proto_mismatch:
|
||||||
|
# mismatched proto must raise `ValueError` from the
|
||||||
|
# `open_root_actor` runtime guard before any subactor spawn.
|
||||||
|
with pytest.raises(ValueError) as excinfo:
|
||||||
|
trio.run(main)
|
||||||
|
msg: str = str(excinfo.value)
|
||||||
|
assert 'enable_transports' in msg
|
||||||
|
assert 'registry_addrs' in msg
|
||||||
|
assert tpt_proto_key in msg or tpt_proto in msg
|
||||||
|
else:
|
||||||
trio.run(main)
|
trio.run(main)
|
||||||
|
|
|
||||||
|
|
@ -371,6 +371,34 @@ async def open_root_actor(
|
||||||
for uw_addr in uw_reg_addrs
|
for uw_addr in uw_reg_addrs
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# fail-fast on `enable_transports` / `registry_addrs` proto
|
||||||
|
# mismatch — historically this caused a silent indefinite
|
||||||
|
# hang during the registrar handshake (registry was reachable
|
||||||
|
# only via a transport not in `enable_transports`, so the
|
||||||
|
# actor could never connect to register/discover). See
|
||||||
|
# `tests/ipc/test_multi_tpt.py::test_root_passes_tpt_to_sub`
|
||||||
|
# for the foot-gun case + its layer-1 skip-guard.
|
||||||
|
bad_addrs: list[tuple[str, Address]] = [
|
||||||
|
(addr.proto_key, addr)
|
||||||
|
for addr in registry_addrs
|
||||||
|
if addr.proto_key not in enable_transports
|
||||||
|
]
|
||||||
|
if bad_addrs:
|
||||||
|
raise ValueError(
|
||||||
|
f'`registry_addrs` contains addr(s) whose proto is '
|
||||||
|
f'not in `enable_transports`!\n'
|
||||||
|
f'enable_transports: {enable_transports!r}\n'
|
||||||
|
f'mismatched_addrs:\n'
|
||||||
|
+ '\n'.join(
|
||||||
|
f' - proto_key={pk!r} addr={a!r}'
|
||||||
|
for pk, a in bad_addrs
|
||||||
|
)
|
||||||
|
+ '\n\n'
|
||||||
|
f'Either add the missing proto to '
|
||||||
|
f'`enable_transports`, or remove the addr from '
|
||||||
|
f'`registry_addrs`.'
|
||||||
|
)
|
||||||
|
|
||||||
# Debug-mode is currently only supported for backends whose
|
# Debug-mode is currently only supported for backends whose
|
||||||
# subactor root runtime is trio-native (so `tractor.devx.
|
# subactor root runtime is trio-native (so `tractor.devx.
|
||||||
# debug._tty_lock` works). See `_DEBUG_COMPATIBLE_BACKENDS`
|
# debug._tty_lock` works). See `_DEBUG_COMPATIBLE_BACKENDS`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue