Rails теперь требует Ruby 3.3.5
Теперь минимальная версия Ruby для работы с последними на тек. момент Rails 8.2 - это 3.3.5
Дело в том, что основная причина - уязвимость типа "use-after-free" (использование после освобождения) в реализации WeakKeyMap в Ruby.
WeakKeyMap - это специальная структура данных, которая хранит "слабые" ссылки на ключи.
Если объект-ключ больше нигде не используется, сборщик мусора может его удалить. Баг в Ruby позволял обращаться к уже удалённому объекту, что могло приводить к непредсказуемому поведению и сбоям.
Из-за этого бага Rails не могла полноценно использовать WeakKeyMap для своих нужд. В частности, это касалось работы с пулами соединений. При очистке кэша запросов нужно было перебирать все доступные пулы соединений, что создавало избыточную нагрузку на CPU. Разработчики хотели переписать эту логику так, чтобы перебирать только те пулы, которые действительно используются в текущем контексте. Для этого и нужен был WeakKeyMap с ключами-пулами.
А повысив минимальную версию до Ruby 3.3.5, команда Rails получила возможность:
- Удалить свою обходную реализацию (polyfill) для WeakKeyMap
- Использовать "родную" и исправленную версию этой структуры данных
- Оптимизировать очистку кэша запросов, что снизило нагрузку на CPU
Проще говоря, это был не просто апгрейд ради новой версии, а вынужденная мера для обхода серьёзного бага, которая заодно позволила улучшить производительность Rails.
Сам Pull Request