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>ms | Durable agent завис или ещё не прогрет. Collie ждёт 1000 мс на сокете и 5000 мс по https |
tls refused: <message> | Сертификат URL отклонён. В Collie нет флага для пропуска этой проверки |
the host name does not resolve | Имя хоста в URL указано неверно, либо ваша сеть не может до него добраться |
token-refused: the durable agent answered 401 или 403 | Durable agent отклонил токен. Durable agent отклонил токен |
too-large | Durable 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 token | Durable 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 |
starting | Durable 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.
| строка | зелёный | предупреждение или красный |
|---|---|---|
sources | 2 durable agents in <path>, mode 0600 | Красный, если файл не удаётся распарсить. В способе исправления указано, что мост не запустится при наличии ошибок. Красный, если файл доступен для чтения группе или остальным (исправление: chmod 600), так как запись может содержать токен |
durable-env | transport: private socket с путём, либо transport: https with a bearer token | Красный, если параметр нарушает правило из таблица причин |
durable-socket | Путь указывает на ваш сокет с правами 0600 в принадлежащей вам папке с правами 0700, без символических ссылок в пути | Красный, при этом в строке указана непрошедшая проверка: ничего нет, недоступно для чтения, не является сокетом, символическая ссылка, не папка, папка другого владельца, папка с неверными правами, родительская папка доступна на запись остальным, сокет другого владельца или сокет с открытыми правами. Пропускается для durable agent за https |
durable-url | Адрес (https или локальный http) и его длина в байтах | Красный, если URL нарушает правило. Пропускается для сокета |
durable-token | set, <n> bytes. Collie никогда не выводит это значение | Красный, если токен нарушает правило. Пропускается для сокета |
durable-hello | Durable agent ответил. Оба диапазона и согласованная ими версия | Красный с указанием причины: токен отклонён, нет ответа, ответило что-то отличное от durable agent, durable agent запрашивает токен через сокет, нечитаемый hello или непересекающиеся диапазоны. При несовпадении диапазонов выводятся оба диапазона |
durable-ready | ready, имя хоста 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