Сбой произошёл после изменения в структуре БД, после чего файл с параметрами для противодействия ботам увеличился в два раза. В БД образовались дублирующиеся таблицы, при том, что SQL-запрос для формирования файла просто выводил все данные из всех таблиц по ключу, без отсеивания дубликатов.
SELECT
name,
type
FROM system.columns
WHERE
table = 'http_requests_features'
order by name;
Созданный файл стал применяться для обработки входных запросов. В обработчике, использующем данный файл для проверки на боты, указанные в файле параметры сохранялись в оперативной памяти. Для защиты от излишнего расхода памяти в коде был предусмотрен лимит на размер файла. Обычно фактический размер файла был значительно меньше выставленного органичения, но после дублирования таблиц превысил лимит. В итоге в обработчике срабатывало аварийное завершение, которое блокировало дальнейший проброс трафика. Ошибка была вызвана использованием в коде на языке Rust метода unwrap() с типом Result:
// Fetch edge feature based on 'input' struct into ['Features'] buffer.
pub fn fetch_features(
&self,
input: &dyn BotsInput,
features: &mut Features,
) -> Result<(), (ErrorFlags, i32)> {
// update feature checksum (lower 32 bits) and copy edge feature names
features.checksum &= 0xFFFFFFFF00000000;
features.checksum |= u64::from(self.config.checksum);
let (feature_values, _) = features
.append_with_names(self.config.feature_names)
.unwrap(); // Здесь возникла ошибка
Ok(())
}
Когда значение Result имеет состояние "Ok", метод unwrap() возвращает связанный с этим состоянием объект, но если результат не является успешным - вызов приводит к аварийному завершению (вызывается макрос "panic!").
https://blog.cloudflare.com/18-november-2025-outage/