La société Cloudflare a publié une analyse de l'un des plus grands incidents de son infrastructure, en raison duquel la majeure partie du réseau de distribution de contenu a été hors service pendant plus de 3 heures. La défaillance est survenue après une modification de la structure de la base de données, hébergée dans le stockage ClickHouse, après quoi le fichier de paramètres pour le système de lutte contre les bots a doublé de taille. Des tables dupliquées ont été créées dans la base de données, alors que la requête SQL pour générer le fichier extrayait 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éé s'est propagé à tous les nœuds du cluster qui traite les requêtes entrantes. Dans le gestionnaire qui utilise ce fichier pour détecter les accès des bots, les paramètres indiqués dans le fichier étaient stockés en mémoire vive et, pour éviter une consommation excessive de mémoire, un limiteur de taille maximale du fichier a été prévu dans le code. En conditions normales, la taille réelle du fichier était bien inférieure à cette limite, mais après la duplication des tables, elle a dépassé le seuil.
Le problème résidait dans le fait qu'au lieu de traiter correctement le dépassement de la limite et de continuer à utiliser la version précédente du fichier, tout en informant le système de surveillance de l'incident, le gestionnaire provoquait un arrêt d'urgence, bloquant ainsi la transmission du trafic. L'erreur était causée par l'utilisation dans le code Rust de la méthode unwrap() avec le type Result.

Lorsque la valeur de Result est dans l'état «Ok», la méthode unwrap() renvoie l'objet associé à cet état, mais si le résultat n'est pas réussi, l'appel entraîne un arrêt d'urgence (le macro «panic!» est appelé). En général, unwrap() est utilisé lors du débogage ou pour écrire du code de test et n'est pas recommandé pour une utilisation dans des projets de production.


Source : opennet.ru
