Ticketing
Documentação

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)

ComandoCamposSignificado
Grantkey, lease_msAdquire 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
ReleasekeyLibera uma chave
Expirekey, tokenExpiraçã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)

ResultadoSignificado
Granted { token }Aquisição bem-sucedida — o token de fencing emitido
GrantRejectedUm Grant chegou para uma chave já detida (defensivo — nunca acontece no fluxo normal)
ReleasedLiberado
NotFoundA chave a liberar não existia
Expired { existed }Expiração processada — existed diz se ela foi realmente removida
NoopNada 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

Líder
Seguidor 1
Seguidor 2
detecta a expiração do lease pelo seu relógio local
AppendEntries · Expire (key, token)
AppendEntries · Expire (key, token)
OK
commit da maioria → todo nó aplica na mesma ordem
token não bate → ignorado — protege um lock recém-concedido
RPC de consenso (Raft)

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.