Commit Graph
13 Commits
Author SHA1 Message Date
jon 01f32b1b46 feat: add smart prioritized deletion for rollover storage mode
StorageMaintainer now uses three-tier prioritized deletion when in
continuous_rollover mode instead of naive oldest-first:

1. Overwritable: continuous recordings with no event/review overlap
2. Event retention: recordings tied to active review segments
3. Protected: recordings tied to retain_indefinitely events (last resort)

This ensures event-associated footage is preserved longer than plain
continuous filler when disk space runs low. The default time-based
policy path is completely unchanged.

- Extract _finalize_deleted_recordings() helper to share cleanup logic
- Add camera-scoped review segment overlap checking
- Add 4 new tests covering prioritized deletion scenarios
2026-03-01 22:02:15 -06:00
jon 5ed2e15172 fix: add i18n keys, lazy logging, and improve tests per contributor guide
- Add storage.breakdown.* i18n keys to en/views/system.json locale file
  and remove inline fallback strings from t() calls
- Use lazy logging format (%s) instead of f-string in new debug log line
- Rewrite retain_policy tests to target RecordConfig directly, avoiding
  Docker-only dependencies (labelmap, /config, detector runtimes)
- Add enum value and serialization roundtrip tests
2026-03-01 21:16:05 -06:00
jon 71645b07df test: rewrite retain_policy tests to work outside Docker devcontainer
Test RecordConfig directly instead of FrigateConfig to avoid dependencies
on Docker-only paths (/labelmap.txt, /config) and detector runtimes.
Added enum value and serialization roundtrip tests.
2026-03-01 21:04:10 -06:00
jon 202db2cc0d style: fix ruff formatting in breakdown API endpoint 2026-03-01 16:57:21 -06:00
jon c98885ce20 fix: address second code review findings for rollover storage
- C3: Make retain_policy global-only by hiding from per-camera settings
  UI and removing from CameraConfig TypeScript type
- C4: Add missing units field to StorageBreakdown TypeScript type to
  match API response
- I3: Add 24-hour grace period for deleted camera recordings in rollover
  mode to prevent data loss if camera is temporarily removed from config
- I6: Deduplicate model_validator warning by using module-level flag to
  prevent N+1 duplicate warnings during config propagation
- S5: Add debug log when skipping time-based expiry in rollover mode and
  clean up redundant if/not-if to if/else
2026-03-01 16:46:16 -06:00
jon dad34a71cc fix: address code review findings for rollover storage
- C1: Rewrite breakdown endpoint with JOIN queries (eliminates N+1)
- C2: Use getUnitSize() for consistent MiB/GiB display
- C3: Add retain_policy to global FrigateConfig TypeScript type
- I1: Only fetch breakdown data when rollover mode is active
- I2: Handle NULL end_time for in-progress events/reviews
- I5: Add model_validator warning when rollover + days are both set
- S4: Hide breakdown when total is 0
2026-03-01 16:32:25 -06:00
jon 154246331c feat: add storage breakdown display to metrics page
Shows recording storage split into three categories:
- Continuous (overwritable): footage eligible for rollover
- Events (aging out): recordings tied to active alerts/detections
- Protected (indefinite): recordings marked retain indefinitely
2026-03-01 16:25:29 -06:00
jon 914cc246a6 feat: add retain_policy to recording settings UI
Added retain_policy to field order, retention group, and
restartRequired list in the recording section config.
2026-03-01 16:24:33 -06:00
jon 1b95d02b7e feat: add retain_policy and StorageBreakdown frontend types 2026-03-01 16:22:39 -06:00
jon 02e92c7144 feat: add storage breakdown API endpoint
New GET /recordings/storage/breakdown endpoint returns storage usage
broken into three categories: overwritable (continuous recordings),
event_retention (active alerts/detections), and protected (indefinite).
2026-03-01 16:21:42 -06:00
jon 281e5a91c3 test: verify StorageMaintainer works in rollover mode 2026-03-01 16:20:37 -06:00
jon c9b208a255 Skip time-based recording expiry in continuous_rollover mode
In rollover mode, RecordingCleanup no longer deletes recordings based
on continuous.days / motion.days. Instead, StorageMaintainer handles
overflow by deleting oldest recordings when disk fills up. Deleted
cameras have their recordings removed immediately rather than waiting
for time-based expiry. Review segment expiry still runs normally.
2026-03-01 12:19:33 -06:00
jon aed3793ce1 Add RetainPolicyEnum and retain_policy config field for NVR-style storage
Introduce a new RetainPolicyEnum with 'time' (default, existing behavior)
and 'continuous_rollover' (fill disk, overwrite oldest) options. Add the
retain_policy field to RecordConfig and include unit tests for config
validation.
2026-03-01 12:17:06 -06:00