mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-03 09:45:22 +03:00
Remove total and other inefficencies
This commit is contained in:
parent
71f2bb042b
commit
dfb9d9ce70
@ -27,16 +27,14 @@ class StorageMaintainer(threading.Thread):
|
|||||||
self.name = "recording_cleanup"
|
self.name = "recording_cleanup"
|
||||||
self.config = config
|
self.config = config
|
||||||
self.stop_event = stop_event
|
self.stop_event = stop_event
|
||||||
self.camera_storage_stats: dict[str, dict] = {"total": {}}
|
self.camera_storage_stats: dict[str, dict] = {}
|
||||||
self.avg_segment_sizes: dict[str, dict] = {}
|
self.avg_segment_sizes: dict[str, dict] = {}
|
||||||
|
|
||||||
def calculate_camera_bandwidth(self):
|
def calculate_camera_bandwidth(self):
|
||||||
"""Calculate an average MB/s for each camera."""
|
"""Calculate an average MB/hr for each camera."""
|
||||||
self.camera_storage_stats["total"]["bandwidth"] = 0
|
|
||||||
self.camera_storage_stats["total"]["needs_refresh"] = False
|
|
||||||
|
|
||||||
for camera in self.config.cameras.keys():
|
for camera in self.config.cameras.keys():
|
||||||
# cameras with < 50 segments should be refreshed to keep size accurate
|
# cameras with < 50 segments should be refreshed to keep size accurate
|
||||||
|
# when few segments are available
|
||||||
if self.camera_storage_stats.get(camera, {}).get("needs_refresh", True):
|
if self.camera_storage_stats.get(camera, {}).get("needs_refresh", True):
|
||||||
self.camera_storage_stats[camera] = {
|
self.camera_storage_stats[camera] = {
|
||||||
"needs_refresh": (
|
"needs_refresh": (
|
||||||
@ -47,9 +45,6 @@ class StorageMaintainer(threading.Thread):
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.camera_storage_stats[camera]["needs_refresh"]:
|
|
||||||
self.camera_storage_stats["total"]["needs_refresh"] = True
|
|
||||||
|
|
||||||
# calculate MB/hr
|
# calculate MB/hr
|
||||||
bandwidth = round(
|
bandwidth = round(
|
||||||
Recordings.select(fn.AVG(bandwidth_equation))
|
Recordings.select(fn.AVG(bandwidth_equation))
|
||||||
@ -60,68 +55,20 @@ class StorageMaintainer(threading.Thread):
|
|||||||
2,
|
2,
|
||||||
)
|
)
|
||||||
self.camera_storage_stats[camera]["bandwidth"] = bandwidth
|
self.camera_storage_stats[camera]["bandwidth"] = bandwidth
|
||||||
self.camera_storage_stats["total"]["bandwidth"] += bandwidth
|
|
||||||
logger.debug(f"{camera} has a bandwidth of {bandwidth} MB/hr")
|
logger.debug(f"{camera} has a bandwidth of {bandwidth} MB/hr")
|
||||||
|
|
||||||
logger.debug(
|
|
||||||
f"Total MB/hr is {self.camera_storage_stats['total']['bandwidth']}"
|
|
||||||
)
|
|
||||||
|
|
||||||
def calculate_camera_segment_sizes(self):
|
|
||||||
"""Calculate the size of each cameras recording segments."""
|
|
||||||
total_avg_segment = 0.0
|
|
||||||
total_avg_hour = 0.0
|
|
||||||
|
|
||||||
for camera in self.config.cameras.keys():
|
|
||||||
# get average of non-zero segment sizes to ignore segment with no value
|
|
||||||
segment_query = (
|
|
||||||
Recordings.select(fn.AVG(Recordings.segment_size))
|
|
||||||
.where(Recordings.camera == camera, Recordings.segment_size != 0)
|
|
||||||
.scalar()
|
|
||||||
)
|
|
||||||
|
|
||||||
# camera has no recordings
|
|
||||||
if not segment_query:
|
|
||||||
self.avg_segment_sizes[camera] = {
|
|
||||||
"segment": 0,
|
|
||||||
"segment_duration": 0,
|
|
||||||
"hour": 0,
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
|
|
||||||
avg_segment_size = round(segment_query, 2)
|
|
||||||
|
|
||||||
# get average of an hour using the average segment size
|
|
||||||
segment_duration = int(
|
|
||||||
Recordings.select(Recordings.duration)
|
|
||||||
.where(Recordings.camera == camera)
|
|
||||||
.limit(1)
|
|
||||||
.scalar()
|
|
||||||
)
|
|
||||||
avg_hour_size = round((3600 / segment_duration) * avg_segment_size, 2)
|
|
||||||
|
|
||||||
total_avg_segment += avg_segment_size
|
|
||||||
total_avg_hour += avg_hour_size
|
|
||||||
self.avg_segment_sizes[camera] = {
|
|
||||||
"segment": avg_segment_size,
|
|
||||||
"segment_duration": segment_duration,
|
|
||||||
"hour": avg_hour_size,
|
|
||||||
}
|
|
||||||
|
|
||||||
self.avg_segment_sizes["total"] = {
|
|
||||||
"segment": total_avg_segment,
|
|
||||||
"hour": total_avg_hour,
|
|
||||||
}
|
|
||||||
|
|
||||||
def check_storage_needs_cleanup(self) -> bool:
|
def check_storage_needs_cleanup(self) -> bool:
|
||||||
"""Return if storage needs cleanup."""
|
"""Return if storage needs cleanup."""
|
||||||
# currently runs cleanup if less than 1 hour of space is left
|
# currently runs cleanup if less than 1 hour of space is left
|
||||||
return False
|
# disk_usage should not spin up disks
|
||||||
|
hourly_bandwidth = sum(
|
||||||
|
[b["bandwidth"] for b in self.camera_storage_stats.values()]
|
||||||
|
)
|
||||||
remaining_storage = round(shutil.disk_usage(RECORD_DIR).free / 1000000, 1)
|
remaining_storage = round(shutil.disk_usage(RECORD_DIR).free / 1000000, 1)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"Storage cleanup check: {self.avg_segment_sizes['total']['hour']} hourly with remaining storage: {remaining_storage}"
|
f"Storage cleanup check: {hourly_bandwidth} hourly with remaining storage: {remaining_storage}"
|
||||||
)
|
)
|
||||||
return remaining_storage < self.avg_segment_sizes["total"]["hour"]
|
return remaining_storage < hourly_bandwidth
|
||||||
|
|
||||||
def delete_recording_segments(
|
def delete_recording_segments(
|
||||||
self, recordings, retained_events, segment_count: int
|
self, recordings, retained_events, segment_count: int
|
||||||
@ -260,7 +207,9 @@ class StorageMaintainer(threading.Thread):
|
|||||||
# Check storage consumption every 5 minutes
|
# Check storage consumption every 5 minutes
|
||||||
while not self.stop_event.wait(300):
|
while not self.stop_event.wait(300):
|
||||||
|
|
||||||
if self.camera_storage_stats["total"].get("needs_refresh", True):
|
if not self.camera_storage_stats or False in [
|
||||||
|
r["needs_refresh"] for r in self.camera_storage_stats.values()
|
||||||
|
]:
|
||||||
self.calculate_camera_bandwidth()
|
self.calculate_camera_bandwidth()
|
||||||
logger.debug(f"Default camera bandwidths: {self.camera_storage_stats}")
|
logger.debug(f"Default camera bandwidths: {self.camera_storage_stats}")
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user