E · 오류
구조refresh
요청을 처리할 수 없을 때의 응답입니다. key 자리에 대신 사유(reason) 텍스트가 옵니다 — 키는 에코되지 않으므로, 파이프라이닝 중에는 어느 요청이 실패했는지 프레임만으로 특정할 수 없습니다. 그래서 E는 모두 connection-fatal입니다. 서버는 가능하면 E를 보낸 뒤 연결을 닫고, 공식 클라이언트도 E를 받으면 그 session을 폐기합니다. 해당 session에서 이미 한 바이트라도 송신된 acquire는 성공이나 확정 실패로 추정하지 않고 Indeterminate로 끝냅니다.
| reason | 원인 | 연결 |
|---|---|---|
auth_failed | 인증 핸드셰이크 다이제스트 불일치 | 닫힘 |
bad_op | 알 수 없는 op 코드 | 닫힘 |
bad_request | 고정 헤더 미달 (A는 10바이트, R은 8바이트) | 닫힘 |
bad_lease | lease가 0 또는 251..255 | 닫힘 |
bad_key | 키 없음 / 128B 초과 / 스페이스·개행 포함 / UTF-8 아님 | 닫힘 |
line_too_long | LF를 제외한 프레임이 192B 초과 | 닫힘 |
no_leader | (클러스터) 현재 리더를 모름 — 선거 중 | 닫힘 |
not_active | 노드가 종료 중이라 서빙 불가 | 닫힘 |
- 사유는 위 8가지가 전부이며 모두 연결을 닫습니다. raw client는
E를 진단 정보로 사용할 수 있지만, 같은 stream을 재동기화해 계속 사용해서는 안 됩니다. - 공식 클라이언트는 key·시간 범위를 송신 전에 검사하므로
bad_*를 정상 API 결과로 만들지 않습니다. no_leader·not_active는 노드의 일시 상태지만E자체에는 owner/key가 없어 특정 pending 요청과 안전하게 상관할 수 없습니다. 이 session은 폐기하며, 아직 송신되지 않은 요청만 새 연결에서 시도합니다. 이미 송신된 acquire를 자동 재전송하지 않습니다.M·L·no_leader·not_active는 클러스터 모드에서만 나옵니다 — 싱글 서버는 보내지 않습니다.- 대기열 포화는
E가 아니라B(사용 중)로 옵니다 — 키와owner를 에코해 어느 요청이 거절됐는지 특정할 수 있기 때문입니다.
바이트 표기:
op는 ASCII 문자,reason은 ASCII 텍스트(가변, 구조에서N)입니다. 마지막\n은0A.
흐름
클라이언트
서버
잘못된 프레임 (예: 192B 초과)
E · line_too_long
E를 flush한 뒤 연결 닫힘
송신된 acquire는 결과를 추정하지 않고 Indeterminate
요청응답
E는 오류 프레임을 관측할 기회를 주되 stream의 안전한 재사용은 허용하지 않는 종료 응답입니다. 용량 포화처럼 정상적으로 복구 가능한 거부는 owner와 key를 에코하는 B를 사용합니다.