目前正在测试中:完成后将开放 GitHub 代码。
请求 × Key 状态矩阵
A(获取)
| Key 状态 | 服务器动作 | 响应 | 时机 |
|---|
| 未注册 | 注册(过期时间 = now+lease),签发 token | A+token+owner+key | 立即 |
| 已注册且已过期 | 续期(now+lease),签发新 token | A+token+owner+key | 立即 |
已注册 + 有效holder + wait=0 | 不入队 | T+owner+key | 立即 |
已注册 + 有效holder + wait>0 | 入队并挂起响应 | A或T+owner+key | release/expiry获取时,或wait到期返回T |
| queue或server capacity达到上限 | 不入队 | B+owner+key | 立即 |
- 释放路径是 FIFO 公平的:当持有者执行
R 时,会直接移交给队列最前面的 等待者(无需重新竞争,签发新 token)。 - 只有过期路径不是 FIFO 的。
- 即使
owner与当前holder相同也不作特殊处理。它无权返回active token或续租,适用普通已占用请求规则。 - 响应顺序可能不同于请求顺序,客户端必须按echo的
owner匹配。 R(释放)
| Key 状态 | 服务器动作 | 响应 |
|---|
| 已注册 + token 一致,存在等待者 | 直接移交给队列最前面的等待者(新 token) | R+token+key |
| 已注册 + token 一致,无等待者 | 删除该 key | R+token+key |
| 已注册 + token 不一致 | 不做任何操作(锁保持不变) | N+token+key |
| 未注册 | 不做任何操作 | N+token+key |
过期何时被处理
- 单机模式采用惰性处理过期 —— 一个已过期的 key 会在下一次获取时被当场 接管(见上表第二行),另外还有一个每 5 秒运行一次的清扫任务,用于清理 没有等待者的过期 key。因此对一个已过期但尚未被清扫的 key 执行释放, 可能会得到
R 而不是 N。 - Cluster模式等待token校验的deadline min-heap下一项到期,然后leader通过共识commit
Expire命令,key才消失。这避免node间clock差导致锁状态分裂。