 nyaKazuhaandClaude Fable 5
|
1c4debbaa7
|
fix(cas): 消除 store/gc 之间的引用计数竞态
store() 原来先 ensure_object(建行 ref_count=0)再 add_reference,两条语句
非事务;即使连接池 max_connections=1,两语句间的 await 也会释放连接,让并发
gc() 在 ref_count=0 窗口删掉刚存的对象文件与元数据(静默丢数据),或使 store
返回 ObjectNotFound。
- 新增 store_reference:单条 UPSERT 原子建行为 ref_count=1 或 +1,对象行不再
出现 ref_count=0 的可见窗口;store() 与 repository add_reference() 均改用它。
- 新增 delete_zero_ref_metadata:gc 先原子执行 DELETE ... WHERE ref_count=0,
仅当 rows_affected>0 才删对象文件;被并发递增抢先时跳过,绝不删除仍被引用对象。
元数据先删、文件后删,最坏只留无元数据的孤儿文件(可覆盖,无数据丢失)。
新增单测:store 后不暴露 ref_count=0(gc_candidates 为空)、候选被重新引用后
gc 跳过、store_reference 原子建行/递增、delete_zero_ref_metadata 守卫。
对应 issue #18 维护清单 1-5。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-16 07:39:07 -07:00 |
|