$ the-wire · showcase
SOLID QUEUE 1.5.0 SHIPS WITH CRITICAL CONCURRENCY FIXES
By RepoJournal · Filed · About Rails · Composed from the cited sources · methodology
Solid Queue v1.5.0 lands three separate fixes for a production bug that corrupts semaphore counts and lets concurrency-limited jobs run wild.
The release [1] closes a dangerous class of failure where workers with `limits_concurrency` could permanently leak their semaphore permits, allowing jobs to execute far beyond their configured limits. Two independent production reports converged on the same root cause [2], and the fix was ported from starburstlabs/solid_queue after being diagnosed in the wild [3]. The bug manifests when a worker's database heartbeat fails transiently: a supervisor prunes it as dead, releases its concurrency lock, and unblocks replacements, but the semaphore value never gets properly capped. Three separate PRs address it [2], [3], [4]: guarding `signal_all` against incrementing beyond limit, preventing wrong release of blocked jobs, and capping semaphore increments per concurrency group. Beyond the critical fix, v1.5.0 drops Ruby 3.1 support [1], improves PostgreSQL polling for unspecified queue names, introduces `bin/job check` for configuration validation, and adds default time zone support for recurring tasks. Rails core continues cleanup work across the stack: removing dead branches in MySQL introspection [5], , stripping unused code from Railties and Action Cable [6], and excising dead test runner helpers [7].
Action items
- → Upgrade solid_queue to 1.5.0 before next deploy if you use limits_concurrency rails/solid_queue [immediate]
- → Review any recurring jobs to set default time zone if needed rails/solid_queue [plan]
- → Update Ruby requirement if pinned to 3.1 rails/solid_queue [plan]
References
- [1] v1.5.0 ↗ rails/solid_queue
- [2] Prevent concurrency lock leaks that cause duplicate job execution ↗ rails/solid_queue
- [3] Prevent wrong release of blocked jobs and semaphore corruption ↗ rails/solid_queue
- [4] Guard signal_all against incrementing semaphore beyond its limit ↗ rails/solid_queue
- [5] Remove dead branch in MySQL column introspection ↗ rails/rails
- [6] Merge pull request #58223 from 55728/remove-unused-railties-actioncable ↗ rails/rails
- [7] Merge pull request #58216 from Shopify/rubydex/remove-test-runner-path-parser ↗ rails/rails