복제 명령
모든 락 상태 변경은 아래 명령 중 하나로 AppendEntries의 로그 엔트리에 실려 복제되고, 과반 커밋 후 모든 노드가 같은 순서로 적용합니다.
명령 (리더가 제안)
| 명령 | 필드 | 의미 |
|---|---|---|
Grant | key, lease_ms | 키 획득. 토큰은 명령에 없고, 적용 시점에 각 노드의 상태머신이 결정적으로 부여 — 그래서 모든 노드가 같은 토큰을 계산 |
Release | key | 키 반납 |
Expire | key, token | 리더 주도 lease 만료. token이 일치할 때만 제거 — 늦게 도착하거나 중복된 만료가 그 사이 새로 발급된 락을 지우지 못함(멱등) |
적용 결과 (상태머신 → 리더)
| 결과 | 의미 |
|---|---|
Granted { token } | 획득 성공 — 발급된 펜싱 토큰 |
GrantRejected | 이미 보유 중인 키에 Grant가 도착(방어적 — 정상 흐름에서는 발생하지 않음) |
Released | 반납됨 |
NotFound | 반납하려는 키가 없었음 |
Expired { existed } | 만료 처리됨 — existed는 실제로 제거됐는지 |
Noop | 아무 일 없음 |
lease의 남은 시간은 각 노드가 로컬 시계로 추적하지만, 실제 제거는 항상 커밋된 Expire 명령으로만 일어납니다 — 노드 간 시계 차이가 락 상태를 갈라놓지 못하는 이유입니다. 클라이언트가 응답을 받기 전에 사라졌다면(연결 끊김), 리더는 발급 직후 스스로 Release를 제안해 유령 락을 곧바로 정리합니다.
용어
- 상태머신(state machine) — 커밋된 명령을 순서대로 적용해 현재 상태(여기서는 락 테이블)를 만들어 내는 부분. 모든 노드가 같은 명령을 같은 순서로 적용하므로 항상 같은 상태에 도달합니다.
- 커밋(commit) — 과반 노드가 받아 적어 "확정"된 상태. 커밋된 명령만 상태머신에 적용됩니다.
- 멱등(idempotent) — 같은 명령이 실수로 두 번 적용돼도 결과가 달라지지 않는 성질.