R · Освобождение
Запрос на освобождение блокировки. token — это fencing-токен, полученный при захвате: освобождение происходит только если он совпадает с текущим удерживаемым токеном. Ответ — Освобождено R или Не найдено N.
token — защита от снятия чужой блокировки
Без проверки токена возможна опасная последовательность. Пока запрос на освобождение повторяется через отказ и смену лидера, исходная блокировка может быть забрана по истечении lease и выдана заново другому клиенту — и тогда запоздавшее освобождение снимет блокировку нового владельца. Освобождение только при совпадении токена закрывает этот путь.
Если токен не совпадает, приходит N (не найдено), а блокировка остаётся на месте. Повторы освобождения нужно всегда отправлять с тем же токеном, и сопоставление ответов тоже идёт по эхированному token (Правила сопоставления ответов).
Обозначение байтов:
op— символ ASCII,token— бинарный (u64, big-endian),key— текст в UTF-8 (переменной длины,Nв структуре). Завершающий\n— это0A. Фиксированный заголовок — бинарное значение и может содержать0x0A, поэтому его нужно сначала вычитать по количеству байт, и лишь затем искать перевод строки.
Поток
Если у освобождённого ключа есть ожидающий, он передаётся напрямую первому в очереди без повторной конкуренции — отдельно от R (released), уходящего освободившей стороне, ожидающему приходит A (acquired) с новым токеном.