feat(fam-edge): 队列健壮性 - ①失败重试间隔 retry_interval_sec=1h(last_fail_at 记录,配额类故障等恢复再试);②max_retries 2→10;③入队前 OpenCV 文件校验(可解码/大小/元数据,失败标 invalid 不入队)+ mtime 稳定窗口防 rclone 半成品 + 处理前二次确认
This commit is contained in:
@@ -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]:
|
||||
|
||||
Reference in New Issue
Block a user