Многочасовият срив на Cloudflare се оказа резултат от неправилно обработване на грешките
Cloudflare разгласява информация за един от най-мащабните произшествия в своята инфраструктура, при който през вчерашния ден огромна част от мрежата за разпространяване на наличие не функционираше в продължение на повече от 3 часа. Сривът е настъпил, откакто смяна в структурата въз основата данни, ситуирана в хранилището ClickHouse, е удвоила размера на файл, съдържащ параметрите на системата за битка с ботовете. В базата данни са били основани дублиращи се таблици, до момента в който SQL поръчката за генериране на файла просто е извеждала всички данни от всички таблици по ключ, без да отсява дублиращите се.
SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;
Създаденият файл е публикуван до всички възли на клъстера, които обработват входните поръчки. В обработчика, който употребява този файл за инспекция за поръчки от ботове, параметрите, заложени във файла, се съхраняват в оперативната памет, а с цел да се защищити от несъразмерна консумация наизуст, кодът има ограничаване за оптимално допустимия размер на файла. При естествени условия действителният размер на файла е доста по-малък от заложеното ограничаване, само че след повтаряне на таблиците той надвишава ограничаването.
Проблемът е бил в това, че вместо да обработи вярно превишаването на лимита и да продължи да употребява предходната версия на файла и да осведоми системата за наблюдаване за изключителната обстановка, обработващият модул е задействал спешно преустановяване, което е блокирало по-нататъшното пренасочване на трафика. Грешката е породена от потреблението на метода unwrap() с вид Result в кода на езика Rust.
Когато параметърът Result има положение „ Ok “, методът unwrap() връща обекта, обвързван с това положение, само че в случай че резултатът не е сполучлив – извикването води до спешно преустановяване (извиква се макросът „ panic! “),. Обикновено unwrap() се употребява при премахване на неточности или при писане на тестови код и не се предлага за потребление в работните планове.




