fix(satellite): Thread-Leck im mDNS-Scan — ServiceBrowser werden beendet

Jeder ServiceBrowser ist ein eigener Thread; zc.close() beendet ihn nicht
(zeroconf 0.151.5, lokal nachgestellt: +1 Thread pro Browser und Scan,
mit cancel() keiner). Bei 14 Diensttypen und einem Scan alle 5 Minuten
hatte der Satellit HomeOffice nach ~5 Tagen 18.841 Threads = Thread-Limit
des Containers. Seit 30.10. 12:19 scheiterte jeder Scan mit "[Errno 11]
Resource temporarily unavailable", auf sat_discover kam keine Antwort mehr
(auch die RVS-Verbindung brach zeitweise mit Errno 11 ab).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-31 16:10:45 +01:00
co-authored by Claude Opus 5.5
parent aeabba10de
commit 2a0c8b8192
+11 -1
View File
@@ -469,18 +469,28 @@ def _discover_mdns(timeout: float) -> list[dict]:
pass
zc = None
browsers = []
try:
zc = Zeroconf()
listener = _Listener()
for t in MDNS_TYPES:
try:
ServiceBrowser(zc, t, listener)
browsers.append(ServiceBrowser(zc, t, listener))
except Exception:
pass
time.sleep(timeout)
except Exception as exc:
logger.warning("mDNS-Sweep-Fehler: %s", exc)
finally:
# Jeder ServiceBrowser ist ein eigener Thread, den zc.close() NICHT
# beendet — ohne cancel() blieben pro Scan 14 Threads liegen. Nach
# ~5 Tagen war das Thread-Limit des Containers voll (18.841), danach
# scheiterte jeder Scan mit "[Errno 11] Resource temporarily unavailable".
for b in browsers:
try:
b.cancel()
except Exception:
pass
try:
if zc:
zc.close()