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

Матрица запрос × состояние ключа

A (захват)

Состояние ключаДействие сервераОтветМомент
не зарегистрированрегистрация (expire=now+lease), выдача токенаA+token+owner+keyнемедленно
зарегистрирован + срок истёкобновление (now+lease), новый токенA+token+owner+keyнемедленно
Зарегистрирован + действующий holder + wait=0Не ставить в очередьT+owner+keyСразу
Зарегистрирован + действующий holder + wait>0Поставить в очередь, ждать ответA или T+owner+keyЗахват по release/expiry либо T по окончании wait
Queue или capacity сервера на пределеНе ставить в очередьB+owner+keyСразу
  • Путь освобождения справедлив по FIFO: когда владелец делает R, блокировка передаётся напрямую первому в очереди (без повторной конкуренции, с новым токеном).
  • Только путь истечения не является FIFO.
  • Совпадение owner с текущим holder не даёт особого режима. Это не полномочие вернуть active token или продлить lease; действуют обычные правила занятого key.
  • Ответы могут приходить не по порядку запросов; клиент сопоставляет по echoed owner. R (освобождение)
Состояние ключаДействие сервераОтвет
зарегистрирован + токен совпал, есть ожидающийпрямая передача первому в очереди (новый токен)R+token+key
зарегистрирован + токен совпал, ожидающих нетудаление ключаR+token+key
зарегистрирован + токен не совпалнет действия (блокировка сохраняется)N+token+key
не зарегистрированнет действияN+token+key

Момент обработки истечения

  • Одиночный режим обрабатывает истечение лениво (lazy) — ключ с истёкшим сроком подхватывается на месте следующим захватом (вторая строка таблицы выше), а отдельная очистка с периодом 5 секунд убирает истёкшие ключи без ожидающих. Поэтому освобождение ключа, который истёк, но ещё не был убран, может получить в ответ R, а не N.
  • В cluster mode лидер ждёт следующего срока в token-validating deadline min-heap и commit команду Expire через консенсус до удаления key. Так разница clock не разделяет состояние lock.