Společnost Cloudflare zveřejnila analýzu jednoho z největších incidentů ve své infrastruktuře, kvůli kterému byla včera většina sítě pro doručování obsahu nefunkční po více než 3 hodiny. K selhání došlo po změně struktury databáze umístěné ve skladu ClickHouse, po níž se soubor s parametry pro systém ochrany proti botům zvětšil dvojnásobně. V databázi byly vytvořeny duplicitní tabulky, přičemž SQL dotaz pro generování souboru jednoduše vybíral všechna data ze všech tabulek podle klíče, bez filtrování duplicit. SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;

Vytvořený soubor se rozšířil po všech uzlech clusteru, který zpracovává příchozí žádosti. V programu pro zpracování, který používá tento soubor pro ověřování, zda je dotaz od botů, se parametry uvedené v souboru ukládaly do operační paměti a pro ochranu před nadměrnou spotřebou paměti byl v kódu stanoven limit na maximální povolenou velikost souboru. V běžných podmínkách byla skutečná velikost souboru podstatně menší než stanovený limit, ale po duplicaci tabulek ho překročila.
Problém spočíval v tom, že místo správného zpracování překročení limitu a pokračování v používání předchozí verze souboru s informováním monitorovacího systému o mimořádné situaci došlo v programu k havarijnímu ukončení, které zablokovalo další přenos provozu. Chyba byla způsobena použitím v kódu napsaném v jazyce Rust metody unwrap() s typem Result.

Když má hodnota Result stav „Ok“, metoda unwrap() vrací objekt spojený s tímto stavem, ale pokud výsledek není úspěšný - volání vede k havarijnímu ukončení (spouští se makro „panic!“). Obvykle se unwrap() používá při ladění nebo při psaní testovacího kódu a není doporučeno pro použití v produkčních projektech.


Zdroj: opennet.ru
