요청 × 키 상태 매트릭스
A (획득)
| 키 상태 | 서버 동작 | 응답 | 시점 |
|---|---|---|---|
| 등록 안 됨 | 등록(만료=now+lease), 토큰 발급 | A+token+owner+key | 즉시 |
| 등록됨 + 만료 지남 | 갱신(now+lease), 새 토큰 | A+token+owner+key | 즉시 |
등록됨 + 유효한 보유자 + wait=0 | 대기열에 넣지 않음 | T+owner+key | 즉시 |
등록됨 + 유효한 보유자 + wait>0 | 대기열 등록, 응답 보류 | A 또는 T+owner+key | 반납/만료로 획득되는 순간, 또는 wait 초과 시 T |
| 대기열 또는 서버 capacity가 상한 도달 | 대기열에 넣지 않음 | B+owner+key | 즉시 |
- 반납 경로는 FIFO 공정: 보유자가
R하면 맨 앞 대기자에게 직접 인계(재경쟁 없음, 새 토큰). - 만료 경로만 비FIFO.
owner가 현재 보유자의 값과 같아도 특별 취급하지 않습니다. active token 반환이나 lease 갱신의 권한이 아니며 일반 점유 요청과 같은 규칙을 적용합니다.- 응답은 요청 순서와 다르게 올 수 있으므로 클라이언트는 에코된
owner로 매칭해야 합니다.
R (반납)
| 키 상태 | 서버 동작 | 응답 |
|---|---|---|
| 등록됨 + 토큰 일치, 대기자 있음 | 맨 앞 대기자에게 직접 인계(새 토큰) | R+token+key |
| 등록됨 + 토큰 일치, 대기자 없음 | 키 삭제 | R+token+key |
| 등록됨 + 토큰 불일치 | 없음 (락 유지) | N+token+key |
| 등록 안 됨 | 없음 | N+token+key |
만료 처리 시점
- 싱글 모드는 만료를 게으르게(lazy) 처리합니다 — 만료 지난 키는 다음 획득이 그 자리에서 넘겨받고(위 표 두 번째 행), 별도의 5초 주기 청소가 대기자 없는 만료 키를 정리합니다. 그래서 만료됐지만 아직 청소 전인 키의 반납은
N이 아니라R이 올 수 있습니다. - 클러스터 모드는 리더가 token으로 검증되는 마감 시각 min-heap의 다음 항목까지 대기한 뒤
Expire명령을 합의로 커밋해야 키가 사라집니다 — 노드 간 시계 차이가 락 상태를 갈라놓지 못하게 하기 위해서입니다.
클러스터 모드에서도 위 의미는 동일합니다 — 다만 상태 변경이 과반 합의로 커밋된 뒤에 응답이 나가고, 리더가 아닌 노드는 처리 대신 M(이동) 또는 E no_leader로 안내합니다.