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

요청 × 키 상태 매트릭스

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로 안내합니다.