From 4582cfbbca963fc9aa626889f944c6c5b619430e Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sat, 20 Dec 2025 17:11:51 -0700 Subject: [PATCH] Ensure object descriptions get claened up --- .../post/object_descriptions.py | 18 +++++++++++++++--- frigate/embeddings/maintainer.py | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frigate/data_processing/post/object_descriptions.py b/frigate/data_processing/post/object_descriptions.py index 1f4608bc3..7bd38bfa8 100644 --- a/frigate/data_processing/post/object_descriptions.py +++ b/frigate/data_processing/post/object_descriptions.py @@ -131,6 +131,8 @@ class ObjectDescriptionProcessor(PostProcessorApi): ) ): self._process_genai_description(event, camera_config, thumbnail) + else: + self.cleanup_event(event.id) def __regenerate_description(self, event_id: str, source: str, force: bool) -> None: """Regenerate the description for an event.""" @@ -204,6 +206,17 @@ class ObjectDescriptionProcessor(PostProcessorApi): ) return None + def cleanup_event(self, event_id: str) -> None: + """Clean up tracked event data to prevent memory leaks. + + This should be called when an event ends, regardless of whether + genai processing is triggered. + """ + if event_id in self.tracked_events: + del self.tracked_events[event_id] + if event_id in self.early_request_sent: + del self.early_request_sent[event_id] + def _read_and_crop_snapshot(self, event: Event) -> bytes | None: """Read, decode, and crop the snapshot image.""" @@ -299,9 +312,8 @@ class ObjectDescriptionProcessor(PostProcessorApi): ), ).start() - # Delete tracked events based on the event_id - if event.id in self.tracked_events: - del self.tracked_events[event.id] + # Clean up tracked events and early request state + self.cleanup_event(event.id) def _genai_embed_description(self, event: Event, thumbnails: list[bytes]) -> None: """Embed the description for an event.""" diff --git a/frigate/embeddings/maintainer.py b/frigate/embeddings/maintainer.py index 78a251c42..21d6a5634 100644 --- a/frigate/embeddings/maintainer.py +++ b/frigate/embeddings/maintainer.py @@ -522,6 +522,8 @@ class EmbeddingMaintainer(threading.Thread): ) elif isinstance(processor, ObjectDescriptionProcessor): if not updated_db: + # Still need to cleanup tracked events even if not processing + processor.cleanup_event(event_id) continue processor.process_data(