Cloudflare je objavio izvješće o jednom od najvećih incidenata koji su utjecali na njegovu infrastrukturu, zbog kojeg je jučer veći dio njegove mreže za isporuku sadržaja bio nedostupnim više od tri sata. Do prekida rada došlo je nakon promjene strukture baze podataka smještene u ClickHouse pohrani, što je udvostručilo veličinu datoteke koja sadrži parametre za anti-bot sustav. U bazi podataka stvorene su duplicirane tablice, unatoč činjenici da je SQL upit korišten za generiranje datoteke jednostavno dohvatio sve podatke iz svih tablica po ključu, bez filtriranja duplikata. SELECT ime, upišite FROM system.columns WHERE table = 'http_requests_features' order by name;

Kreirana datoteka distribuirana je svim čvorovima u klasteru koji obrađuju dolazne zahtjeve. U rukovatelju koji je koristio ovu datoteku za provjeru zahtjeva botova, parametri navedeni u datoteci pohranjeni su u RAM-u, a radi zaštite od prekomjerne potrošnje memorije, kod je uključio ograničenje maksimalne veličine datoteke. U normalnim uvjetima, stvarna veličina datoteke bila je znatno manja od ograničenja, ali nakon dupliciranja tablica premašila je ograničenje.
Problem se pokazao u tome što je, umjesto ispravnog rukovanja prekoračenjem ograničenja i nastavka korištenja prethodne verzije datoteke, obavještavajući nadzorni sustav o hitnom slučaju, program za obradu podataka rušio program, blokirajući daljnje prosljeđivanje prometa. Pogrešku je uzrokovala upotreba metode unwrap() s tipom Result u Rust kodu.

Kada je vrijednost rezultata "Ok", metoda unwrap() vraća objekt povezan s tim stanjem, ali ako je rezultat neuspješan, poziv rezultira abnormalnim prekidom (poziva se makronaredba "panic!"). Unwrap() se obično koristi tijekom otklanjanja pogrešaka ili pri pisanju testnog koda i ne preporučuje se za korištenje u produkcijskim projektima.


Izvor: opennet.ru
