目前正在测试中:完成后将开放 GitHub 代码。

R · 释放 (Release)

结构refresh

锁释放请求。token 是该次获取所得到的 围栏令牌,只有与当前持有的 token 一致时 才会释放。响应为已释放 R未找到 N

token —— 避免释放他人锁的保护机制

如果没有 token 校验,就会出现一个危险的时序:当释放请求正跨越故障转移进行重试时, 原来的锁因 lease 过期被回收并重新授予了另一个客户端,那么迟到的释放就会解开 新持有者的锁。只在 token 一致时才释放,这条路径就被堵住了。

token 不一致时会返回 N(未找到),锁保持不变。释放重试必须始终使用相同的 token, 响应匹配也使用回传的 token(响应匹配规则)。

字节表示法: op 是 ASCII 字符,token 是二进制(u64,大端序),key 是 UTF-8 文本(变长,在结构中以 N 表示)。末尾的 \n0A。固定头部是二进制值,可能 包含 0x0A,因此必须在扫描换行符之前先按字节数消费

流程

持有者 X
服务器
等待者 Y
R · 释放 (key · token)
R · 已释放
若存在等待者 → A · 直接移交 (新 token)
若该 key 不存在或 token 不一致
N · 未找到
请求响应

如果被释放的 key 存在等待者,它会直接移交给队列最前面的等待者,无需重新竞争 ——除了发给释放者的 R(已释放)之外,等待者还会收到携带新 token 的 A(已获取)。