Comandos Replicados
Toda mudança de estado do lock é replicada como um dos comandos abaixo, carregada como uma entrada de log em AppendEntries, e aplicada por todo nó na mesma ordem após um commit da maioria.
Comandos (propostos pelo líder)
| Comando | Campos | Significado |
|---|---|---|
Grant | key, lease_ms | Adquire uma chave. O token não está no comando — a máquina de estados de cada nó o atribui de forma determinística no momento da aplicação, então todo nó calcula o mesmo token |
Release | key | Libera uma chave |
Expire | key, token | Expiração de lease conduzida pelo líder. Removida apenas se o token corresponder — uma expiração atrasada ou duplicada não consegue apagar um lock recém-concedido nesse meio-tempo (idempotente) |
Resultados aplicados (máquina de estados → líder)
| Resultado | Significado |
|---|---|
Granted { token } | Aquisição bem-sucedida — o token de fencing emitido |
GrantRejected | Um Grant chegou para uma chave já detida (defensivo — nunca acontece no fluxo normal) |
Released | Liberado |
NotFound | A chave a liberar não existia |
Expired { existed } | Expiração processada — existed diz se ela foi realmente removida |
Noop | Nada aconteceu |
Cada nó rastreia o tempo restante de um lease com seu próprio relógio local, mas a remoção real só acontece via um comando Expire confirmado (committed) — por isso a diferença de relógio entre os nós nunca consegue dividir o estado do lock. Se um cliente se desconecta antes de receber sua resposta, o líder propõe um Release para si mesmo logo após a concessão, para limpar o lock fantasma imediatamente.
Fluxo — Replicando um Expire
Até a expiração é apenas mais um comando que passa pela proposta → commit da maioria do líder. Graças à verificação de token, mesmo que a mesma chave tenha sido concedida novamente enquanto um commit estava atrasado, um Expire aplicado tardiamente não consegue apagar o novo lock.
Terminologia
- Máquina de estados — a parte que aplica os comandos confirmados em ordem para produzir o estado atual (aqui, a tabela de locks). Como todo nó aplica os mesmos comandos na mesma ordem, eles sempre convergem para o mesmo estado.
- Commit — o status "final" que um estado alcança quando uma maioria dos nós o registrou. Apenas comandos confirmados são aplicados à máquina de estados.
- Idempotente — uma propriedade em que aplicar o mesmo comando duas vezes por engano não muda o resultado.