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

B · 繁忙 (Busy)

结构refresh

收到Acquire请求A),但key queue或服务器整体的key/waiter/pending/memory admission达到上限,因而未接纳。该请求确定没有获得lock,frame格式本身并无错误。

owner原样echo请求值作为correlator,可准确识别被拒绝的acquire(见响应匹配规则)。

客户端处理

官方客户端立即把关联的B作为Busy/Capacity错误返回caller,不在内部自动重发同一逻辑acquire。caller若重试,应设定应用整体deadline与backoff,并显式开始使用新owner的新acquire

实际观察到B可确定未获取,因此单独的新call是安全的。不得把未收到响应的发送推定为B;其结果是Indeterminate

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

流程

客户端
服务器
A · 获取 (key · owner)
该 key 的等待队列已达到 max_waiters
B · 繁忙 (回传 owner)
返回Busy——caller决定是否发起新的逻辑acquire
A · 新acquire(可选重试)
有容量时A · acquired (token)
请求响应

这些上限是memory guardrail:在daemon OOM前拒绝新acquire,同时为exact-token release、已批准response、cleanup与Raft recovery保留资源。详细原因通过server metric/log中的key_busyper_key_limitglobal_overload等区分,而不放在wire中。