B · Занято
Ответ означает, что запрос захвата (A) пришёл, но очередь ожидания этого ключа достигла серверного предела (max_waiters, по умолчанию 16 384), поэтому поставить запрос в очередь не удалось. Блокировка не получена, но сам запрос при этом корректен.
owner — это коррелятор: значение, отправленное в запросе и возвращённое без изменений. По нему точно понятно, какая именно попытка захвата была отклонена (Правила сопоставления ответов).
Обработка на клиенте
Нельзя завершать вызов ошибкой сразу. Пока остаётся бюджет wait, повторяйте попытку с backoff (в официальных клиентах: начиная с 10 мс и удваивая до 200 мс). Как только очередь освободится, следующая попытка встанет в неё штатно. Если переполнение сохраняется до исчерпания wait, только тогда сообщайте вызывающему коду об ошибке «занято».
Повторы нужно отправлять с тем же owner — иначе, если за это время захват всё же состоялся, сервер не распознает попытку как ту же самую.
Обозначение байтов:
op— символ ASCII,owner— бинарный (u64, big-endian),key— текст в UTF-8 (переменной длины,Nв структуре). Завершающий\n— это0A. Фиксированный заголовок — бинарное значение и может содержать0x0A, поэтому его нужно сначала вычитать по количеству байт, и лишь затем искать перевод строки.
Поток
Этот предел — не механизм управления потоком, а защита памяти: он не даёт аутентифицированному клиенту бесконечно наращивать очередь ожидания на одном ключе и исчерпать память сервера. Он выставлен с большим запасом относительно нормального веера запросов, так что в обычной работе этот ответ не встречается. Предел настраивается параметром max_waiters в конфигурации кластера.