feat(fam-edge): 新增 DiskGuard 磁盘空间守护,剩余空间不足自动清理旧素材
背景:Oracle 磁盘曾经被写满(gdrive_videos 持续下载新素材、旧文件迟迟没 清理),触发 rclone 的一个安全机制——同步遇到 IO 错误就整体拒绝执行删除, 形成"越满越删不掉,越删不掉越满"的死循环,最终连新视频都下载不了。这次 排查+手动清理已经解决了当次故障,但需要一道独立于 rclone 同步之外的兜底, 防止再次悄悄写满没人发现。 - oracle_db.py 新增 get_oldest_purgeable_material():只挑最旧的、已完成 分割阶段(status='done')的整段素材(非 motion_ 前缀),绝不碰运动片段 (事件时间轴/人物头像依赖它)和还在处理中的素材 - disk_guard.py 新增 DiskGuard 后台线程:5 分钟检查一次,剩余空间 <10GB 触发清理,删到 15GB 水位为止(留缓冲避免刚清完又立刻触发),复用已有的 delete_video() 完成实际删除 - app.py 启动这个后台服务;/api/oracle/activity 新增 disk 字段(实时剩余 空间 + 最近一次清理动作),供服务状态页展示 - 新增 9 个单元测试,全部通过(139/139) 已部署 Oracle 验证:DiskGuard 正常启动,配置生效。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -71,6 +71,19 @@ motion_segment:
|
||||
min_duration_sec: 1 # 短于该时长的事件不分割
|
||||
unfinished_grace_sec: 10 # start_time+duration 距当前 ≤ 该秒视为"已结束"容差
|
||||
|
||||
# 磁盘空间守护(2026-08-28 新增):Oracle 磁盘曾经被写满,触发 rclone 遇到
|
||||
# IO 错误就拒绝删除的保护机制,形成"越满越删不掉"的死循环,导致新视频下载
|
||||
# 和运动片段分割全部失败。这里加一道独立于 rclone 同步之外的兜底:不管上游
|
||||
# 同步是否正常,剩余空间跌破 min_free_gb 就主动清理最旧的、已完成分割阶段
|
||||
# 的整段素材(gdrive_videos 里的原始录像,不碰 motion_clips 里的运动片段)。
|
||||
disk_guard:
|
||||
enabled: true
|
||||
check_interval_sec: 300 # 5 分钟检查一次
|
||||
min_free_gb: 10 # 剩余空间低于此值触发清理
|
||||
target_free_gb: 15 # 清理到这个水位就停(留缓冲,避免刚清完又立刻再触发)
|
||||
watch_path: "/opt/fam-edge" # 检查这个路径所在磁盘分区的剩余空间
|
||||
max_delete_per_round: 50 # 单轮最多清理几个文件,防止候选异常多时一次删太多
|
||||
|
||||
# 闭集人物识别(2026-08-22 新增,家里固定 4 人:爷爷/爸爸/媳妇/汤圆):
|
||||
# 原来靠大模型自己编的"人物A/B/C"临时 uid + 文字特征描述跨视频合并,验证下来
|
||||
# 不可靠(用户原话"现在的识别全是错的")。人脸向量方案也验证过,家庭监控这种
|
||||
|
||||
Reference in New Issue
Block a user