Перейти к содержимому
ColliePWA

07/Documentation

Устранение неполадок с durable agent

Durable agent не отображается или сообщает Unreachable: первые проверки, все причины и способы их устранения, строки doctor и возможные ситуации

Экспериментальная. Сетевой протокол, SDK и эта страница могут измениться, либо функциональность может быть удалена в следующем минорном релизе. В Durable agents описано, от чего зависит её сохранение.

Если durable agent не появляется, отображает Unreachable или не реагирует на нажатие: три команды помогут найти причину, а таблица причин и список неполадок содержат решения. Документ Устранение неполадок посвящён Collie в целом.

Первичная проверка

Выполните эти три команды в указанном порядке:

collie durable list
collie doctor
collie logs
командачто отображается для durable agent
collie durable listПо одной строке на каждую запись в sources.json с состоянием, которое отдаёт работающий мост: loaded, not loaded (restart to apply), refused (<status>) или bridge not answering. Состояние loaded означает, что мост загрузил запись. Это не означает, что durable agent отвечает. Значение not loaded также отображается, когда мост возвращает HTTP 400 для этого имени
collie doctorОпрашивает сам durable agent. Выводит строки Строки doctor для durable agents и сообщает имя непройденной проверки вместе со способом исправления
collie logsСтрока запуска каждого durable agent, [bridge] program "desk": durable, private socket /run/user/1000/desk/app.sock, а также причина, если параметр нарушает правило. Некорректный sources.json выводит [bridge] FATAL:. Сбой чтения выводит [state] poll failed, marking disconnected: <reason> один раз за инцидент. Строки, начинающиеся с [durable], сообщают о несовместимости версий, устаревшем ведущем узле (lead), пропущенных элементах и удалённом журнале

Телефон выводит меньше информации. В строке durable agent отображается Starting или Unreachable без указания причин. Отказ из-за версии сетевого протокола имеет отдельный статус Version mismatch и блок с предупреждением на главной странице durable agent. Отклонённый токен имеет свои формулировки в панели подключения. Документы collie doctor и collie logs содержат все остальные причины.

Таблица причин

Когда Collie не удаётся связаться с durable-агентом, остальная часть Collie всё равно запускается, а durable-агент отображается как недоступный с указанием причины.

В причине указывается переменная окружения, даже если durable-агент задан записью в sources.json. Считайте COLLIE_DURABLE_SOCKET полем socket этой записи, COLLIE_DURABLE_URL — её полем url, а COLLIE_DURABLE_TOKEN — её полем token. Исправление для записи вносится в sources.json. Исправление для формы только с durable вносится в .env, затем в collie restart.

Параметр нарушает правило

Collie сообщает об этом, не пытаясь подключиться к durable-агенту. Правила, заданные в записях sources.json, также отклоняются при запуске моста (Опечатка в sources.json).

причиначто это значит и как исправить
COLLIE_DURABLE_SOCKET is not setВ форме только с durable не указан путь к сокету. Задайте его или укажите URL с токеном
COLLIE_DURABLE_SOCKET must be an absolute pathУкажите полный путь, начинающийся с /
COLLIE_DURABLE_SOCKET is longer than 103 bytesСократите путь. Он должен быть короче $XDG_RUNTIME_DIR
the private socket transport is not available on Windows; set COLLIE_DURABLE_URL and COLLIE_DURABLE_TOKEN insteadВ Windows нет транспорта через сокеты. Используйте URL и токен
COLLIE_DURABLE_SOCKET and COLLIE_DURABLE_URL are both set; set the socket, or the URL with its token, not bothВ форме только с durable переданы оба варианта. Оставьте один транспорт
COLLIE_DURABLE_URL is set without COLLIE_DURABLE_TOKEN; the durable agent refuses a caller with no tokenВ форме только с durable передан URL без токена. Задайте токен
COLLIE_DURABLE_TOKEN is set without COLLIE_DURABLE_URL; a token is only sent to a URLВ форме только с durable передан токен без URL. Задайте URL или удалите токен
COLLIE_DURABLE_URL is longer than 2048 bytesСократите URL до базового адреса durable-агента
COLLIE_DURABLE_URL is not a URLЗапишите в виде https://host
COLLIE_DURABLE_URL must start with https://Любая схема, кроме https://, отклоняется. Для обычного http:// ниже есть отдельная строка
COLLIE_DURABLE_URL uses plain http to <host>, so the token would cross the network unencrypted; use https://, or http://127.0.0.1:<port> for wrangler devИспользуйте https://. Обычный http предназначен для 127.0.0.1 или localhost с портом
COLLIE_DURABLE_URL uses plain http on loopback without a port; name the port, for example http://127.0.0.1:8801Добавьте порт
COLLIE_DURABLE_URL must not carry a user name or password; the token goes in COLLIE_DURABLE_TOKENУдалите имя пользователя и пароль из URL
COLLIE_DURABLE_URL must not carry a query or a fragmentУдалите части ? и # из URL
COLLIE_DURABLE_URL names the durable agent's base only; leave out /session/v1, the adapter adds itУдалите /session/v1 из пути
COLLIE_DURABLE_TOKEN is <n> bytes; it must be at least 32 bytes, for example 64 hex characters from openssl rand -hex 32Сделайте токен длиннее и передайте durable-агенту такой же токен
COLLIE_DURABLE_TOKEN must be printable ASCII with no spacesУдалите пробелы и другие символы из токена
COLLIE_DURABLE_TOKEN is longer than 4096 bytesЗаголовок такой длины является ошибкой. Используйте более короткий токен

