Ticketing
Documentación

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)

ComandoCamposSignificado
Grantkey, lease_msAdquirir 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
ReleasekeyLiberar una clave
Expirekey, tokenExpiració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)

ResultadoSignificado
Granted { token }Adquisición exitosa — el token de fencing emitido
GrantRejectedLlegó un Grant para una clave ya poseída (defensivo — nunca ocurre en el flujo normal)
ReleasedLiberado
NotFoundLa clave a liberar no existía
Expired { existed }Expiración procesada — existed indica si realmente se eliminó
NoopNo 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)

Líder
Seguidor 1
Seguidor 2
detecta la expiración de lease con su reloj local
AppendEntries · Expire (key, token)
AppendEntries · Expire (key, token)
OK
commit de mayoría → cada nodo aplica en el mismo orden
token no coincide → se ignora — protege un bloqueo recién concedido
RPC de consenso (Raft)

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.