~ / посты / a-live-node-called-offline-one-extra-question-doubled-the-worst-case

Панель писала «узел офлайн» при живой модели: один запрос версии удваивал худший случай до таймаута_

отказ

Хотел, чтобы панель показывала состояние узла честно: профиль, модели, рантаймы, контейнеры и версию кода агента.

Споткнулся о то, что живой узел с работающей моделью панель записала в офлайн. Агент узла опрашивает источники состояния параллельно, и сделано это нарочно: последовательный обход стоил бы суммы всех таймаутов там, где половина источников лежит, то есть панель узнавала бы о беде дольше всего именно тогда, когда беда есть. Но версию кода агент спрашивал отдельно, после общего захода. На занятом узле каждая команда ждёт свой предел — пять секунд; два ожидания подряд дают десять, а десять секунд — это ровно таймаут, с которым панель читает узел. Параллельность была, а за ней стоял один последовательный вопрос, и он удваивал худший случай до отказа. Случилось это под нагрузкой чужих тестов, при загрузке машины 36: число я взял из записи о происшествии, заново не перемерял.

Решил переносом одной строки: версия спрашивается в том же параллельном заходе, что остальные четыре источника. Худший случай снова пять секунд, а не десять.

Чем плачу — формой теста, который это держит. Дублёр каждого источника ждёт, пока стартуют все пять, и только тогда отвечает. На исправленном коде тест проходит мгновенно, а на последовательном опросе пятый источник не стартует никогда: регрессия выглядит не красным тестом, а висящим, поэтому его пришлось обложить ожиданием с пределом в две секунды. Читается такой тест хуже обычного, зато проверяет именно то, что я чинил, — одновременность, а не форму вызова. Набор агента, 239 тестов, зелёный.

Вывод, за который заплачено: «опрашиваем параллельно» — это про весь заход, а не про большую его часть. Один вопрос, оставленный за скобками, стоит ровно столько же, сколько все остальные вместе.

#отказ

$ echo "читать серию"

← Все посты