From 38cd1999cbf6968ebce49be0df1a695a68982e92 Mon Sep 17 00:00:00 2001 From: kshitij <82637225+kshitijk4poor@users.noreply.github.com> Date: Sat, 8 Aug 2026 00:06:33 +0530 Subject: [PATCH] fix(gateway): fail open + release admission slot when history-lookup worker cannot start --- gateway/platforms/base.py | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index b1473e1350..abe30e0243 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -3529,11 +3529,27 @@ class BasePlatformAdapter(ABC): finally: admission.release() - threading.Thread( - target=_worker, - name="media-history-lookup", - daemon=True, - ).start() + try: + threading.Thread( + target=_worker, + name="media-history-lookup", + daemon=True, + ).start() + except BaseException: + # Thread could not be started (e.g. thread exhaustion). The + # worker never ran, so its finally-release never fires — release + # the admission permit here to avoid leaking it permanently, and + # fail open like every other path in this helper. + admission.release() + logger.warning( + "[%s] Could not start media-delivery history lookup worker " + "for %s; delivering bare local file path(s) without history " + "dedup", + self.name, + session_key, + exc_info=True, + ) + return None try: return await asyncio.wait_for( result_future, @@ -3547,6 +3563,18 @@ class BasePlatformAdapter(ABC): session_key, ) return None + except Exception: + # The worker publishes its own failure via set_exception; this + # helper is documented as best-effort/fail-open, so swallow the + # error here instead of letting it kill media delivery. + logger.warning( + "[%s] Media-delivery history lookup failed for %s; " + "delivering bare local file path(s) without history dedup", + self.name, + session_key, + exc_info=True, + ) + return None @abstractmethod async def connect(self, *, is_reconnect: bool = False) -> bool: