Comandos replicados
Cada cambio de estado del bloqueo se replica como uno de los comandos siguientes, transportado como entrada de log en AppendEntries, y cada nodo lo aplica en el mismo orden tras un commit de mayoría.
Comandos (propuestos por el líder)
| Comando | Campos | Significado |
|---|---|---|
Grant | key, lease_ms | Adquirir una clave. El token no va en el comando — la máquina de estados de cada nodo lo asigna de forma determinista en el momento de aplicarlo, así que todos los nodos calculan el mismo token |
Release | key | Liberar una clave |
Expire | key, token | Expiración de lease impulsada por el líder. Se elimina solo si token coincide — una expiración tardía o duplicada no puede borrar un bloqueo recién concedido mientras tanto (idempotente) |
Resultados aplicados (máquina de estados → líder)
| Resultado | Significado |
|---|---|
Granted { token } | Adquisición exitosa — el token de fencing emitido |
GrantRejected | Llegó un Grant para una clave ya poseída (defensivo — nunca ocurre en el flujo normal) |
Released | Liberado |
NotFound | La clave a liberar no existía |
Expired { existed } | Expiración procesada — existed indica si realmente se eliminó |
Noop | No ocurrió nada |
Cada nodo lleva el cuenta del tiempo restante de un lease con su propio reloj local, pero la eliminación real solo ocurre a través de un comando Expire confirmado — por eso la diferencia de reloj entre nodos nunca puede dividir el estado del bloqueo. Si un cliente se desconecta antes de recibir su respuesta, el líder propone un Release para sí mismo justo después de conceder el bloqueo, para limpiar de inmediato el bloqueo fantasma.
Flujo — replicando una expiración (Expire)
Incluso la expiración es solo otro comando que pasa por la propuesta del líder → commit de mayoría. Gracias a la verificación de token, aunque la misma clave se hubiera vuelto a conceder mientras un commit se retrasaba, un Expire aplicado tarde no puede borrar el nuevo bloqueo.
Terminología
- Máquina de estados (state machine) — la parte que aplica los comandos confirmados en orden para producir el estado actual (aquí, la tabla de bloqueos). Como todos los nodos aplican los mismos comandos en el mismo orden, siempre convergen en el mismo estado.
- Commit — el estado "final" que alcanza un estado una vez que una mayoría de nodos lo ha registrado. Solo los comandos confirmados se aplican a la máquina de estados.
- Idempotente — una propiedad por la cual aplicar el mismo comando dos veces por error no cambia el resultado.