Skip to content

Стенд: потерянный ответ на чтение лога - это дыра, и отказы делят вину - #469

Merged
dontsovcmc merged 6 commits into
devfrom
metf_log_holes
Sep 24, 2026
Merged

dontsovcmc merged 6 commits into
devfrom
metf_log_holes

Conversation

@dontsovcmc

Copy link
Copy Markdown
Owner

Продолжение #468 (влит). Три правки, рождённые прогоном быстрого набора задом наперёд (pytest Utils/hil --stand --reverse -m "not slow"): 173 прошли, 4 упали, 3 ошибки за 1 ч 37 мин.

Чтение лога METF неповторимо

GET /read отдаёт накопленные строки и тут же осушает кольцо: ответ существует в одном экземпляре. Обёртка повторяла запрос на любой сетевой осечке, включая таймаут чтения, — плата к тому моменту кольцо уже очистила, и повтор приносил следующие строки. Дыра выходила молчаливой, а падал потом не тот тест и не там.

Так и вышло в прогоне: test_E10_vacation_works_without_factor и test_F3_disabled_receiver_drops_out упали с «сеанс не пришёл за 300 с», хотя сеанс был — в приложенном логе есть Going to sleep, но нет Startup mode:. Пропала первая строка сеанса.

Теперь чтение повторяется только при отказе соединения (запроса плата не видела), потерянный ответ считается дырой, и ожидание сеанса валится прямым текстом. Срок чтения снижен с клиентских 3 с до 2 с: если дыра случилась, она меньше.

Отказы делят вину

  • D7 (потерянный импульс) прикладывает счёт attiny из лога обоих сеансов: насчитала все — прирост потеряла ЕСП, насчитала меньше — импульс не доехал до платы;
  • I0b (топик показаний) прикладывает строки самого устройства про этот топик. В прогоне пропал связный кусок из девяти топиков подряд — 65 из 83, — и по прежнему отказу нельзя было понять, устройство их не публиковало или они не доехали до брокера стенда.

Проверки

103 селфтеста (3 новых), в прямом порядке и --reverse; ruff check Utils/hil чисто; docs/check_refs.py — 306 ссылок.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW

dontsovcmc and others added 6 commits September 24, 2026 03:21
`GET /read` отдаёт накопленные строки и тут же осушает кольцо платы, поэтому
ответ на него существует в одном экземпляре. Обёртка повторяла запрос на любой
сетевой осечке, включая таймаут чтения: плата к этому моменту кольцо уже
очистила, и повтор приносил следующие строки вместо потерянных. Дыра выходила
молчаливой, а падал потом не тот тест и не там - «сеанс не пришёл», хотя сеанс
был, а пропала его первая строка.

Теперь чтение повторяется только при отказе соединения (запроса плата не
видела), потерянный ответ считается дырой, и ожидание сеанса валится с прямым
текстом. Срок чтения снижен с клиентских 3 с до 2 с: если дыра случилась, она
меньше.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
Правило легко потерять: `GET /read` осушает кольцо, и повтор после таймаута
даёт молчаливую дыру.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
…йства

`D7` говорил «приросты 30 + 60, подано 10 импульсов» - и всё; по такому отказу
не отличить потерянный прошивкой прирост от импульса, не доехавшего до attiny.
Теперь в отказ идёт счёт attiny из лога обоих сеансов.

`I0b` говорил «нет топика sc» и список доехавших. В прогоне 24 сентября так
пропал связный кусок из девяти топиков подряд (65 из 83), и по отказу нельзя
было понять, устройство их не публиковало или они не доехали до брокера стенда.
Теперь рядом строки самого устройства про этот топик.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
…размере

Дыра в логе смертельна любого размера, поэтому короткий срок чтения делает
только хуже: пока он больше пары перепосылок TCP, потерянный пакет лечится
самим протоколом. Замер 24 сентября: до METF теряется 3,3 % пакетов, всплески
задержки до 158 мс - это как раз тот случай.

Потолок ставит кольцо платы: оно вмещает около пяти секунд сеанса с MQTT,
поэтому четыре секунды - верх разумного.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
Линии отпускались одним вызовом, и если плата в этот миг была не на связи,
упавший тест получал вдогонку ошибку в teardown, а входы оставались прижатыми
к земле на весь оставшийся прогон. Теперь уборка ждёт схождения платы теми же
тридцатью секундами, что и старт стенда, и только потом отпускает линии.

Случай живой: E19 прошёл, а следом получил ошибку уборки - METF отвалилась.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
Отлучка METF на 1,1 с переполнила кольцо лога посреди подъёма стенда - и 45
медленных тестов не начались вовсе: 41 ошибка за 38 секунд. Шаги подъёма ничего
не утверждают о прошивке и повторяются без последствий, поэтому потеря лога на
них теперь стоит повтора с предупреждением. Отказ по делу - устройство молчит,
сеть чужая - летит сразу, как раньше.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzzA8BbZKQLjKFK3KwieBW
@dontsovcmc
dontsovcmc merged commit 8920745 into dev Sep 24, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant