Sometimes CPU cores are odd
Всё ПО содержит баги; чем сложнее код, тем запутаннее ошибки. Однажды я столкнулся с «однострочным» фиксом, который спас пользователей от случайных отказов Anubis.
Как всё началось
Anubis — WAF, который проверяет, что клиент — настоящий браузер. Основной способ — proof-of-work: клиент считает хэши, ограничивая скорость подключения. Чтобы экран-заглушка исчезал быстрее, JS-код использует максимум ядер CPU.
Проблема
Firefox тормозит, если задействовать все ядра; оптимум — половина. В коде было:
threads = Math.max(navigator.hardwareConcurrency / 2, 1)
Все мои тестовые устройства (MacBook, Ryzen, iPhone, Steam Deck…) имели чётное количество ядер, поэтому navigator.hardwareConcurrency / 2
всегда получался целым. Но если устройство с нечётным числом ядер (например, 3), результат — 1.5. JavaScript-числа — это IEEE-754, и дробная часть приводила к багу «invalid response», потому что логика расчёта nonce рассчитана на целые.
Фикс
Округлил до ближайшего целого:
threads = Math.max(Math.floor(navigator.hardwareConcurrency / 2), 1)
Одна строчка — и исчезли случайные отказы на нечётных CPU.