L'azienda Cloudflare ha pubblicato l'analisi di uno dei più grandi incidenti nella sua infrastruttura, a causa del quale ieri una gran parte della rete di distribuzione dei contenuti è stata non operativa per oltre 3 ore. Il malfunzionamento si è verificato dopo una modifica nella struttura del database ospitato in ClickHouse, dopo la quale il file con i parametri per il sistema di protezione dai bot è raddoppiato in dimensioni. Nel database si sono formate tabelle duplicate, mentre la query SQL per generare il file semplicemente estraeva tutti i dati da tutte le tabelle in base alla chiave, senza filtrare i duplicati. SELECT name, type FROM system.columns WHERE table = ‘http_requests_features’ order by name;

Il file creato si è diffuso attraverso tutti i nodi del cluster che gestisce le richieste in ingresso. Nel gestore che utilizza questo file per verificare le richieste provenienti da bot, i parametri indicati nel file venivano memorizzati nella memoria volatile e, per proteggere da un eccessivo consumo di memoria, nel codice era stato previsto un limite sulla dimensione massima consentita del file. In condizioni normali, la dimensione effettiva del file era significativamente inferiore al limite stabilito, ma dopo la duplicazione delle tabelle ha superato il limite.
Il problema risiedeva nel fatto che, invece di gestire correttamente il superamento del limite e continuare a utilizzare la versione precedente del file informando il sistema di monitoraggio della situazione anomala, nel gestore si attivava una terminazione di emergenza, che bloccava ulteriormente il passaggio del traffico. L'errore è stato causato dall'uso nel codice scritto in Rust del metodo unwrap() con il tipo Result.

Quando il valore di Result ha lo stato 'Ok', il metodo unwrap() restituisce l'oggetto associato a tale stato, ma se il risultato non è di successo, la chiamata provoca una terminazione anomala (viene attivato il macro 'panic!'). Di solito, unwrap() viene utilizzato durante il processo di debug o nella scrittura di codice di test e non è raccomandato per l'uso in progetti di produzione.


Fonte: opennet.ru
