fix(octavia): carry lb-mgmt state across a roll and target the real health-manager nodes - #1498
Open
traviswu-bigstack wants to merge 2 commits into
Open
traviswu-bigstack wants to merge 2 commits into
traviswu-bigstack wants to merge 2 commits into
Conversation
traviswu-bigstack
force-pushed
the
fix/octavia-lb-mgmt-ids-roll-and-hm-endpoints
branch
from
September 21, 2026 09:28
6e7d619 to
0dfec72
Compare
The list was built from cubesys.control.addrs, but CommitService starts octavia-health-manager on the first three compute nodes. On a split control/compute cluster every amphora was told to heartbeat to addresses no node carries, so amphora_health stayed empty and automatic failover could never trigger. Derive it from the nodes that run a health manager instead, via cubectl's node list, and keep the current value when that cannot be read. Fixes #1497 Signed-off-by: Travis Wu <travis.wu@bigstack.co>
…mt ids A roll boots a freshly installed slot whose shipped octavia.conf has no amp_boot_network_list / amp_secgroup_list, so Init() loads an empty oldCfg and the carry-forward copies empty strings on every rolled node, computes included. Migrate octavia.conf across the slot swap. cfg is rebuilt from the .def on every commit and the current file only feeds oldCfg, so nothing in the migrated copy outlives the first bootstrap except the carried keys. Fixes #1496 Signed-off-by: Travis Wu <travis.wu@bigstack.co>
traviswu-bigstack
marked this pull request as ready for review
September 21, 2026 09:49
traviswu-bigstack
force-pushed
the
fix/octavia-lb-mgmt-ids-roll-and-hm-endpoints
branch
from
September 21, 2026 09:49
0dfec72 to
feb9de3
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.
What type of PR is this?
/kind bug
What this PR does / why we need it
Two octavia per-node config defects found by QA on the 3c2p testbed while verifying #1322
against
CUBE_3.1.10_20260903-1323_66cd48a. Both are the same shape — a cluster-discovered valuethat the commit path must never author — and they touch the same code.
1. A firmware roll blanks both lb-mgmt ids (#1496).
octavia.confis not in the module'smigrate set, and the shipped file does not contain the two keys at all. A roll boots a freshly
installed slot, so
Init()loads that file intooldCfgand the carry-forward added by #1302copies an empty string. It behaves exactly as written; on a rolled slot there is nothing to carry
forward. This is role-independent, which is why a compute node was hit — something the original
InitCheck()defect could not explain.Not a regression from #1302. The pre-#1302 gate was
if (s_bInit) carry-forward; else blank,and since
Configsis a nestedstd::map,oldCfg[...]default-constructs""on a rolled slot —so both branches produced empty there too. What #1302 changed is observability: before it,
non-master control nodes were blanked by every commit and had no known-good baseline to compare a
roll against.
Fixed with
CONFIG_MIGRATE(octavia, CONF).Init()rebuildscfgfrom the.defon everycommit and reads the current
octavia.confonly asoldCfg, so migrating it feeds the existingcarry-forward and nothing else: the first bootstrap on the rolled slot rewrites the file from the
new release's
.def, so no stale keys survive across releases.MainMigrateruns the new slot'sbinary against the previous root, so the upgrade that delivers this fix is covered too.
2.
controller_ip_port_listnamed the wrong nodes (#1497). The list was built fromcubesys.control.addrs, butCommitServicestartsoctavia-health-managerunderif (IsCompute(...)). On the testbed all five nodes carried10.254.0.11/.12/.13:5555while the only health managers were on p4 (.14) and p5 (.15) —amphora_healthhad 0 rows and no failover could ever trigger. #1302's defect-3 fix corrected thecardinality of this list but not its source set. Invisible on converged 1cc/3cc, where control and
compute are the same machines.
Derived from the nodes that actually run a health manager instead, via
cubectl's node list(backed by
/etc/settings.cluster.json, whichconfig_clusteralready migrates, so it resolves ona rolled slot), keeping the current value when it cannot be read.
Which issue(s) this PR fixes
Fixes #1496
Fixes #1497
Special notes for your reviewer
Additional documentation
🤖 Generated with Claude Code