Cloudflare a publié un rapport concernant l'un des incidents majeurs ayant affecté son infrastructure, qui a rendu hier une grande partie de son réseau de diffusion de contenu indisponible pendant plus de trois heures. La panne est survenue suite à une modification de la structure d'une base de données hébergée sur ClickHouse Storage, ce qui a doublé la taille du fichier contenant les paramètres du système anti-bot. Des tables dupliquées ont été créées dans la base de données, alors même que la requête SQL utilisée pour générer le fichier récupérait simplement toutes les données de toutes les tables par clé, sans filtrer les doublons. `SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;`

Le fichier créé a été distribué à tous les nœuds du cluster traitant les requêtes entrantes. Dans le gestionnaire utilisant ce fichier pour détecter les requêtes de robots, les paramètres qu'il contenait étaient stockés en mémoire vive. Afin d'éviter une consommation excessive de mémoire, le code imposait une limite à la taille maximale du fichier. En temps normal, la taille réelle du fichier était nettement inférieure à cette limite, mais après la duplication des tables, elle l'a dépassée.
Le problème s'est avéré être que, au lieu de gérer correctement le dépassement de limite et de continuer à utiliser la version précédente du fichier, tout en informant le système de surveillance de l'urgence, le gestionnaire plantait, bloquant ainsi la transmission du trafic. L'erreur était due à l'utilisation de la méthode `unwrap()` avec le type `Result` dans le code Rust.

Lorsque la valeur de Result est « Ok », la méthode unwrap() renvoie l'objet associé à cet état. En cas d'échec, l'appel provoque une interruption anormale (la macro « panic! » est déclenchée). Unwrap() est généralement utilisé lors du débogage ou de l'écriture de code de test et son utilisation est déconseillée en production.


Source: opennet.ru
