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

A · Захвачено

Структураrefresh

Успешный ответ на запрос захвата (A). token — это возрастающий с каждым захватом fencing-токен (u64, big-endian), а owner — значение, отправленное в запросе и возвращённое без изменений: это коррелятор, позволяющий точно определить, ответом на какую попытку захвата является этот кадр (Правила сопоставления ответов).

После op следует 16-байтовый фиксированный заголовок. Эти 16 байт — бинарное значение, которое может содержать 0x0A (\n), поэтому клиент обязан сначала прочитать их по количеству байт, и только потом искать перевод строки.

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

Поток

Клиент
Сервер
A · acquire (key · owner)
ключ свободен → выдан немедленно
A · acquired (token = n · эхо owner)
занят → ожидание освобождения или истечения впереди стоящего в очереди
при наступлении очереди A · acquired (token = n+1)
запросответ

Путей выдачи два, но кадр один и тот же — при немедленной выдаче или после ожидания пришедший A содержит актуальный на этот момент новый fencing-токен, и токен возрастает с каждым захватом. Если во время ожидания превышен wait, вместо этого ответа приходит Таймаут T.