Durable-агент не отвечает или отвечает с ошибкой

причиначто это значит и как исправить
no socket at <path>По указанному пути ничего нет. Запустите durable-агент или исправьте путь
cannot check <path>: <message>Collie не удалось прочитать путь. Сделайте его доступным для чтения вашему пользователю
socket-not-private: <check>Обход пути завершился с ошибкой, а текст после двоеточия указывает на проблемную часть. Стандартные варианты перечислены в Проверка конфиденциальности не пройдена
connection refusedНикто не слушает. Аварийно завершившийся durable agent может оставить файл сокета: Устаревший файл сокета. По https по этому URL никто не отвечает
no answer within <n>msDurable agent завис или ещё не прогрет. Collie ждёт 1000 мс на сокете и 5000 мс по https
tls refused: <message>Сертификат URL отклонён. В Collie нет флага для пропуска этой проверки
the host name does not resolveИмя хоста в URL указано неверно, либо ваша сеть не может до него добраться
token-refused: the durable agent answered 401 или 403Durable agent отклонил токен. Durable agent отклонил токен
too-largeDurable agent вернул больше данных, чем читает Collie: 16 КиБ для hello, 4 МиБ для снимка состояния. Уменьшите размер его ответа
incompatible: the durable agent speaks 2..3, this Collie speaks 1..1Диапазоны версий не пересекаются. Обновите более старую сторону. collie doctor показывает оба диапазона, а в лог выводится по строке на каждый
incompatible: not a durable agentПо этому пути или URL отвечает что-то другое. Направьте запись на durable agent
incompatible: the durable agent asks for a tokenDurable agent на сокете запрашивает токен, но сокет никогда его не передаёт. Обновите более старую сторону или обращайтесь по URL с токеном
unreadable hello: <detail> или unreadable snapshot: <detail>Durable agent отправил документ, недопустимый для этого протокола. Проверьте собственный лог durable agent
the durable agent answered <status> или the durable agent answered 409 <code>Durable agent вернул статус, который не используется протоколом в этом контексте. Проверьте собственный лог durable agent
startingDurable agent работает и сообщает, что не готов, либо возвращает 503. Collie повторит запрос при следующем опросе

Строки doctor для durable agents

collie doctor отправляет каждому durable agent те же запросы, что и мост, и в том же порядке. Отправляется только hello.

Каждая запись в sources.json получает один блок из шести строк, обозначенный как durable-socket:desk для durable agent с именем desk. Строка sources перед блоками проверяет файл, а после них идёт одна строка durable-lead. Collie, работающий только в режиме durable, выводит те же шесть строк без суффикса, а его строка mux содержит durable, see the durable-* lines.

строказелёныйпредупреждение или красный
sources2 durable agents in <path>, mode 0600Красный, если файл не удаётся распарсить. В способе исправления указано, что мост не запустится при наличии ошибок. Красный, если файл доступен для чтения группе или остальным (исправление: chmod 600), так как запись может содержать токен
durable-envtransport: private socket с путём, либо transport: https with a bearer tokenКрасный, если параметр нарушает правило из таблица причин
durable-socketПуть указывает на ваш сокет с правами 0600 в принадлежащей вам папке с правами 0700, без символических ссылок в путиКрасный, при этом в строке указана непрошедшая проверка: ничего нет, недоступно для чтения, не является сокетом, символическая ссылка, не папка, папка другого владельца, папка с неверными правами, родительская папка доступна на запись остальным, сокет другого владельца или сокет с открытыми правами. Пропускается для durable agent за https
durable-urlАдрес (https или локальный http) и его длина в байтахКрасный, если URL нарушает правило. Пропускается для сокета
durable-tokenset, <n> bytes. Collie никогда не выводит это значениеКрасный, если токен нарушает правило. Пропускается для сокета
durable-helloDurable agent ответил. Оба диапазона и согласованная ими версияКрасный с указанием причины: токен отклонён, нет ответа, ответило что-то отличное от durable agent, durable agent запрашивает токен через сокет, нечитаемый hello или непересекающиеся диапазоны. При несовпадении диапазонов выводятся оба диапазона
durable-readyready, имя хоста durable agent и его эпохаПредупреждение, когда durable agent сообщает, что ещё не готов
durable-leadЛид достаточно новый, чтобы показать карточку с вопросомСм. В составе crew

