Move solid_queue and solid_cable to released versions - #3107
Conversation
🤖 Upgrade Plan: solid_queue a8c89374..v1.7.0Upgrade Plan: solid_queue a8c89374..v1.7.0 for fizzy
Summary
Bottom line: the upgrade is safe to ship as a plain gem bump. The only real work is adopting the optional batches migration, which is not required to keep jobs running but should ship with the bump to avoid a per-process deprecation warning and to stay ahead of Solid Queue 2.0, where it becomes mandatory. Commits Requiring Mitigation1bcac835 + 112bb1cb: Add batch support (and refine it)Impact: definite impact (1bcac835) / likely impact (112bb1cb) What changed: v1.7.0 adds
Residual delta for fizzy:
Mitigation:
Behavior Changes, No Code Change Required546864f1: Recurring schedules default to the Rails time zone instead of system local timeImpact: likely impact dfc36448: Report rescued recurring enqueue errors to
|
| Commit | Summary | Impact Level |
|---|---|---|
| 4f72ea31 | Warn instead of raising when the connection pool is smaller than the thread pool | unlikely impact |
| 98af3c9e | Add bin/jobs check / solid_queue:check to validate config |
unlikely impact |
| ecc170cf | Refactor errors and warnings when parsing configuration (removes Configuration#error_messages) |
unlikely impact |
| e99dd403 | Memoize Runnable#mode |
unlikely impact |
| 0d5134b9 | Avoid reloading job rows after dispatch and schedule | unlikely impact |
| e43f2042 | Fix recurring task double-enqueue race; removes RecurringTask#delay_from_now |
likely impact |
| 23100e0b | Support strict_loading_by_default |
unlikely impact |
| 42db5672 | Drop support for Ruby 3.1 | unlikely impact |
| 4f263b25 | Prevent wrong release of blocked jobs and semaphore corruption; removes ClaimedExecution#unblock_next_job |
likely impact |
| 40d6bd57 | Lease connections in DistinctValues |
unlikely impact |
| 6a2a201e | Supervisor replaces forks that fail to boot | unlikely impact |
| f8899dff | Boot guards managed by processes; renames process_startup_timeout → fork_boot_timeout (never released under the old name) |
unlikely impact |
| 222df7a1 | Add fiber execution mode for workers; SolidQueue::Pool reorganized |
likely impact |
| 1bf083f9 | Block on pending executions queue in fiber pool | unlikely impact |
| 944aa72d | Store only pool type and size in worker metadata (thread_pool_size removed) |
likely impact |
| 5048cd78 | Rely on configuration validation for worker execution options | unlikely impact |
| 50468fac | Start fiber pool reactor lazily | unlikely impact |
| 5270cc89 | Simplify worker initialization | unlikely impact |
| 000e8ba4 | Report errors escaping the execution future | unlikely impact |
| 30b92caf | Move fiber worker checks to Configuration |
unlikely impact |
| 9c0d5d32 | Reorganize execution pools under SolidQueue::Pool |
unlikely impact |
| 6816e52b | Include the error in fail_many_claimed events |
unlikely impact |
| 0526401f | Replace terminated forks even if releasing claimed jobs fails | unlikely impact |
| 174cb071 | Protect the shutdown reap from release failures | unlikely impact |
| fcb5f7ac | Name the supervisor's stop checkpoint | unlikely impact |
| 112bb1cb | Refine batch support (schema made optional) — see mitigation above | likely impact |
Note: bundle show --paths failed in several analysis subagents (Ruby 4.0.3 on the host vs 3.4.8 in .ruby-version), so gem-dependency directories were searched only where the bundle resolved. The patterns in question are SolidQueue internals that no fizzy dependency other than mission_control-jobs touches, and that gem was searched.
No Impact (Skipped)
33 commits assessed as "no impact" during recon (test-only changes, docs, CI, version bumps, Windows signal handling, generator-template default, --only-recurring flag, update generator scaffolding). Not analyzed against the app.
Recommended Upgrade Steps
- In the fizzy worktree, drop the git source for
solid_queueif theGemfilestill has one, keepgem "solid_queue", "~> 1.7", and runbundle update solid_queuefor both lockfiles (Gemfile.lockand, viaBUNDLE_GEMFILE=Gemfile.saasor the saas rake task,Gemfile.saas.lock). Confirm both resolve tosolid_queue (1.7.0)from rubygems. - Run
bin/rails solid_queue:updateto generatedb/queue_migrate/<timestamp>_add_batches_to_solid_queue.rb. Commit it. - Run
bin/rails db:migrateagainst the queue database, then dump or hand-updatedb/queue_schema.rbso fresh installs get the batches tables. Diff againstlib/generators/solid_queue/install/templates/db/queue_schema.rbat v1.7.0. - Run
bin/jobs checkto validateconfig/queue.ymlandconfig/recurring.ymlunder the new configuration parser (new in this range; exits 1 on errors). - Run the test suite, including
test/jobs/storage/*(thelimits_concurrencyjobs). - Deploy. Expect: one
SolidQueue.deprecatorwarning per dispatcher only if the migration has not yet run; new Sentry events withsource: "application.solid_queue"if any recurring enqueue fails; no change to recurring fire times (UTC before and after). - Post-deploy, optionally run
SolidQueue::Semaphore.where("value >limit")in a SaaS console and clear any rows left over from the pre-2124a51d permit leak. - Optional follow-up: add a
clear_solid_queue_finished_batchesrecurring task once batches are used.
🤖 Upgrade Plan: solid_cable c968ba77..v4.0.2Upgrade Plan: solid_cable c968ba77..v4.0.2 for fizzy
Summary
The range is one code change plus two version bumps: the listener's reconnect Context: why fizzy is on a git reffizzy commit
The worktree already has an uncommitted Commits Requiring MitigationNone. Analyzed — No App Impact
Detection pattern from the assessment ( No Impact (Skipped)2 commits assessed as "no impact" during recon ( Override AuditOverride surface inspected:
Residual delta: none. Nothing is broken, redundant, or inert. Advisories: no CVE/GHSA identifiers in the in-range assessments. Absence of an Recommended Upgrade Steps
No configuration, schema, or application code changes are required. |
ffeb7c6 to
6dac1ec
Compare
Both gems tracked edge commits for fixes that had not shipped yet: `solid_queue` since 4650909 for rails/solid_queue#747, and `solid_cable` since e1892a2 for the Rails edge Action Cable executor change. Both are now released, in `solid_queue` 1.7.0 and `solid_cable` 4.0.2. Pin both to rubygems releases. Solid Queue 1.7.0 adds optional batch tables, so add its generated migration under `db/queue_migrate/` and the re-dumped `db/queue_schema.rb`. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6dac1ec to
83c56dd
Compare
|
Deployed OK to staging. Looks good. |
Moves
solid_queueandsolid_cableoff their edge git pins and onto rubygems releases:solid_queuea8c89374(1.4.0, 2026-05-30) → 1.7.0, andsolid_cablec968ba77(4.0.0, 2026-06-26) → 4.0.2. Supersedes #3061 and #3057.solid_cachewas already on a release (~> 1.0, 1.0.10) and is untouched.Detail
Both pins existed to pick up a fix ahead of its release, and both fixes have since shipped:
solid_queuewas pinned in46509095for rails/solid_queue#747, the optional job argument to the adapter'sstopping?. That commit is the pinned SHA itself, and it is an ancestor ofv1.7.0.solid_cablewas pinned ine1892a23because released 4.0.0 called@serveron the subscription adapter after Rails edge removed it. Thepubsub_executorshim is inv4.0.2, a descendant of the pinned SHA.The
Gemfiledrops thegithub:sources forgem "solid_queue", "~> 1.7"andgem "solid_cable", "~> 4.0". Both lockfiles were resolved withbin/bundle-both update --conservative; no other gem moved.PLATFORMSis unchanged.Solid Queue 1.7.0 adds batches, which need two new tables and a
solid_queue_jobs.batch_idcolumn. Per UPGRADING.md the migration is optional until 2.0: until it runs,Batch.migrated?is false,batch_idis never written, and each dispatcher logs one deprecation warning at boot. This PR adds the migration anyway so we are not carrying that warning:db/queue_migrate/20260907161841_add_batches_to_solid_queue.rb, frombin/rails solid_queue:update. Every statement isif_not_exists: true, so it is a no-op on a database that loaded the new schema.db/queue_migrate/did not exist before; everydatabase*.ymlalready points thequeuedatabase'smigrations_pathsat it.db/queue_schema.rb, re-dumped from the SaaS development MySQL queue database after running the migration, so fresh installs get the tables. The schema version moves from1to the migration timestamp as a side effect of the dump.Deploy order does not matter: old code ignores the extra column, new code tolerates its absence.
Additional information
Upgrade analysis for both gems, per commit, is in
37signals-hqunderupgrade-analysis/fizzy-20260907-solid_queue_a8c89374..v1.7.0.md(65 commits: 1 definite, 6 likely, 25 unlikely, 33 no impact) andupgrade-analysis/fizzy-20260907-solid_cable_c968ba77..v4.0.2.md(3 commits, none affecting fizzy). The batches schema is the only mitigation. Behavior changes in range that need no code change:config.time_zoneand noTZin the container, so every schedule inconfig/recurring.ymlfires at the same UTC time as before.Rails.errorand will reach Sentry withsource: "application.solid_queue"(rails/solid_queue@dfc36448).signal_allno longer increments a semaphore past its limit (rails/solid_queue@2124a51d). This affectsStorage::ReconcileJobandStorage::MaterializeJob, which uselimits_concurrency. The fix does not repair rows already over the limit, soSolidQueue::Semaphore.where("value >limit")in a production console after deploy is worth a look.config/,lib/rails_ext/,saas/lib/yabeda/solid_queue.rb, orsaas/lib/fizzy/saas/engine.rbthat depends on anything the range changed.The new
bin/jobs checksubcommand fails in SaaS development becauseconfig.solid_queue.connects_tois only set inconfig/environments/production.rb, so it looks forsolid_queue_recurring_tasksin the primary database. That predates this change and does not affect production, whereconnects_tois set.The test environment uses
adapter: testfor Action Cable, so as withe1892a23the realsolid_cableadapter is only exercised on beta. Worth a WebSocket connect after deploying there.Checklist
bin/bundle-driftreports the lockfiles in sync;bin/bundler-audit check --updatereports no vulnerabilities;bin/rubocopcleanPLATFORMSunchanged frommainin both lockfilesref: https://app.fizzy.do/5986089/cards/5265
🤖 Generated with Claude Code