Предотвращение серьезных сбоев в пределах досягаемости
TL;DR: используйте зрелые инструменты для создания зрелого программного обеспечения.
Проблема
9 июля 2022 года очередной аппаратный сбой привел к зависанию нескольких серверов.
Глядя на основную причину неудачи, мы можем извлечь урок.
В этой теме мы можем найти, что произошло:
Однажды у меня произошел сбой небольшого парка твердотельных накопителей, поскольку у них были некоторые счетчики времени безотказной работы, которые переполнялись через 4,5 года, и это каким-то образом постоянно разрушало некоторые внутренние структуры данных. Это превратило их в маленькие невосстанавливаемые кирпичики. Не было ничего удивительного в том, что несколько серверов отключились примерно в том порядке, в котором мы их включили изначально. Совсем не веселый день.
Причина
Ошибка, исправленная микропрограммой Dell EMC, касается функции Assert, у которой была неверная проверка для проверки значения значения индекса циклического буфера. Вместо того, чтобы проверять максимальное значение как N, он проверял N-1. Исправление исправляет проверку утверждения, чтобы использовать максимальное значение в качестве N.
Профилактика
Мы серьезные инженеры-программисты, и у нас есть зрелые инструменты.
Как мы можем предотвратить дефекты, подобные этому (они не ОШИБКИ)
1 — ТДД
С TDD мы можем писать код только после неудачного теста.
Таким образом, нам нужно подумать о сценарии N и явно проверить случай.
В противном случае мы не можем писать код.
TDD невероятно хорош для встраиваемых систем.
2 — Зомби
Зомби — отличный инструмент для тестирования, а также отличный компаньон TDD.
«B» для границ в zomBies говорит нам явно проверять наличие границ.
В этом случае N = 1, N и N +1.
3 — Тестирование мутаций
Всякий раз, когда мы используем арифметику или условия ЕСЛИ, мы можем проверить, что произойдет, если мы совершим ошибку (как в этой статье), и заменим ‹ на ‹=.
Мутационное тестирование — очень мощный инструмент для проверки пограничных сценариев.
4 — Модель круговых буферов
Встроенные и аппаратные системы часто настраиваются на оптимальную производительность.
Они пропускают некоторые проверки и программируются на низкоуровневых языках.
Большинство из них избегают ОТОБРАЖЕНИЯ реального мира и используют короткие целые числа в качестве индексов.
Согласно нашему MAPPER, integer не является shortint (или longint), а shortint не является целое число.
5 — Быстрая ошибка
Программное обеспечение для критически важных задач иногда имеет процедуры восстановления или отказоустойчивые процедуры.
Следуя принципу Fail Fast, мы можем предвидеть катастрофу и позволить другому фрагменту кода взять на себя управление вместо того, чтобы блокировать диски.
Выводы.
Системы не дают сбоев.
Мы терпим неудачу как инженеры-программисты и снова и снова совершаем одни и те же ошибки.
Нам нужно быть скромнее и учиться на своих прошлых ошибках.
Кредиты
Фото автора Patrick Perkins на Unsplash