The Wire · Showcase
SOLID QUEUE 1.5.0 SHIPS WITH CRITICAL CONCURRENCY FIXES
By RepoJournal · Filed · About Rails
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].
One email a day. Unsubscribe in one click.
Keep up with Rails in about 3 minutes a day: what actually shipped — the commits, pull requests, releases, and security advisories that matter.
One email a day. Unsubscribe in one click. Read a past issue →
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