From e2ad2c43b01f0af1ba3a9c25a54c05a1e95d9eb9 Mon Sep 17 00:00:00 2001 From: George Tsiamasiotis Date: Mon, 30 Sep 2024 16:16:09 +0300 Subject: [PATCH] Make manage_recordings into a process subclass --- frigate/app.py | 9 ++----- frigate/record/record.py | 57 ++++++++++++++++------------------------ 2 files changed, 24 insertions(+), 42 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index e4350a259..5ef469e39 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -59,7 +59,7 @@ from frigate.ptz.autotrack import PtzAutoTrackerThread from frigate.ptz.onvif import OnvifController from frigate.record.cleanup import RecordingCleanup from frigate.record.export import migrate_exports -from frigate.record.record import manage_recordings +from frigate.record.record import ManageRecordings from frigate.review.review import manage_review_segments from frigate.stats.emitter import StatsEmitter from frigate.stats.util import stats_init @@ -175,12 +175,7 @@ class FrigateApp: self.processes["go2rtc"] = proc.info["pid"] def init_recording_manager(self) -> None: - recording_process = util.Process( - target=manage_recordings, - name="recording_manager", - args=(self.config,), - daemon=True, - ) + recording_process = ManageRecordings(self.config) self.recording_process = recording_process recording_process.start() self.processes["recording"] = recording_process.pid or 0 diff --git a/frigate/record/record.py b/frigate/record/record.py index 252b80545..385f0b0ca 100644 --- a/frigate/record/record.py +++ b/frigate/record/record.py @@ -1,50 +1,37 @@ """Run recording maintainer and cleanup.""" import logging -import multiprocessing as mp -import signal -import threading -from types import FrameType -from typing import Optional from playhouse.sqliteq import SqliteQueueDatabase -from setproctitle import setproctitle +from frigate import util from frigate.config import FrigateConfig from frigate.models import Recordings, ReviewSegment from frigate.record.maintainer import RecordingMaintainer -from frigate.util.services import listen logger = logging.getLogger(__name__) -def manage_recordings(config: FrigateConfig) -> None: - stop_event = mp.Event() +class ManageRecordings(util.Process): + def __init__(self, config: FrigateConfig): + super().__init__(name="frigate.recording_manager", daemon=True) + self.config = config - def receiveSignal(signalNumber: int, frame: Optional[FrameType]) -> None: - stop_event.set() + def run(self): + db = SqliteQueueDatabase( + self.config.database.path, + pragmas={ + "auto_vacuum": "FULL", # Does not defragment database + "cache_size": -512 * 1000, # 512MB of cache + "synchronous": "NORMAL", # Safe when using WAL https://www.sqlite.org/pragma.html#pragma_synchronous + }, + timeout=max(60, sum(10 for c in self.config.cameras.values() if c.enabled)), + ) + models = [ReviewSegment, Recordings] + db.bind(models) - signal.signal(signal.SIGTERM, receiveSignal) - signal.signal(signal.SIGINT, receiveSignal) - - threading.current_thread().name = "process:recording_manager" - setproctitle("frigate.recording_manager") - listen() - - db = SqliteQueueDatabase( - config.database.path, - pragmas={ - "auto_vacuum": "FULL", # Does not defragment database - "cache_size": -512 * 1000, # 512MB of cache - "synchronous": "NORMAL", # Safe when using WAL https://www.sqlite.org/pragma.html#pragma_synchronous - }, - timeout=max(60, 10 * len([c for c in config.cameras.values() if c.enabled])), - ) - models = [ReviewSegment, Recordings] - db.bind(models) - - maintainer = RecordingMaintainer( - config, - stop_event, - ) - maintainer.start() + maintainer = RecordingMaintainer( + self.config, + self.stop_event, + ) + maintainer.start()