diff --git a/frigate/app.py b/frigate/app.py index d1d982269..89f3e2221 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -293,6 +293,7 @@ class FrigateApp: name="recording_manager", args=( self.config, + self.inter_process_queue, self.object_recordings_info_queue, self.audio_recordings_info_queue, self.feature_metrics, diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index f2fe40c5d..56a2c5c9b 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -5,6 +5,8 @@ from abc import ABC, abstractmethod from typing import Any, Callable from frigate.config import FrigateConfig +from frigate.const import INSERT_MANY_RECORDINGS +from frigate.models import Recordings from frigate.ptz.onvif import OnvifCommandEnum, OnvifController from frigate.types import CameraMetricsTypes, FeatureMetricsTypes, PTZMetricsTypes from frigate.util.services import restart_frigate @@ -86,6 +88,8 @@ class Dispatcher: return elif topic == "restart": restart_frigate() + elif topic == INSERT_MANY_RECORDINGS: + Recordings.insert_many(payload).execute() else: self.publish(topic, payload, retain=False) diff --git a/frigate/const.py b/frigate/const.py index 4dec7f366..c6912471b 100644 --- a/frigate/const.py +++ b/frigate/const.py @@ -47,3 +47,7 @@ DRIVER_INTEL_iHD = "iHD" MAX_SEGMENT_DURATION = 600 MAX_PLAYLIST_SECONDS = 7200 # support 2 hour segments for a single playlist to account for cameras with inconsistent segment times + +# Internal Comms Topics + +INSERT_MANY_RECORDINGS = "insert_many_recordings" diff --git a/frigate/record/maintainer.py b/frigate/record/maintainer.py index 8f89c0c08..8c2cb994b 100644 --- a/frigate/record/maintainer.py +++ b/frigate/record/maintainer.py @@ -18,7 +18,7 @@ import numpy as np import psutil from frigate.config import FrigateConfig, RetainModeEnum -from frigate.const import CACHE_DIR, MAX_SEGMENT_DURATION, RECORD_DIR +from frigate.const import CACHE_DIR, INSERT_MANY_RECORDINGS, MAX_SEGMENT_DURATION, RECORD_DIR from frigate.models import Event, Recordings from frigate.types import FeatureMetricsTypes from frigate.util.image import area @@ -50,6 +50,7 @@ class RecordingMaintainer(threading.Thread): def __init__( self, config: FrigateConfig, + inter_process_queue: mp.Queue, object_recordings_info_queue: mp.Queue, audio_recordings_info_queue: Optional[mp.Queue], process_info: dict[str, FeatureMetricsTypes], @@ -58,6 +59,7 @@ class RecordingMaintainer(threading.Thread): threading.Thread.__init__(self) self.name = "recording_maintainer" self.config = config + self.inter_process_queue = inter_process_queue self.object_recordings_info_queue = object_recordings_info_queue self.audio_recordings_info_queue = audio_recordings_info_queue self.process_info = process_info @@ -160,9 +162,9 @@ class RecordingMaintainer(threading.Thread): ) recordings_to_insert: list[Optional[Recordings]] = await asyncio.gather(*tasks) - Recordings.insert_many( - [r for r in recordings_to_insert if r is not None] - ).execute() + + # fire and forget recordings entries + self.inter_process_queue.put((INSERT_MANY_RECORDINGS, [r for r in recordings_to_insert if r is not None])) async def validate_and_move_segment( self, camera: str, events: Event, recording: dict[str, any] diff --git a/frigate/record/record.py b/frigate/record/record.py index 8fc2ed2b0..ca4400e57 100644 --- a/frigate/record/record.py +++ b/frigate/record/record.py @@ -21,6 +21,7 @@ logger = logging.getLogger(__name__) def manage_recordings( config: FrigateConfig, + inter_process_queue: mp.Queue, object_recordings_info_queue: mp.Queue, audio_recordings_info_queue: mp.Queue, process_info: dict[str, FeatureMetricsTypes], @@ -51,6 +52,7 @@ def manage_recordings( maintainer = RecordingMaintainer( config, + inter_process_queue, object_recordings_info_queue, audio_recordings_info_queue, process_info,