fix(fam-edge): 生产者扫描跳过已被 DiskGuard 清理的文件
生产者列目录之后、读 mtime 之前,DiskGuard 可能刚好把那个文件删了(两个后台线程 的正常竞态),os.path.getmtime 抛 FileNotFoundError。代价不是少处理一个文件,而是 **整轮扫描中断**——排在后面的新素材本轮全都登记不上,要等下一轮。 线上日志:生产者扫描异常: [Errno 2] No such file or directory: /opt/fam-edge/gdrive_videos/20260911PM/Generic_ONVIF-001-20260911-234730-...mp4 (01:30:01 抛出,同一秒 DiskGuard 正在清理那批文件) 改成捕获 OSError 跳过该文件继续扫。新增 tests/test_video_queue.py:被删的跳过且 后面的照常登记、仍在写入的(mtime 太新)依然跳过。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,7 +84,15 @@ class VideoQueue:
|
||||
if row is None:
|
||||
# 新文件:先过 mtime 稳定窗口 + 可解码校验,通过才登记入队;失败标记 invalid
|
||||
if self.file_validate:
|
||||
if time.time() - os.path.getmtime(path) < self.stable_window_sec:
|
||||
try:
|
||||
mtime = os.path.getmtime(path)
|
||||
except OSError:
|
||||
# 列目录之后、读 mtime 之前,DiskGuard 可能刚好把这个文件清掉了
|
||||
# (两个后台线程的正常竞态)。跳过它就行——不 catch 的话整轮扫描
|
||||
# 会被这一个文件中断,后面的新素材本轮都登记不上。
|
||||
logger.info(f"文件已不在(可能刚被 DiskGuard 清理),跳过本轮: {fn}")
|
||||
continue
|
||||
if time.time() - mtime < self.stable_window_sec:
|
||||
logger.info(f"文件仍在写入(mtime 未稳定),跳过本轮: {fn}")
|
||||
continue
|
||||
ok, verr, vmeta = validate_video(path)
|
||||
|
||||
Reference in New Issue
Block a user