doc: design for the cluster-controller legacy removal (reference only, do not merge) - #38105
Draft
aljoscha wants to merge 1 commit into
Draft
doc: design for the cluster-controller legacy removal (reference only, do not merge)#38105aljoscha wants to merge 1 commit into
aljoscha wants to merge 1 commit into
Conversation
aljoscha
force-pushed
the
aljoscha/cluster-legacy-05-design
branch
from
August 7, 2026 08:00
fe7b182 to
9115d15
Compare
aljoscha
force-pushed
the
aljoscha/cluster-legacy-05-design
branch
from
August 7, 2026 08:01
9115d15 to
22fc831
Compare
aljoscha
force-pushed
the
aljoscha/cluster-legacy-05-design
branch
from
August 7, 2026 08:28
22fc831 to
ac35289
Compare
aljoscha
force-pushed
the
aljoscha/cluster-legacy-05-design
branch
from
August 7, 2026 08:45
ac35289 to
791c952
Compare
…onfig paths Records the design the four changes below this one implement, and what the implementation settled that the design left open (the folded cut-over target, the reconcile-kernel reuse, and how a cut-over settles a carried record). Reference only, not intended to merge.
aljoscha
force-pushed
the
aljoscha/cluster-legacy-05-design
branch
from
August 7, 2026 10:05
791c952 to
8847a3b
Compare
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.
Not intended to merge. This sits on top of the stack purely as reference for
what the four changes below it did and why. Read it first, merge it last or
never.
If you'd rather it landed — the repo does keep design docs under
doc/developer/design/— say so and I'll move it back to the bottom of thestack so it merges ahead of the code. There's a real argument for it: the
"what stays, and why" and "alternatives" sections answer questions that will
come up again the next time someone touches this area, and a commit message
is a worse place to keep them.
The stack, in merge order
adapter: remove ENABLE_CLUSTER_CONTROLLER and the legacy REFRESH scheduleradapter: let the cluster controller own system clustersadapter: delete the staged cluster reconfiguration machinesql: accept WITH (WAIT ...) on ALTER CLUSTER unconditionallyWhat the design says
The cluster controller has been merged and default-on since v26.29, but it
still lived behind the
ENABLE_CLUSTER_CONTROLLERbreak-glass dyncfg, andsystem clusters were excluded from its ownership. Those two facts kept three
legacy code paths alive: the REFRESH scheduler, the staged
(
WaitForHydrated/Finalize/-pending) reconfiguration machine, and thesequencer's own replica create/drop implementation for system clusters.
The doc walks each part, and carries two sections that are the reason it exists
at all rather than being folded into commit messages: "What stays, and why"
(the four things that look deletable and are not) and "Alternatives" (in
particular why deleting the direct reshape path entirely was rejected, which is
the load-bearing decision in part 3).
Amended to match what shipped
The design left some things open that the implementation had to settle, and one
thing it specified turned out to be wrong. Both are now recorded here, so this
document describes what we built rather than what we first proposed:
config". A statement that mentions one shape dimension while a
reconfiguration is in flight would then have silently reverted the in-flight
transition along every dimension it did not mention — the exact failure the
record path's fold semantics exist to prevent. Both paths now share
alter_reconfiguration_target."drop the observed owned replica set and recreate it", which would cold-restart
a replica that already had the target shape, making a forced commit of a
stuck-but-hydrating resize more disruptive than letting the controller do
it, and turning a cancel into a full bounce of a healthy replica set. That
contradicts the design's own "same outcome, minus the tick" justification, so
the cut-over now converges via the controller's
reconcile_replicaskernel.unconditionally. It now settles
Finalized { forced: true }when the cut-overlanded on the record's own target, and
Cancelledotherwise.in.