pub struct WalLock { /* private fields */ }Expand description
单写者锁:持锁期间同一份 WAL 只允许这一个写进程存在(fail-closed)。
为什么必须有:闸的账本、nonce 登记、撤销集合都在内存里,WAL 只在启动时
回放一次。两个都已活着的进程共写一份 WAL,各自内存账本只知道自己花了几笔——
实测(本仓 tests/single_writer.rs,修复前)两进程各放行 700 分、委托 cap
1000 分,合计 1400 分:预算硬上限失效,且 WAL 出现两行同一 id 的注册,
下次回放对账必炸。.mcp.json 与 .trae/mcp.json 指向同一份默认 WAL,
两个平台并挂就是真实场景。
机制(零依赖、跨平台):create_new(O_EXCL)原子创建锁文件——两个进程
同时抢,恰好一个成功;内容 = 持锁进程 PID + WAL 路径,供拒启方报错指认。
锁随 Drop for WalLock 释放(正常退出/panic 展开都会走到)。
已知权衡(记录于决策记录):持锁进程被 kill -9 会留下孤儿锁,
下一个进程拒启,按错误信息确认无活进程后手动删除锁文件即可恢复(默认 WAL 在
target/ 下,cargo clean 亦可)。刻意不做「自动判死」:std 没有跨平台进程
存活检查,臆造判活逻辑比让所有者手删一行文件危险得多——审计闸宁可拒启,不可
带病放行。
语义边界:锁只挡写进程,不挡读者——回放/审计读取走只读打开,服务运行
期间照常可用(见 tests/single_writer.rs::replay_works_while_writer_holds_lock)。
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl Freeze for WalLock
impl RefUnwindSafe for WalLock
impl Send for WalLock
impl Sync for WalLock
impl Unpin for WalLock
impl UnsafeUnpin for WalLock
impl UnwindSafe for WalLock
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more