Сейчас идёт тестирование: код на GitHub будет открыт после завершения.

T · Таймаут

Структураrefresh

Случай, когда запрос захвата (A) не получил блокировку в пределах wait — сервер отказался без выдачи (это не ошибка).

Обозначение байтов: op — символ ASCII, owner — бинарный (u64, big-endian), key — текст в UTF-8 (переменной длины, N в структуре). Завершающий \n — это 0A. Фиксированный заголовок — бинарное значение и может содержать 0x0A, поэтому его нужно сначала вычитать по количеству байт, и лишь затем искать перевод строки.

owner — это коррелятор: значение, отправленное в запросе и возвращённое без изменений. По нему клиент определяет, ответом на какой запрос является этот кадр (Правила сопоставления ответов).

Поток

Клиент
Сервер
A · acquire (key · wait · lease · owner)
занят → поставлен в очередь
очередь не подошла за wait секунд
T · timeout
удалён из очереди — для повтора нужен новый запрос A
запросответ

К моменту прихода T этот запрос уже удалён из очереди, поэтому запоздалая выдача блокировки невозможна. Токен тоже не выдавался, так что можно сразу повторить запрос без какой-либо дополнительной очистки.