Actualmente en pruebas: el código de GitHub se abrirá al finalizar.

Matriz de solicitud × estado de clave

A (Adquirir)

Estado de la claveAcción del servidorRespuestaMomento
No registradaRegistrar (expiración = ahora+lease), emitir tokenA+token+owner+keyInmediatamente
Registrada + expiradaRenovar (ahora+lease), nuevo tokenA+token+owner+keyInmediatamente
Registrada + holder válido + wait=0No encolarT+owner+keyInmediato
Registrada + holder válido + wait>0Encolar, respuesta pendienteA o T+owner+keyAl adquirir por release/expiry, o T al vencer wait
Cola o capacidad del servidor al límiteNo encolarB+owner+keyInmediato
  • La ruta de liberación es justa por FIFO: cuando el poseedor hace R, se entrega directamente al esperador que está al frente de la cola (sin volver a competir, con un nuevo token).
  • Solo la ruta de expiración no es FIFO.
  • Un owner igual al holder actual no recibe trato especial. No autoriza devolver un active token ni renovar el lease; se aplican las reglas normales de una key retenida.
  • Las respuestas pueden llegar fuera de orden; el cliente las empareja por el owner repetido. R (Liberar)
Estado de la claveAcción del servidorRespuesta
Registrada + token coincide, con esperadoresEntregar directamente al esperador que está al frente (nuevo token)R+token+key
Registrada + token coincide, sin esperadoresEliminar la claveR+token+key
Registrada + token no coincideNada (el bloqueo se mantiene)N+token+key
No registradaNadaN+token+key

Cuándo se procesa la expiración

  • El modo único procesa la expiración de forma perezosa (lazy) — una clave que ya expiró es reutilizada en el sitio por la siguiente adquisición (la segunda fila de arriba), y una limpieza separada cada 5 segundos elimina las claves expiradas sin esperadores. Por eso, liberar una clave que ya expiró pero aún no se ha limpiado puede devolver R en lugar de N.
  • En modo cluster, el líder espera la siguiente entrada de un deadline min-heap que valida token y hace commit por consenso del comando Expire antes de eliminar la key. Así las diferencias de clock no dividen el estado del bloqueo.