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

R · Освобождение

Структураrefresh

Запрос на освобождение блокировки. token — это fencing-токен, полученный при захвате: освобождение происходит только если он совпадает с текущим удерживаемым токеном. Ответ — Освобождено R или Не найдено N.

token — защита от снятия чужой блокировки

Без проверки токена возможна опасная последовательность. Пока запрос на освобождение повторяется через отказ и смену лидера, исходная блокировка может быть забрана по истечении lease и выдана заново другому клиенту — и тогда запоздавшее освобождение снимет блокировку нового владельца. Освобождение только при совпадении токена закрывает этот путь.

Если токен не совпадает, приходит N (не найдено), а блокировка остаётся на месте. Повторы освобождения нужно всегда отправлять с тем же токеном, и сопоставление ответов тоже идёт по эхированному token (Правила сопоставления ответов).

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

Поток

Владелец X
Сервер
Ожидающий Y
R · release (key · token)
R · released
если есть ожидающий — A · прямая передача (новый token)
если ключа не было или токен не совпал
N · not found
запросответ

Если у освобождённого ключа есть ожидающий, он передаётся напрямую первому в очереди без повторной конкуренции — отдельно от R (released), уходящего освободившей стороне, ожидающему приходит A (acquired) с новым токеном.