현재 테스트 중입니다: 완료되면 GitHub 코드를 오픈할 예정입니다.

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_leaselease0 또는 251..255닫힘
bad_key키 없음 / 128B 초과 / 스페이스·개행 포함 / UTF-8 아님닫힘
line_too_longLF를 제외한 프레임이 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)입니다. 마지막 \n0A.

흐름

클라이언트
서버
잘못된 프레임 (예: 192B 초과)
E · line_too_long
E를 flush한 뒤 연결 닫힘
송신된 acquire는 결과를 추정하지 않고 Indeterminate
요청응답

E는 오류 프레임을 관측할 기회를 주되 stream의 안전한 재사용은 허용하지 않는 종료 응답입니다. 용량 포화처럼 정상적으로 복구 가능한 거부는 owner와 key를 에코하는 B를 사용합니다.