Dispatcharr/apps/proxy
PFalko 8bd38ad71c Fix stream ownership bugs causing streams to die after 30-200s
Three interrelated bugs cause TS proxy streams to terminate prematurely
in multi-worker uWSGI deployments:

1. Double ProxyServer instantiation: ProxyConfig.ready() in apps/proxy/apps.py
   calls TSProxyServer() directly, bypassing get_instance(). The subsequent
   TSProxyConfig.ready() call to get_instance() creates a second instance.
   Each instance starts its own cleanup thread, but only one holds channel
   data — the orphaned cleanup thread cannot extend ownership.

2. Redis flushdb() on every client init: RedisClient.get_client() in
   core/utils.py calls flushdb() whenever a new connection is created.
   Celery autoscale workers spawning mid-stream nuke all Redis keys
   including ownership, client records, and channel metadata.

3. No recovery from expired ownership: get_channel_owner() has a TOCTOU
   bug (two separate GET calls in a lambda). extend_ownership() silently
   fails when keys expire. Non-owner cleanup unconditionally kills streams
   even when the worker holds the stream_manager.

Fixes:
- Use TSProxyServer.get_instance() in ProxyConfig.ready()
- Remove flushdb() from Redis client initialization
- Use sentinel pattern for gevent-safe singleton (threading.Lock does not
  work with gevent greenlets)
- Single GET in get_channel_owner() to avoid TOCTOU race
- Re-acquire expired ownership keys in extend_ownership()
- Attempt re-acquisition before cleanup in non-owner path

Relates to #992, #980
2026-02-27 16:40:28 +01:00
..
hls_proxy Fixes clients not disconnecting. 2025-03-04 11:08:12 -06:00
management/commands Initial integration. 2025-03-03 18:40:30 -06:00
ts_proxy Fix stream ownership bugs causing streams to die after 30-200s 2026-02-27 16:40:28 +01:00
vod_proxy Fix: VOD proxy connection counter leaks on client disconnect and seeking 2026-02-17 20:24:00 -06:00
__init__.py Initial integration. 2025-03-03 18:40:30 -06:00
apps.py Fix stream ownership bugs causing streams to die after 30-200s 2026-02-27 16:40:28 +01:00
config.py Enhancement: Update TTL settings for client records and implement periodic refresh during active streaming 2025-10-31 11:53:16 -05:00
signals.py Initial integration. 2025-03-03 18:40:30 -06:00
tasks.py Track VOD connections in Redis. 2025-08-05 21:24:41 -05:00
urls.py Track VOD connections in Redis. 2025-08-05 21:24:41 -05:00
views.py Initial integration. 2025-03-03 18:40:30 -06:00