From 3f199e66b824f2648c92bbf144816e2591117b14 Mon Sep 17 00:00:00 2001 From: ryzendigo <48058157+ryzendigo@users.noreply.github.com> Date: Mon, 16 Mar 2026 14:40:30 +0800 Subject: [PATCH] fix: iterator exhausted by debug log prevents event cleanup In both expire_snapshots() and expire_clips(), the expired_events query uses .iterator() for lazy evaluation, but the very next line calls list(expired_events) inside an f-string for debug logging. This consumes the entire iterator, so the subsequent for loop that deletes media files from disk iterates over an exhausted iterator and processes zero events. Snapshots and clips for removed cameras are never deleted from disk, causing gradual disk space exhaustion. Materialize the iterator into a list before logging so both the debug message and the cleanup loop use the same data. --- frigate/events/cleanup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frigate/events/cleanup.py b/frigate/events/cleanup.py index 1ac03b2ed..1b9e1a673 100644 --- a/frigate/events/cleanup.py +++ b/frigate/events/cleanup.py @@ -95,7 +95,8 @@ class EventCleanup(threading.Thread): .namedtuples() .iterator() ) - logger.debug(f"{len(list(expired_events))} events can be expired") + expired_events = list(expired_events) + logger.debug(f"{len(expired_events)} events can be expired") # delete the media from disk for expired in expired_events: @@ -220,7 +221,8 @@ class EventCleanup(threading.Thread): .namedtuples() .iterator() ) - logger.debug(f"{len(list(expired_events))} events can be expired") + expired_events = list(expired_events) + logger.debug(f"{len(expired_events)} events can be expired") # delete the media from disk for expired in expired_events: media_name = f"{expired.camera}-{expired.id}"