fix: send boot/shutdown on first open connection, not blindly first in list

Replace break-after-first-iteration with next(c for c in connections if
c.transport) so the message goes to the first connection that actually
has an open transport. Falls back to connections[0] if none are open
yet (sendto will attempt reopen), avoiding silent message loss when the
leading connection is still connecting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-04 09:59:30 -04:00
parent ca5ef384a8
commit 475319e248
2 changed files with 11 additions and 17 deletions
+5 -6
View File
@@ -1052,9 +1052,8 @@ async def _async_main(args, cfg: Dict[str, Any]) -> int:
if args.message:
bmsg["service"] = "service"
bmsg["msg"] = args.message
for c in connections:
await c.sendto(bmsg)
break
target = next((c for c in connections if c._transport), connections[0])
await target.sendto(bmsg)
if args.message and not args.daemon:
await asyncio.sleep(0.3)
for c in connections:
@@ -1086,12 +1085,12 @@ async def _async_main(args, cfg: Dict[str, Any]) -> int:
pass
log.info("shutting down")
for conn in connections:
target = next((c for c in connections if c._transport), connections[0] if connections else None)
if target:
try:
await conn.sendto({"shutdown": 1, "acks": conn.ackcount})
await target.sendto({"shutdown": 1, "acks": target.ackcount})
except Exception:
pass
break
for conn in connections:
conn.close()
await asyncio.sleep(0.3)