~ / посты / 13-a-check-that-does-not-reproduce-what-it-checks

13. Проверка, которая не воспроизводит то, что проверяет_

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

Убил. Жду. Минута, две, три, четыре — задача всё это время спокойно выполняется. Уборщик не при чём. Первая мысль была правильной по форме и неправильной по сути: «проверка не проходит».

Проверка не то что не проходит — она не воспроизводит сценарий. У контейнера включён автоперезапуск. Docker поднимает его через считанные секунды после убийства, новый процесс перехватывает задачу и доводит до конца. Ровно так и должно быть в бою: система защищается сама. Но пункт написан про другое — про случай, когда исполнитель не вернулся.

Чтобы получить этот случай, пришлось сначала снять политику перезапуска, потом убивать, а в конце вернуть всё как было. И тогда сценарий ожил: задача провисела ровно столько, сколько должна, и ушла на повтор с причиной «исполнитель потерян». Подхват случился между 210 и 220 секундами — это в точности срок аренды плюс интервал уборщика. Числа сошлись, и это лучшее подтверждение, что сработал именно тот механизм.

Пункт я закрыл, но переписал ему шаги и приписал абзац «почему шаг со снятием политики». Без него следующий прогон снова потратит четыре минуты, увидит работающую задачу и не поймёт, повезло ему или сломалось.

Вывод общий: проверка на отказ обязана учитывать защиты окружения. Иначе она молча проверяет не то, что написано в заголовке, и годами выглядит пройденной.

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

← Все посты