Les entiers sont en big-endian. ·· ne fait que marquer les frontières d'octets, ce ne sont pas de vrais octets.
# Acquisition immédiate (wait=5s, lease=30s), key="order-1234"
client → 'A' 00·05 00·1E "order-1234" \n
serveur → 'A' 00·00·00·00·00·00·00·01 "order-1234" \n (token 1)
# Attente en cas de possession (autre connexion, wait=1s)
client2 → 'A' 00·01 00·1E "order-1234" \n
... en attente ...
# (a) Si le titulaire libère, transfert immédiat
client → 'R' "order-1234" \n
serveur → 'R' "order-1234" \n (client: libéré)
serveur → 'A' 00·00·00·00·00·00·00·02 "order-1234" \n (client2: transféré, token plus grand)
# (b) Si pas reçu dans wait(1s)
serveur → 'T' "order-1234" \n (client2: timeout — pas de grant)
# Libération de clé inexistante / requête incorrecte
client → 'R' "ghost" \n → serveur 'N' "ghost" \n
client → 'Z' ... → serveur 'E' "bad_op" \nLe protocole étant binaire, on peut aussi le vérifier rapidement avec nc.
# Acquisition: key=order-1, wait=5s(00 05), lease=30s(00 1e)
printf 'A\x00\x05\x00\x1eorder-1\n' | nc -w1 127.0.0.1 5225 | xxd
# → 41 0000000000000001 6f72646572... ('A' + token=1 + "order-1")
printf 'Rorder-1\n' | nc -w1 127.0.0.1 5225 | xxd # → 52 ... ('R' + "order-1")
printf 'Zx\n' | nc -w1 127.0.0.1 5225 # → Ebad_opLe protocole de réplication de cluster entre serveurs est traité dans Protocole (cluster).