Компания Cloudflare публикува анализ на един от най-големите инциденти в инфраструкутрата си, в резултат на който вчера значителна част от мрежата за доставка на съдържание беше неработоспособна в продължение на повече от 3 часа. Извънредното събитие се случи след промяна в структурата на базата данни, съхранявана в ClickHouse, след което файлът с параметрите за системата за защита от ботове се удвои по размер. В базата данни бяха създадени дублиращи се таблици, а SQL запитването за формирането на файла просто извеждаше всичките данни от всички таблици по ключа, без да изключва дубликатите. SELECT name, type FROM system.columns WHERE table = ‘http_requests_features’ order by name;

Създаденият файл се разпространи по всички възли на клъстера, обработващ входящите заявки. В обработвача, който използва този файл за проверка на обаждания от ботове, указаните в файла параметри се съхраняваха в оперативната памет и за защита от прекомерната консумация на памет, в кода беше предвиден лимит за максимално допустимия размер на файла. При обикновени условия действителният размер на файла беше значително по-малък от посочения лимит, но след дублирането на таблиците надхвърли лимита.
Проблемата се оказа, че вместо правилна обработка на надвишаването на лимита и продължаване на използването на предишната версия на файла с информиране на мониторинговата система за извънредната ситуация, в обработвача настъпваше аварийно приключване, което блокираше по-нататъшния пробив на трафик. Грешката беше предизвикана от използването в кода на Rust на метода unwrap() с тип Result.

Когато стойността на Result има състояние


Източник: opennet.ru
