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:
@@ -643,3 +643,8 @@ DiskGuard「检查异常」 2837 次 ← 22 倍
|
||||
**测试**:新增 2 个用例(8 线程 × 25 轮并发读写、close 要收掉所有连接)。在旧代码上
|
||||
稳定复现同族错误 `cannot commit transaction - SQL statements in progress`,修复后通过;
|
||||
fam-edge 全套 159 个测试绿。
|
||||
|
||||
**同批修掉的第二个竞态**:生产者列目录之后、读 mtime 之前,DiskGuard 可能刚好把那个
|
||||
文件清掉(两个后台线程的正常竞态),`os.path.getmtime` 抛 FileNotFoundError,代价是
|
||||
**整轮扫描中断**——排在后面的新素材本轮全都登记不上。改成捕获 OSError 跳过该文件,
|
||||
新增 `fam-edge/tests/test_video_queue.py` 两个用例覆盖(被删的跳过 / 仍在写入的照样跳过)。
|
||||
|
||||
Reference in New Issue
Block a user