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

N · Не найдено

Структураrefresh

Случай, когда при запросе освобождения (R) этого ключа не оказалось — либо он есть, но token не совпал с текущим удерживаемым. Это не ошибка, а значение «отсутствовало».

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

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

Поток

Клиент
Сервер
R · release (key · token)
ключа нет или токен не совпал
N · not found
запросответ

Освобождение близко к идемпотентному — если сервер уже забрал ключ по истечении lease, или R отправлен на уже освобождённый ключ, приходит N. То же самое происходит, когда ключ успели выдать заново другому владельцу: токен не совпадает, и его блокировка остаётся нетронутой. Это одна из веток нормального потока, поэтому клиенту не обязательно считать её ошибкой.