chore: 2.9.6-rc.0 release with soft_purge fix for hot-path modules#1001
Open
mentels wants to merge 3 commits into
Open
chore: 2.9.6-rc.0 release with soft_purge fix for hot-path modules#1001mentels wants to merge 3 commits into
mentels wants to merge 3 commits into
Conversation
Under pgbench load, the 2.9.0 -> 2.9.5 soft deploy killed ~170 client connections at the moment `release_handler:make_permanent/1` ran. The kill mechanism is `code:purge/1` against ClientHandlers that were blocked inside `:gen_statem.call(db_handler, ...)` while DbHandler was sys:suspended -- they have `Supavisor.ClientHandler.*` frames on their stack and so count as "lingerers" subject to the deferred brutal_purge. Switching PostPurge to soft_purge for ClientHandler, DbHandler, ClientHandler.Error, and ClientHandler.Checks makes make_permanent skip the kill: both code versions stay resident until the next relup naturally drains them. Suspend/resume of DbHandler is kept -- it's not the source of the kill. Applied to relups 2.9.0-2.9.5, 2.9.0-rc.4-2.9.5, 2.9.1-2.9.5, and 2.9.2-2.9.5. The 2.9.4-2.9.5 relup is runtime-config-only and needs no change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bumps VERSION to 2.9.6-rc.0 and adds relups/<from>-2.9.6-rc.0/ for each from-version targeting 2.9.5 (2.9.0, 2.9.0-rc.4, 2.9.1, 2.9.2, 2.9.4). The new appups are copies of their 2.9.5 counterparts with the outer release tuple and apply_runtime_config/reconsolidate_inspect to-version strings updated to "2.9.6-rc.0". The 2.9.5 relups are left in place so a to-2.9.5 upgrade with the soft_purge fix remains possible if needed. Plan: tag this branch as v2.9.6-rc.0, test in staging, then a follow-up commit bumps to v2.9.6. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mix.exs:151 split the appup filename on every "-" and pattern-matched exactly two elements, which blows up on filenames like supavisor-2.9.6-rc.0.appup → ["supavisor", "2.9.6", "rc.0"]. Use parts: 2 so the first "-" is the app/version separator and everything after stays as the version string. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0idpwn
reviewed
May 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps to 2.9.6-rc.0 and switches
ClientHandler,DbHandler,ClientHandler.Error,ClientHandler.Checkstosoft_purge(PostPurge) in the relup appups.Under load, the deferred
code:purge/1insiderelease_handler:make_permanent/1kills ClientHandlers blocked in:gen_statem.call(db_handler, …)during the suspended-DbHandler window — they haveSupavisor.ClientHandler.*frames on their stack and count as "lingerers".soft_purgemakesmake_permanentskip the kill; both code versions stay resident until the next relup drains the old one. Suspend/resume kept; all other modules staybrutal_purge.The 2.9.5 relups are also patched in-place so a to-2.9.5 upgrade with the fix remains possible.
Also fixes
mix.exs:151so the appup-copy step survives hyphenated to-versions: the filename split now usesparts: 2, otherwisesupavisor-2.9.6-rc.0.appupwould parse as["supavisor", "2.9.6", "rc.0"]and crash the release build with aMatchError.Plan: tag this branch as v2.9.6-rc.0, validate in staging, then a follow-up commit bumps to v2.9.6.