Многочасовият срив на Cloudflare се оказа резултат от неправилно обработване на грешките

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Cloudflare публикува информация за един от най-мащабните инциденти в своята инфраструктура, при който вчера голяма част от мрежата за разпространение на съдържание не функционираше в продължение на повече от 3 часа. Сривът е настъпил, след като промяна в структурата на базата данни, разположена в хранилището ClickHouse, е удвоила размера на файл, съдържащ параметрите на системата за борба с ботовете. В базата данни са били създадени дублиращи се таблици, докато SQL заявката за генериране на файла просто е извеждала всички данни от всички таблици по ключ, без да отсява дублиращите се.

 SELECT
     name,
     type
   FROM system.columns
   WHERE
     table = 'http_requests_features'
   order by name;
Многочасовият срив на Cloudflare се оказа резултат от неправилно обработване на грешките

Създаденият файл е разпространен до всички възли на клъстера, които обработват входните заявки. В обработчика, който използва този файл за проверка за заявки от ботове, параметрите, зададени във файла, се съхраняват в оперативната памет, а за да се предпази от прекомерна консумация на памет, кодът има ограничение за максимално допустимия размер на файла. При нормални условия действителният размер на файла е много по-малък от зададеното ограничение, но след дублиране на таблиците той надхвърля ограничението.

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

Многочасовият срив на Cloudflare се оказа резултат от неправилно обработване на грешките

Когато параметърът Result има състояние „Ok“, методът unwrap() връща обекта, свързан с това състояние, но ако резултатът не е успешен – извикването води до аварийно прекратяване (извиква се макросът „panic!“), . Обикновено unwrap() се използва при отстраняване на грешки или при писане на тестови код и не се препоръчва за използване в работните проекти.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

2 Коментара
стари
нови оценка

Нови ревюта

Подобни новини