feat(fam-edge): 队列健壮性 - ①失败重试间隔 retry_interval_sec=1h(last_fail_at 记录,配额类故障等恢复再试);②max_retries 2→10;③入队前 OpenCV 文件校验(可解码/大小/元数据,失败标 invalid 不入队)+ mtime 稳定窗口防 rclone 半成品 + 处理前二次确认

This commit is contained in:
ericwyuan
2026-08-21 14:09:38 +08:00
parent 92ef9fe163
commit 6afdda582b
4 changed files with 131 additions and 11 deletions

View File

@@ -51,6 +51,10 @@ class OracleDB:
event_start_time TEXT,
status TEXT DEFAULT 'pending',
retry_count INTEGER DEFAULT 0,
file_valid INTEGER DEFAULT 1,
file_error TEXT,
media_meta_json TEXT,
last_fail_at TEXT,
summary_json TEXT,
events_json TEXT,
people_json TEXT,
@@ -97,10 +101,17 @@ class OracleDB:
CREATE INDEX IF NOT EXISTS idx_events_video ON events(video_id);
CREATE INDEX IF NOT EXISTS idx_model_calls_created ON model_calls(created_at);
""")
# 兼容旧库:补 retry_count 列(生产-消费队列重试上限用)
# 兼容旧库:补 retry_count / file_valid / media 等列(生产-消费队列用)
cols = [r[1] for r in c.execute("PRAGMA table_info(videos)").fetchall()]
if 'retry_count' not in cols:
c.execute("ALTER TABLE videos ADD COLUMN retry_count INTEGER DEFAULT 0")
for col, ddl in [
('retry_count', "ALTER TABLE videos ADD COLUMN retry_count INTEGER DEFAULT 0"),
('file_valid', "ALTER TABLE videos ADD COLUMN file_valid INTEGER DEFAULT 1"),
('file_error', "ALTER TABLE videos ADD COLUMN file_error TEXT"),
('media_meta_json', "ALTER TABLE videos ADD COLUMN media_meta_json TEXT"),
('last_fail_at', "ALTER TABLE videos ADD COLUMN last_fail_at TEXT"),
]:
if col not in cols:
c.execute(ddl)
self._conn.commit()
# ------------------------------------------------------------------
@@ -128,6 +139,18 @@ class OracleDB:
duration_sec, 1 if success else 0, error or '', now))
self._conn.commit()
def set_video_file_status(self, video_id: int, valid: bool,
error: str = '', media_meta: dict = None):
"""登记/更新文件校验结果valid / file_error / media_meta_json"""
now = _now_iso()
self._conn.execute(
"UPDATE videos SET file_valid=?, file_error=?, media_meta_json=?, "
"updated_at=? WHERE id=?",
(1 if valid else 0, error or '',
json.dumps(media_meta, ensure_ascii=False) if media_meta else None,
now, video_id))
self._conn.commit()
def ensure_video(self, filename: str, local_path: str,
camera_name: str = '', event_start_time: str = '',
duration_sec: float = 0.0, drive_file_id: str = '') -> int:
@@ -183,8 +206,8 @@ class OracleDB:
now = _now_iso()
self._conn.execute(
"UPDATE videos SET status='failed', retry_count=retry_count+1, "
"summary_json=?, updated_at=? WHERE id=?",
(error, now, video_id))
"summary_json=?, updated_at=?, last_fail_at=? WHERE id=?",
(error, now, now, video_id))
self._conn.commit()
def get_all_videos(self) -> List[sqlite3.Row]: