From 2a0c8b8192f1e2eef62df81f58f34cc310cd131f Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 31 Oct 2026 16:10:45 +0100 Subject: [PATCH] =?UTF-8?q?fix(satellite):=20Thread-Leck=20im=20mDNS-Scan?= =?UTF-8?q?=20=E2=80=94=20ServiceBrowser=20werden=20beendet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- satellite/satellite.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/satellite/satellite.py b/satellite/satellite.py index ee40f5c..3aba7dd 100644 --- a/satellite/satellite.py +++ b/satellite/satellite.py @@ -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()