Atualmente em testes: o código do GitHub será aberto quando concluído.

R · Liberação

Estruturarefresh

Uma requisição de liberação de lock. token é o token de fencing recebido naquela aquisição, e a liberação só acontece se ele conferir com o token atualmente detido. A resposta é Liberado R ou Não Encontrado N.

token — o mecanismo que impede liberar o lock alheio

Sem a verificação do token surge uma sequência perigosa. Enquanto uma requisição de liberação é retentada através de um failover, o lock original pode ser recuperado pela expiração do lease e concedido novamente a outro cliente — e então a liberação atrasada acabaria soltando o lock desse novo detentor. Liberar apenas quando o token confere bloqueia esse caminho.

Se o token for diferente, chega N (não encontrado) e o lock permanece intacto. As novas tentativas de liberação devem sempre ser enviadas com o mesmo token, e a correspondência de resposta também usa o token ecoado (Regras de Correspondência de Resposta).

Notação de bytes: op é um caractere ASCII, token é binário (u64, big-endian), e key é texto UTF-8 (comprimento variável, mostrado como N na estrutura). O \n final é 0A. O cabeçalho fixo é um valor binário e pode conter 0x0A, então precisa ser consumido primeiro pela contagem de bytes, antes de procurar a nova linha.

Fluxo

Detentor X
Servidor
Espera Y
R · liberação (key · token)
R · liberado
se houver alguém na fila → A · repasse direto (novo token)
se a chave não existia ou o token não confere
N · não encontrado
requisiçãoresposta

Se houver alguém esperando pela chave liberada, ela é repassada diretamente para o início da fila, sem nova disputa — separadamente do R (liberado) enviado a quem liberou, quem esperava recebe um A (concedido) com um novo token.