mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-04-24 01:16:47 +02:00
Cleanup batching (#14836)
* Implement batching for event cleanup * remove import * add debug logging
This commit is contained in:
parent
2eb5fbf112
commit
bc371acb3e
@ -21,6 +21,9 @@ class EventCleanupType(str, Enum):
|
|||||||
snapshots = "snapshots"
|
snapshots = "snapshots"
|
||||||
|
|
||||||
|
|
||||||
|
CHUNK_SIZE = 50
|
||||||
|
|
||||||
|
|
||||||
class EventCleanup(threading.Thread):
|
class EventCleanup(threading.Thread):
|
||||||
def __init__(
|
def __init__(
|
||||||
self, config: FrigateConfig, stop_event: MpEvent, db: SqliteVecQueueDatabase
|
self, config: FrigateConfig, stop_event: MpEvent, db: SqliteVecQueueDatabase
|
||||||
@ -107,6 +110,7 @@ class EventCleanup(threading.Thread):
|
|||||||
.namedtuples()
|
.namedtuples()
|
||||||
.iterator()
|
.iterator()
|
||||||
)
|
)
|
||||||
|
logger.debug(f"{len(expired_events)} events can be expired")
|
||||||
# delete the media from disk
|
# delete the media from disk
|
||||||
for expired in expired_events:
|
for expired in expired_events:
|
||||||
media_name = f"{expired.camera}-{expired.id}"
|
media_name = f"{expired.camera}-{expired.id}"
|
||||||
@ -125,13 +129,34 @@ class EventCleanup(threading.Thread):
|
|||||||
logger.warning(f"Unable to delete event images: {e}")
|
logger.warning(f"Unable to delete event images: {e}")
|
||||||
|
|
||||||
# update the clips attribute for the db entry
|
# update the clips attribute for the db entry
|
||||||
update_query = Event.update(update_params).where(
|
query = Event.select(Event.id).where(
|
||||||
Event.camera.not_in(self.camera_keys),
|
Event.camera.not_in(self.camera_keys),
|
||||||
Event.start_time < expire_after,
|
Event.start_time < expire_after,
|
||||||
Event.label == event.label,
|
Event.label == event.label,
|
||||||
Event.retain_indefinitely == False,
|
Event.retain_indefinitely == False,
|
||||||
)
|
)
|
||||||
update_query.execute()
|
|
||||||
|
events_to_update = []
|
||||||
|
|
||||||
|
for batch in query.iterator():
|
||||||
|
events_to_update.extend([event.id for event in batch])
|
||||||
|
if len(events_to_update) >= CHUNK_SIZE:
|
||||||
|
logger.debug(
|
||||||
|
f"Updating {update_params} for {len(events_to_update)} events"
|
||||||
|
)
|
||||||
|
Event.update(update_params).where(
|
||||||
|
Event.id << events_to_update
|
||||||
|
).execute()
|
||||||
|
events_to_update = []
|
||||||
|
|
||||||
|
# Update any remaining events
|
||||||
|
if events_to_update:
|
||||||
|
logger.debug(
|
||||||
|
f"Updating clips/snapshots attribute for {len(events_to_update)} events"
|
||||||
|
)
|
||||||
|
Event.update(update_params).where(
|
||||||
|
Event.id << events_to_update
|
||||||
|
).execute()
|
||||||
|
|
||||||
events_to_update = []
|
events_to_update = []
|
||||||
|
|
||||||
@ -196,7 +221,11 @@ class EventCleanup(threading.Thread):
|
|||||||
logger.warning(f"Unable to delete event images: {e}")
|
logger.warning(f"Unable to delete event images: {e}")
|
||||||
|
|
||||||
# update the clips attribute for the db entry
|
# update the clips attribute for the db entry
|
||||||
Event.update(update_params).where(Event.id << events_to_update).execute()
|
for i in range(0, len(events_to_update), CHUNK_SIZE):
|
||||||
|
batch = events_to_update[i : i + CHUNK_SIZE]
|
||||||
|
logger.debug(f"Updating {update_params} for {len(batch)} events")
|
||||||
|
Event.update(update_params).where(Event.id << batch).execute()
|
||||||
|
|
||||||
return events_to_update
|
return events_to_update
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
@ -222,10 +251,11 @@ class EventCleanup(threading.Thread):
|
|||||||
.iterator()
|
.iterator()
|
||||||
)
|
)
|
||||||
events_to_delete = [e.id for e in events]
|
events_to_delete = [e.id for e in events]
|
||||||
|
logger.debug(f"Found {len(events_to_delete)} events that can be expired")
|
||||||
if len(events_to_delete) > 0:
|
if len(events_to_delete) > 0:
|
||||||
chunk_size = 50
|
for i in range(0, len(events_to_delete), CHUNK_SIZE):
|
||||||
for i in range(0, len(events_to_delete), chunk_size):
|
chunk = events_to_delete[i : i + CHUNK_SIZE]
|
||||||
chunk = events_to_delete[i : i + chunk_size]
|
logger.debug(f"Deleting {len(chunk)} events from the database")
|
||||||
Event.delete().where(Event.id << chunk).execute()
|
Event.delete().where(Event.id << chunk).execute()
|
||||||
|
|
||||||
if self.config.semantic_search.enabled:
|
if self.config.semantic_search.enabled:
|
||||||
|
Loading…
Reference in New Issue
Block a user