Предотвращение серьезных сбоев в пределах досягаемости

TL;DR: используйте зрелые инструменты для создания зрелого программного обеспечения.

Проблема

9 июля 2022 года очередной аппаратный сбой привел к зависанию нескольких серверов.

Глядя на основную причину неудачи, мы можем извлечь урок.

В этой теме мы можем найти, что произошло:

Однажды у меня произошел сбой небольшого парка твердотельных накопителей, поскольку у них были некоторые счетчики времени безотказной работы, которые переполнялись через 4,5 года, и это каким-то образом постоянно разрушало некоторые внутренние структуры данных. Это превратило их в маленькие невосстанавливаемые кирпичики. Не было ничего удивительного в том, что несколько серверов отключились примерно в том порядке, в котором мы их включили изначально. Совсем не веселый день.



Причина

Ошибка, исправленная микропрограммой Dell EMC, касается функции Assert, у которой была неверная проверка для проверки значения значения индекса циклического буфера. Вместо того, чтобы проверять максимальное значение как N, он проверял N-1. Исправление исправляет проверку утверждения, чтобы использовать максимальное значение в качестве N.

Профилактика

Мы серьезные инженеры-программисты, и у нас есть зрелые инструменты.

Как мы можем предотвратить дефекты, подобные этому (они не ОШИБКИ)



Хватит называть их «багами
Давайте называть вещи правильноcodeburst.io»



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