Строка с ошибкой останавливает следующие за ней строки. Они выводятся как пропущенные с причиной fix the row above first, так как Collie никогда не обращается к durable agent через сокет, не прошедший проверку приватности, или с токеном, нарушающим его правило. Пропущенная строка не является сбоем.

Случаи

Для каждого случая указано то, что вы видите, причина и решение.

Опечатка в sources.json

Collie недоступен полностью, а не только один durable agent: телефон не может подключиться. collie logs заканчивается на [bridge] FATAL:, путь к файлу, запись и поле.

Мост считывает sources.json при запуске и останавливается при обнаружении неизвестного поля, kind, отличного от durable, имени, нарушающего правило, повторяющегося имени, socket и url вместе, отсутствия обоих, url без token или token с socket. Исправьте файл, затем выполните collie restart. collie doctor показывает то же сообщение в строке sources.

Если мост не может определить имя записи (это не объект, есть неизвестное поле или имя нарушает правило), он считает с 0 и выводит entry 1 для второй записи. collie durable attach считает с 1 и выводит entry 2 для той же записи. В обоих случаях указывается поле. Как только имя станет корректным, мост выводит имя: entry "desk".

attach и detach отказываются записывать файл, который не могут прочитать, поэтому опечатка не повредит остальным записям. Они завершают работу с кодом возврата 1.

Durable agent не появляется после attach

Вы не видите durable agent на телефоне, а collie durable list выводит not loaded (restart to apply).

attach и detach только записывают sources.json. Мост считывает его при запуске. Выполните collie restart или добавьте --restart к команде в следующий раз. Если not loaded сохраняется после перезапуска, проверьте collie logs: list формулирует HTTP 400 от моста так же, как 404.

Проверка конфиденциальности не пройдена

Вы видите socket-not-private: the socket's folder /tmp/hello has mode 0755, not 0700, и строка doctor durable-socket выделена красным.

Collie подключается к сокету только в том случае, если весь путь приватный. Обычные причины: каталог с правами 0755, сокет прямо в /tmp или другом общем каталоге, а также символическая ссылка в пути. Символическую ссылку легко не заметить: на многих хостах Linux /var/run указывает на /run, поэтому путь, начинающийся с /var/run/, завершается ошибкой /var/run is a symlink. Используйте реальный путь.

Выполните chmod 700 для каталога самого сокета или переместите сокет в $XDG_RUNTIME_DIR. Правила приведены в Безопасность durable agent. Durable agent, созданный с помощью SDK, отказывается запускаться в существующем каталоге, права которого отличны от 0700, и сообщает об этом сам.

Устаревший файл сокета

Вы видите connection refused на сокете, при этом файл существует.

Аварийно завершившийся durable agent оставляет файл сокета, и его никто не слушает. Запустите durable agent снова. SDK удаляет неактивный файл сокета перед началом прослушивания и останавливается с ошибкой another instance is already listening, если сокет активен. Удаляйте файл вручную только тогда, когда ваш durable agent не очищает его сам.

Имя совпадает с именем терминальной сессии

Мост останавливается при запуске с ошибкой the name is the terminal session's own; pick another, либо терминальная сессия отсутствует на телефоне.

Durable agent не может использовать имя терминала, из которого запущен Collie. В большинстве установок это имя — default, а в режиме durable-only у Collie default имя берётся от его durable agent. Мост останавливается при запуске и указывает имя записи. Сессия Herdr с именем durable agent — другой случай: durable agent сохраняет имя, телефон не показывает эту сессию, а в лог выводится однократное сообщение. Переименуйте одну из них.

Постоянное предупреждение durable-ready

Вы видите durable-ready как предупреждение при каждом запуске collie doctor.

Durable agent возвращает hello и сообщает ready: false. Телефон показывает статус Starting. Durable agent сообщает о готовности только после того, как восстановит свои диалоги и снова поднимет открытые вопросы. Проверьте собственный лог durable agent, чтобы узнать, чего он ожидает.

Durable agent останавливается при запуске на проверке потомков

Durable agent останавливается при запуске с ошибкой the descendant check needs Bun on Linux to read the peer of a socket; pass callerCheck: "off" to run without it.

Для проверки требуется Bun на Linux. На macOS запускайте durable agent через Node или передайте callerCheck: "off" в openCollie и предварительно прочитайте что защищает проверка. Ошибка исходит от durable agent. Collie к ней не причастен.

