E · 错误 (Error)
结构refresh
请求无法处理时返回。key的位置改为原因文本(reason)。不会echo key,因此pipeline中仅凭frame无法确定失败的是哪个请求。所以所有E都是connection-fatal。服务器尽可能flush E后关闭连接,官方客户端也丢弃该session。只要acquire已发送一个byte却没有确定响应,就不得推定成功或失败,而应结束为Indeterminate。
| reason | 原因 | 连接 |
|---|---|---|
auth_failed | 认证握手摘要不匹配 | 关闭 |
bad_op | 未知的 op 代码 | 关闭 |
bad_request | 固定header不足(A为10 bytes,R为8 bytes) | 关闭 |
bad_lease | lease为0或251..255 | 关闭 |
bad_key | key 缺失 / 超过 128 字节 / 包含空白或换行 / 非 UTF-8 | 关闭 |
line_too_long | 帧超过 192 字节 | 关闭 |
no_leader | (集群模式)当前 leader 未知 —— 选举正在进行中,请稍后重试 | 关闭 |
not_active | 节点无法提供服务 —— 正在关闭中 | 关闭 |
- 这8种原因是完整列表,全部关闭连接。raw client可用于诊断,但不得重新同步并复用同一stream。
- 官方客户端发送前验证key与时间范围,因此
bad_*不是正常API结果。 no_leader和not_active虽是临时状态,但E没有owner/key,无法安全关联。丢弃session;只有尚未发送的请求可在新连接尝试。不得自动重发已发送的acquire。M、L、no_leader、not_active只出现在cluster mode。- capacity满时使用
B(busy)而非E,因为它echo owner与key。
字节表示法:
op是 ASCII 字符,reason是 ASCII 文本(变长,在结构中以N表示)。末尾的\n为0A。
流程
客户端
服务器
错误frame(如超过192B)
E · line_too_long
flush E后关闭连接
已发送的acquire为Indeterminate
请求响应
E允许观察诊断信息,但不允许安全复用stream。可恢复的capacity拒绝使用echo owner与key的B(busy)。