EVE-k: gate storage readiness correctly and report it truthfully - #6240
EVE-k: gate storage readiness correctly and report it truthfully#6240eriknordmark wants to merge 9 commits into
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #6240 +/- ##
==========================================
+ Coverage 24.27% 24.72% +0.45%
==========================================
Files 512 524 +12
Lines 93831 95656 +1825
==========================================
+ Hits 22777 23655 +878
- Misses 69251 69998 +747
- Partials 1803 2003 +200 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Record the 2026-07-30 replay of the lf-edge#5971 segment and drop the local CDI CR fix, which the PR now handles itself: CDI is split into cdi-operator and cdi components joined by a CDIOperatorReady signal, and a BestEffort timeout hands the component to a retry loop that applies the CR without re-awaiting the signal. Three local fixes remain. Also list lf-edge#6240, which the branch already carried. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Record the 2026-07-30 replay of the lf-edge#5971 segment and drop the local CDI CR fix, which the PR now handles itself: CDI is split into cdi-operator and cdi components joined by a CDIOperatorReady signal, and a BestEffort timeout hands the component to a retry loop that applies the CR without re-awaiting the signal. Three local fixes remain. Also list lf-edge#6240, which the branch already carried. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
andrewd-zededa
left a comment
There was a problem hiding this comment.
Can we subscribe to longhorn readiness in the future and republish VolumeMgrStatus if there are future longhorn control plane issues?
| Name: agentName, | ||
| Initialized: true, | ||
| Initialized: ctx.storageReady, | ||
| UnmetCondition: ctx.storageUnmet, |
There was a problem hiding this comment.
I don't see anyone using this field yet, is there a consumer coming in another PR?
There was a problem hiding this comment.
No consumer — and Initialized right above it has never had one either; nodeagent is the only subscriber and reads just RemainingSpace. The motivation is making the state available to tests and diagnosis: the status lands in /run/volumemgr/VolumeMgrStatus/volumemgr.json, so a test can ssh in and assert on it, and collect-info picks it up in the bundle.
Adding diag as a consumer was easy, so I've done it here — it prints a warning naming the outstanding gate when cluster storage didn't become usable.
Nothing reports this to the controller today: ZInfoClusterNode carries only the node_status enum and pillar doesn't populate it, so that's an eve-api change and a separate PR. Let's discuss what else we'd want in the API in this area. One thing to design around: these two fields are a one-shot startup outcome, not a live condition — volumemgr decides once after its wait and republishes the same value.
7adbdb8 to
ef79fba
Compare
An EVE-k node reports cluster storage as ready while it still cannot attach any volume, so the first app deployed after a conversion or a fresh install sits in volume creation for minutes while its CDI upload pod repeats "volume ... is not ready for workloads". Readiness gated only on the Longhorn DaemonSets, but a volume's engine and replica processes run inside the per-node instance-manager pod, which is owned by an InstanceManager CR and so was never examined. That pod is typically still pulling its ~440 MB image when the DaemonSets go ready: 9m51s on one device here, and over twenty minutes on slower storage. Require a running InstanceManager for this node in both the pillar and the shell readiness paths. Longhorn creates the CR during node setup rather than on first volume request, so waiting on it cannot deadlock against a volume whose own creation is gated on storage readiness. Cherry-picked from lf-edge#6259, with one branch-local adjustment: the two positive daemonset tests stub the instance-manager gate, since a fake clientset cannot supply the kubeconfig the real gate builds its Longhorn client from. Those tests arrive with lf-edge#6240, which this branch also carries, so the interaction only shows up here. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An EVE-k node reports cluster storage as ready while it still cannot attach any volume, so the first app deployed after a conversion or a fresh install sits in volume creation for minutes while its CDI upload pod repeats "volume ... is not ready for workloads". Readiness gated only on the Longhorn DaemonSets, but a volume's engine and replica processes run inside the per-node instance-manager pod, which is owned by an InstanceManager CR and so was never examined. That pod is typically still pulling its ~440 MB image when the DaemonSets go ready: 9m51s on one device here, and over twenty minutes on slower storage. Require a running InstanceManager for this node in both the pillar and the shell readiness paths. Longhorn creates the CR during node setup rather than on first volume request, so waiting on it cannot deadlock against a volume whose own creation is gated on storage readiness. Cherry-picked from lf-edge#6259, with one branch-local adjustment: the two positive daemonset tests stub the instance-manager gate, since a fake clientset cannot supply the kubeconfig the real gate builds its Longhorn client from. Those tests arrive with lf-edge#6240, which this branch also carries, so the interaction only shows up here. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Record lf-edge#6259 and the two source PRs the table never listed (lf-edge#6240, lf-edge#6242), note that lf-edge#6063 is now 17 commits, and mark the CDI upload-pod teardown logging as upstream in master rather than branch-local. Add the lf-edge#6240/lf-edge#6259 test interaction and the rebase-due note: master is 63 commits ahead of the shared merge-base. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Record lf-edge#6259 and the two source PRs the table never listed (lf-edge#6240, lf-edge#6242), note that lf-edge#6063 is now 17 commits, and mark the CDI upload-pod teardown logging as a pre-merge copy of an upstream commit. Add the lf-edge#6240/lf-edge#6259 test interaction and the rebase-due note: master is 63 commits ahead of the shared merge-base. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Record lf-edge#6259, note that lf-edge#6063 is now 17 commits, refresh lf-edge#6240's head, and mark the CDI upload-pod teardown logging as a pre-merge copy of an upstream commit. Spell out why lf-edge#6242 is not replayed here and that its NAD-CRD race is still open in the Go ApplyMultusCNI. Add the lf-edge#6240/lf-edge#6259 test interaction and the rebase-due note: master is 63 commits ahead of the shared merge-base. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Record lf-edge#6259, note that lf-edge#6063 is now 17 commits, refresh lf-edge#6240's head, and mark the CDI upload-pod teardown logging as a pre-merge copy of an upstream commit. Spell out why lf-edge#6242 is not replayed here and that its NAD-CRD race is still open in the Go ApplyMultusCNI. Add the lf-edge#6240/lf-edge#6259 test interaction and the rebase-due note: master is 63 commits ahead of the shared merge-base. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nset tests lf-edge#6259 makes checkLonghornReady call instanceManagerReady, which builds a Longhorn client from the on-device kubeconfig; lf-edge#6240's two positive daemonset tests drive checkLonghornReady with a fake clientset that cannot supply one. Neither PR sees this alone. Integration-branch only: whichever PR merges second upstream must carry the stub itself. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
An EVE-k node reports cluster storage as unready, and every app volume stays in CREATING_VOLUME, whenever any DaemonSet in the longhorn-system namespace lacks a Running-and-Ready pod on this node -- including DaemonSets that Longhorn does not own and that are never expected to become ready. The readiness check iterated over every DaemonSet in the namespace and required each one to be healthy, consulting its list of expected DaemonSets only afterwards to confirm those three exist. In practice this is reached through EVE's own collect-info, which leaves a SupportBundle agent DaemonSet behind; the node then refuses to serve volumes for as long as that object exists, with no way for an operator to tell why. Restrict the per-node health requirement to the DaemonSets Longhorn is expected to run, and skip anything else sharing the namespace. Restricting the loop also removes a second false failure: a DaemonSet whose node selector legitimately excludes this node reported zero pods here and was treated as missing. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
dc8490c to
463d95f
Compare
On an EVE-k node volumemgr waits up to 40 minutes for the cluster to be
able to serve a volume, and then reports Initialized regardless of how
that wait ended. A node whose Longhorn or CDI never came up is therefore
indistinguishable, from the outside, from a healthy one -- the only
difference is a line in volumemgr's own log. Anything consuming the
status, an operator inspecting it, or a test asserting on it is misled
in precisely the case that matters.
Report the outcome instead: Initialized now reflects whether cluster
storage became usable, and a new UnmetCondition carries the gate that
was still outstanding, reusing the sub-condition the kubernetes wait
already computes ("longhorn not ready: ...", "kubevirt not ready: ...").
Nodes that are not EVE-k have no such gate and are Initialized from the
start, as before.
Volumes are unaffected either way: they are gated separately and defer
and retry until storage appears.
Signed-off-by: eriknordmark <erik@zededa.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An EVE-k node whose cluster storage never converged looks healthy from the console: applications that need a volume simply sit waiting, and nothing in the diag summary says why. Now that volumemgr reports that outcome, diag subscribes to VolumeMgrStatus and prints a warning naming the gate that was still outstanding when storage failed to become usable at startup. A healthy node, and any device that is not EVE-k, prints nothing extra. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
463d95f to
10de67e
Compare
diag is the only operator-facing summary of device health -- controller connectivity, attestation and vault state, applications, cluster storage -- and none of it reaches the EVE API, so nothing noticed when it lost a section, went silent, or filled with errors on a healthy device. Add a test that deploys an application and reads the summary the way a consumer does, through the metadata server at GET /eve/v1/diag, asserting that a healthy onboarded device reports itself online and connected, lists its management port as up, and lists the deployed application as running. It also cross-checks the storage state against volumemgr's own publication. This is the first coverage of msrv's diag handler as well. A device that reaches the controller takes the short path through the port section, so the per-port detail and the "all management ports passed" verdict are absent from a healthy summary; the assertions match the lines that path actually emits. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An EVE-k node reported its storage readiness only after both startup waits had resolved, because the status went out from the disk-metrics task and that task starts once the waits are over. On a node whose Longhorn or CDI never converges those waits run for tens of minutes, and for all of that time diag showed nothing at all -- indistinguishable from a node where volumemgr had not started. Publish VolumeMgrStatus from its own task, started before the waits, and report "waiting for cluster storage" while a wait is still running so an operator can tell a converging node from one that gave up. Its inputs are empty that early, which leaves the reported remaining space an overestimate rather than a zero, so nodeagent cannot mistake it for a full disk. The readiness fields are now read from a second goroutine, hence the mutex, and the two test context helpers return a pointer so vet's copylocks stays quiet. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
An EVE-k node reports cluster storage as ready while it still cannot attach any volume, so the first app deployed after a conversion or a fresh install sits in volume creation for minutes while its CDI upload pod repeats "volume ... is not ready for workloads". Readiness gated only on the Longhorn DaemonSets, but a volume's engine and replica processes run inside the per-node instance-manager pod, which is owned by an InstanceManager CR and so was never examined. That pod is typically still pulling its ~440 MB image when the DaemonSets go ready: 9m51s on one device here, and over twenty minutes on slower storage. Require a running InstanceManager for this node in both the pillar and the shell readiness paths. Longhorn creates the CR during node setup rather than on first volume request, so waiting on it cannot deadlock against a volume whose own creation is gated on storage readiness. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Waiting for the instance-manager made an EVE-k node with two-disk ZFS storage fail to bring up cluster storage at all: the readiness poll bounds the node, kubevirt and Longhorn checks with one 20-minute deadline, and the instance-manager pod alone pulls a ~440 MB image that takes over twenty minutes on that topology. The poll expired, volumemgr never initialised, and every app volume stayed uncreatable -- worse than the premature-ready behaviour the instance-manager check exists to fix. Give the poll a longer deadline when the caller waits on Longhorn, and keep the original budget otherwise. The single-disk topologies pull the same image in under nine minutes and were never close to the limit; only the slowest storage layout crossed it. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
10de67e to
671d7bc
Compare
Replaces the three lf-edge#6271 kubevirt commits with lf-edge#6257 at df8ae7c plus the two of them that survive on top of it, since lf-edge#6257 fixes the VMIRS-delete logging the same way and rewrites Info to derive DomainId from a live Get rather than vmiList. Adds the proposed volumemgr readiness-publish follow-up to lf-edge#6240. Also records that lf-edge#5971 and rucoder#3 are held at the tips the 7/7 image used rather than caught up, so the bring-up baseline is not a variable in this run. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two waits run back to back on an EVE-k node before volumemgr proceeds: kubeapi's readiness poll, and then a second one that blocks until Longhorn and CDI can actually serve a volume. Only the first was widened when the Longhorn instance-manager pull turned out to run past 20 minutes; the second kept an unexplained 20-minute cap of its own, so the same contended link that justified the first budget could still expire the second and leave every volume to defer and retry. Name the bound and raise it to 30 minutes. By the time this wait starts the node and Longhorn are up, so what remains is mostly CDI, and its images are what the slow half of a first boot spends its time on. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
volumemgrstatus.go used ctx for its plain functions and ctxPtr for its method receivers, though both name the same *volumemgrContext. Settle on ctx throughout the file. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
lf-edge#6240 changed initStatusCtx to return *volumemgrContext so the subscriptions it registers and the caller share one context; lf-edge#6257's new test was written against master, where the helper still returns a value, so it takes the address at every call site and no longer compiles here. Drop the & at those call sites. Integration-branch only: the fix belongs in lf-edge#6257 once it rebases onto lf-edge#6240. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
lf-edge#6240 changed initStatusCtx to return *volumemgrContext so the subscriptions it registers and the caller share one context; lf-edge#6257's new test was written against master, where the helper still returns a value, so it takes the address at every call site and no longer compiles here. Drop the & at those call sites. Integration-branch only: the fix belongs in lf-edge#6257 once it rebases onto lf-edge#6240. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
lf-edge#6240 changed initStatusCtx to return *volumemgrContext so the subscriptions it registers and the caller share one context; lf-edge#6257's new test was written against master, where the helper still returns a value, so it takes the address at every call site and no longer compiles here. Drop the & at those call sites. Integration-branch only: the fix belongs in lf-edge#6257 once it rebases onto lf-edge#6240. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
Rewrite from current content: base master, the source set with each PR's ref and tip, the branch-local changes, and the standing gotchas. lf-edge#6259 is gone as a separate entry -- it closed unmerged and its instance-manager gate is part of lf-edge#6240 now. Signed-off-by: eriknordmark <erik@zededa.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: eriknordmark <erik@zededa.com>
a9f4e85 to
cad6c2c
Compare
Description
On an EVE-k node, cluster storage could be blocked forever by a daemonset that is
none of Longhorn's, be declared ready before the node could actually serve a volume,
and report success either way. Three related fixes, plus the reporting that makes the
outcome visible.
Nothing but Longhorn's own daemonsets gates storage.
checkLonghornReadysweptevery daemonset in
longhorn-systemand required each to be Ready on this node. EVE'scollect-info leaves a SupportBundle agent daemonset behind there which never becomes
Ready, so a single leaked object blocked every volume on the node for as long as it
existed. Only the three expected daemonsets gate readiness now.
A running instance-manager is required before storage counts as ready. Longhorn
runs a volume's engine and replica processes inside the instance-manager pod, so the
node cannot serve any volume until one is running — and because that pod is owned by an
InstanceManagerCR rather than a DaemonSet, the daemonset sweep never observed it.Both the shell and pillar readiness paths now wait for it.
Both ready budgets absorb it. That pod pulls a ~440 MB image: measured at 8m20s and
8m41s on single-disk topologies, and over 20 minutes on two-disk ZFS, which alone
exhausted the old 20-minute budget and left nothing for the node and kubevirt checks
ahead of it. kubeapi's readiness poll is widened to 45 minutes, but only when Longhorn
is in the predicate.
Two waits run back to back before volumemgr proceeds, and only the first was widened
originally. The second — the one that blocks until Longhorn and CDI can actually serve
a volume — kept an unexplained 20-minute cap of its own, so the same contended link
could still expire it and leave every volume to defer and retry. It is now a named
bound at 30 minutes: by the time it starts the node and Longhorn are up, so what
remains is mostly CDI, whose images are what the slow half of a first boot spends its
time on.
And volumemgr says what happened.
VolumeMgrStatus.Initializedwas hardcoded true,so a node whose storage never came up was indistinguishable from a healthy one. It now
reports the truth along with
UnmetCondition, the gate still outstanding, and diagsurfaces it. The status is published from its own task started before the readiness
waits, so a node stuck on those waits says which gate it is on instead of publishing
nothing for tens of minutes — the waits can run the better part of an hour, and that was
exactly the window with no reporting.
PR dependencies
None. This PR supersedes #6259, whose two commits are included here: the
instance-manager gate and the widened budget. #6259 is closed in favour of this one.
They were merged because they cannot land independently: #6259 makes
checkLonghornReadyend in the instance-manager gate, whose real implementation buildsa Longhorn client from the on-device kubeconfig, while this PR's two positive
checkLonghornReadytests drive that function with a fake clientset. Whichever landedsecond would have turned those tests red, and CI on the first could not have warned.
Carrying both here lets the stub that resolves it (
kubeapi: stub the instance-manager gate in the daemonset tests, folded into the gate commit) ship with the change thatneeds it.
How to test and validate this PR
go build -tags k ./...,go vet -tags k ./kubeapi/... ./cmd/volumemgr/... ./cmd/diag/...and
go test -tags k ./kubeapi/... ./cmd/volumemgr/... ./cmd/diag/...underpkg/pillar.The
ktag is required: this code is behind//go:build k, and a build without itcompiles none of it while still reporting success. Every commit in the series is green on
its own.
New unit tests: the stray-daemonset case and the three daemonset-failure cases; the
instance-manager state mapping and its list-error path; the readiness budget selection;
the reported status for ready / unmet / still-waiting; and the diag warning's presence,
absence and pre-publication silence.
evetest/tests/diagcovers the summary end to end.On an EVE-k device the observable effects are:
cat /run/volumemgr/VolumeMgrStatus/volumemgr.jsonreportsInitialized: falsewithan
UnmetConditionnaming the outstanding gate while storage is not usable, and doesso during the wait rather than only after it resolves.
diagprintsWARNING: cluster storage not ready: <condition>in that state.longhorn-support-bundle-agentdaemonset present, volumes are creatednormally instead of stalling in
CREATING_VOLUME.Result in the kvm→k conversion matrix
The stray-daemonset fix, the truthful reporting and the readiness-publish task were
carried in integration image
0.0.0-newgo-allprs2-f40d7876through the 7-legEVE-kvm→EVE-k conversion matrix: 7/7, every leg faster than on the two previous
green images of that line. That image also carries #5971, so it exercises the pillar
readiness paths against the Go
kube-initbring-up. It is a no-regression result ratherthan a targeted test of these fixes; the targeted evidence is the unit and evetest
coverage above.
Changelog notes
On EVE-k, a leaked daemonset in the
longhorn-systemnamespace no longer preventsvolumes from being created, storage is not declared ready until the node can actually
serve a volume, and a node whose cluster storage did not come up now reports that
instead of reporting success.
PR Backports
daemonset blocks all volumes on affected nodes today.
Checklist
Reasons for the unchecked boxes:
pkg/pillar/docs/volumemgr.mdgains the readinessfields, but there is no new operator knob to document beyond that. Exercised on an amd64
EVE-k node via the conversion matrix above; arm64 untested. Labels left as they are.
Relationship to #6257
This PR does not carry the orphaned-PVC reclaim (
gcPVCsincmd/volumemgr/initialvolumestatus.go). That work is #6257's — it is thecounterpart to the stale-generation purge sweep introduced there, and it is
kept in one place so the two cannot drift apart.
The reclaim was briefly carried here and has been removed, because #6240 and
#6257 are siblings off master and both touch volumemgr: carrying it in both
means any branch integrating the two gets it twice, under different SHAs, and
has to dedup by hand. Integration branches should take it from #6257 —
#6271 is based on #6257 and delivers it transitively.
No code dependency in either direction: this PR builds and tests standalone
on master.