Quando o cliente adquire uma chave (A), o servidor responde de uma destas três formas.
| Estado da chave | Ação do servidor | Resposta |
|---|---|---|
| Não registrada | Registra imediatamente (expiração = now + lease), emite token | A + token + key |
| Registrada + expirada | Renova (now + lease), emite novo token | A + token + key |
| Registrada + válida (em uso) | Registra na fila de espera, resposta pendente | A na liberação/expiração, T se exceder wait |
R), a chave é repassada diretamente para quem está na frente da fila — sem nova disputa, ela passa imediatamente com um novo token.lease é uma rede de segurança. Mesmo que o cliente morra ou esqueça de liberar, quando o tempo de lease expira o servidor pode recuperar automaticamente a chave e repassá-la ao próximo da fila. Por isso, independentemente do fluxo normal de liberação, é recomendável sempre configurar o lease com folga, mas em um valor que não prenda o recurso por tempo demais em caso de morte do cliente.wait é o limite máximo de espera para aquisição. Se for 0, a espera é infinita; caso contrário, se a chave não for obtida dentro desse tempo (em segundos), o servidor desiste e responde com T (timeout) — como termina sem grant, não há vazamento de lock.O token presente na resposta A é um u64 monotonicamente crescente daquele grant. A cada aquisição, é emitido um valor maior que qualquer token anterior. Mesmo que ocorra um failover, o nó recém-eleito ativo continua a partir de um valor maior que o maior token replicado (sucessão) — assim, o token continua crescendo em todo o cluster.
Se o recurso que se deseja proteger (conta, arquivo, pedido etc.) apenas validar se "o token que tenho agora é maior que o último token visto", é possível recusar o acesso de um cliente que acordou atrasado — depois da expiração do lease — com um token já invalidado e menor. Graças a isso, a segurança se mantém mesmo que o servidor de lock não seja perfeitamente consistente a cada instante.
Os clientes oficiais compartilham o seguinte comportamento (para a API detalhada por linguagem, veja Bibliotecas).
lease o recuperaria, mas isso permite repassá-lo mais rápido ao próximo interessado).peers é a prioridade de promoção (o primeiro tem a maior prioridade). Entre os nós vivos, o de maior prioridade se torna ativo, e os demais se tornam standbys que replicam esse estado em tempo real.M) para o endereço do ativo e migra para lá.Ctrl+C), o ativo primeiro repassa a promoção ao sucessor (handoff) e só então redireciona os clientes, minimizando o período sem um ativo.Esse esquema de promoção não é baseado em quórum (voto majoritário). Por isso, a quantidade de servidores ser par ou ímpar não importa, e o serviço se mantém enquanto ao menos um estiver vivo.
| Nº de servidores | Sem interrupção | Tolerância a falhas simultâneas | Observação |
|---|---|---|---|
| 1 | ✗ | — | O mais rápido. Ocorre uma breve interrupção ao reiniciar |
| 2 | ✓ | 1 | Configuração mínima para operação sem interrupção. Suficiente na maioria dos casos |
| 3 | ✓ | 2 | Mantém redundância mesmo com um servidor em manutenção |
| 4+ | ✓ | N−1 | Só aumenta o custo de propagação — não recomendado |
Como a promoção baseada em prioridade não é consenso, no instante de uma partição de rede os dois lados podem ficar ativos ao mesmo tempo por um breve período, e, devido à natureza da replicação assíncrona, alguns grants podem ser perdidos no momento do failover. Ou seja, a exclusão mútua não é 100% garantida durante janelas de failover/partição. Se for necessária uma garantia forte, implemente no recurso protegido a validação do token de fencing descrito acima — recusando tokens antigos (menores), a segurança se mantém mesmo que o servidor de lock não seja perfeitamente consistente.