Вопрос появляется снова после перезапуска

Вы снова видите вопрос после перезапуска durable agent или карточку с сообщением о том, что ответ уже получен.

Ответ на вопрос, заданный до перезапуска, получает too-late, карточка сообщает об этом и исчезает. Durable agent, который вычисляет id вопроса из вызова своего инструмента, задаёт тот же вопрос снова, поэтому отправленный через перезапуск ответ доходит, и инструмент выполняется один раз. Durable agent, создающий новый id каждый раз, задаёт новый вопрос для того же вызова инструмента. Карточка показывает его, и Collie не отправляет повторный пуш, так как защита от частых пушей привязана к вызову инструмента. Защита также разрешает 3 пуша на диалог в минуту, 10 на хост в минуту и 30 на хост в час. Пуш, который стал бы 31-м за час, превращается в один сводный пуш для этого хоста, и хост больше ничего не отправляет в течение часа после него. Карточка показывается всегда.

403 caller-refused

На телефоне отображается, что ответ или сообщение отклонены, а причина durable agent: 403 caller-refused.

Проверка потомков в durable agent отклонила вызывающую сторону. Она отклоняет сам durable agent, любой запущенный им процесс и вызывающую сторону, которую не может от них отличить. Collie оказывается на стороне durable agent, когда durable agent или запущенный им инструмент запустили процесс Collie, и этот процесс всё ещё остаётся его потомком. Запустите Collie не из durable agent, затем повторите попытку.

Повторите попытку, и ответ, который может быть применён

Вы видите «Not sure the answer arrived» с кнопкой Try again, а после нажатия — «May already be applied. Check the chat.»

Таймаут, обрыв соединения или ошибка 5xx после отправки ответа означают, что он мог дойти. Кнопка Try again отправляет тот же id запроса, поэтому durable agent возвращает replayed и никогда не разрешает вопрос дважды. Если вопрос уже закрыт, его могла закрыть первая попытка, поэтому телефон предлагает проверить чат. Отправка, остановка и нажатие кнопки сообщают то же самое своими словами.

Durable agent отклонил токен

В строке подключения отображается «The durable agent refused the token. Check COLLIE_DURABLE_TOKEN on this peer.», а причина — token-refused.

Durable agent вернул 401 или 403 в ответ на токен. Самая частая причина — ротация, когда одна из сторон обновилась раньше. В сообщении на телефоне указано COLLIE_DURABLE_TOKEN даже для записи sources.json: читайте это как token этой записи. Передайте новый токен в durable agent перед перезапуском Collie. Шаги ротации описаны в Токены. Ошибка 403 также может исходить от прокси доступа перед durable agent.

Переключение в Unreachable, требующее двух чтений

Вы видите, что durable agent остаётся в статусе Ready при одном неудачном чтении, а затем переключается в Unreachable.

Одно неудачное чтение после успешного сохраняет последнее состояние на время этого опроса. Вторая неудача подряд переключает durable agent. Для отклонённого токена действует то же правило. Путь к сокету, не прошедший проверку прав доступа, является единственным исключением: ошибка отображается сразу.

По протоколу https к упавшему или отклоняющему токен durable agent обращение происходит не чаще одного раза в 10 с, так как каждая попытка тарифицируется. Через сокет минимальный интервал между двумя чтениями упавшего durable agent составляет 250 мс.

В составе crew

Durable agent на участнике crew отображается на телефоне ведущего узла, поэтому ведущему узлу нужно знать, что такое durable agent.

Ведущий узел версии ниже 1.21.0 выводит диалоги durable agent без карточки вопроса, а его вкладка Terminal опрашивает диалог, у которого нет терминала. На стороне участника это ничем не исправить. Участник сам сообщает об этом: collie doctor предупреждает в durable-lead, а в лог выводится одна строка, [durable] the lead is 1.20.1; it shows durable panes without the question card and its Terminal tab polls; update the lead, один раз для каждого обнаруженного релиза. Обновите ведущий узел.

durable-leadчто отображается
пропущено, нет crewЭта машина не входит в crew, поэтому ведущий узел отсутствует
пропущено, ведущий узелЭта машина является ведущим узлом и показывает свои собственные панели
пропущено, нет релизаВедущий узел не указал релиз: сборка для разработки, идёт обновление или не было вызовов с момента запуска моста
предупреждениеВедущий узел работает на релизе ниже 1.21.0
зелёныйВедущий узел версии 1.21.0 или новее

Если участник старее ведущего узла, возникает противоположная ошибка. Телефон сообщает: «This machine runs an older Collie and cannot take answers here. Update it, or answer in the durable agent.» Обновите этого участника.

Редактировать эту страницу на GitHub

The rest of the documentation