A Cloudflare publicou uma análise de um dos maiores incidentes em sua infraestrutura, que fez com que grande parte da rede de entrega de conteúdo ficasse fora do ar por mais de 3 horas. A falha ocorreu após uma modificação na estrutura do banco de dados armazenado no ClickHouse, após a qual o arquivo com os parâmetros para o sistema de combate a bots aumentou duas vezes seu tamanho. Foram formadas tabelas duplicadas no banco de dados, embora a consulta SQL para formar o arquivo simplesmente extraísse todos os dados de todas as tabelas pela chave, sem filtrar duplicatas. SELECT name, type FROM system.columns WHERE table = ‘http_requests_features’ order by name;

O arquivo criado se espalhou por todos os nós do cluster que processa as requisições de entrada. No manipulador que usa esse arquivo para verificar acessos de bots, os parâmetros especificados no arquivo eram armazenados na memória e, para evitar o consumo excessivo de memória, o código tinha um limite para o tamanho máximo do arquivo permitido. Em condições normais, o tamanho real do arquivo era significativamente menor do que o limite imposto, mas após a duplicação das tabelas, superou o limite.
O problema estava na falta de um tratamento adequado para a superação do limite e na continuidade do uso da versão anterior do arquivo, com a notificação do sistema de monitoramento sobre a situação de emergência; em vez disso, o manipulador falhava, bloqueando o fluxo de tráfego. O erro foi causado pelo uso do método unwrap() em Rust com o tipo Result.

Quando o valor de Result tem o estado 'Ok', o método unwrap() retorna o objeto associado a esse estado; mas se o resultado não for bem-sucedido, a chamada resulta em falha (um macro 'panic!' é chamado). Normalmente, o unwrap() é usado durante a depuração ou na escrita de código de teste e não é recomendado para uso em projetos em produção.


Fonte: opennet.ru
