Uh oh!
There was an error while loading. Please reload this page.
fix(linstor): pre-flight check destination is a LINSTOR satellite before live migration - #13077
Conversation
…ore live migration LinstorDataMotionStrategy.copyAsync would call createResource on the destination pool's controller without first verifying that the destination KVM host is registered as a LINSTOR satellite there. Two failure modes: 1. The resource group's auto-placement filter happens to match a different node (a registered satellite that is NOT the migration destination), and the resource is silently created on the wrong node. The subsequent migrate then fails because the destination KVM host has no DRBD device for the resource. 2. The auto-placement filter has no candidates and the LINSTOR API returns an opaque error. The operator has to correlate the migration failure with an unrelated controller log entry to understand what happened. This change adds verifyDestinationIsLinstorSatellite() called at the top of copyAsync. For each LINSTOR-typed destination pool it: - fetches the controller's node list via LinstorUtil.getLinstorNodeNames - throws CloudRuntimeException with a clear actionable message (lists known satellites) if destHost.getName() is missing from that list - silently skips on transient controller errors so a network blip against the controller doesn't block an otherwise valid migration Non-LINSTOR destination pools in the volumeDataStoreMap are skipped (mixed-storage migrations are unaffected).
There was a problem hiding this comment.
Pull request overview
Adds a pre-flight validation to LINSTOR live migration to ensure the destination KVM host is registered as a LINSTOR satellite on the relevant controller(s), so migrations fail fast with an actionable error instead of failing later via LINSTOR auto-placement.
Changes:
- Introduces
verifyDestinationIsLinstorSatellite(...)to query LINSTOR node lists per destination pool/controller. - Calls the pre-flight check at the start of
copyAsync(...)to abort early with a clearCloudRuntimeExceptionwhen the destination host is not a satellite.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@## main #13077 +/- ##
============================================
- Coverage 18.02% 18.02% -0.01% + Complexity 16621 16620 -1
============================================
Files 6029 6029 Lines 542184 542210 +26 Branches 66451 66455 +4 ============================================
- Hits 97740 97737 -3 - Misses 433428 433457 +29
Partials 11016 11016
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
rp-
commented
May 5, 2026
LGTM |
sureshanaparti
commented
May 5, 2026
@blueorangutan package |
blueorangutan
commented
May 5, 2026
@sureshanaparti a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress. |
blueorangutan
commented
May 5, 2026
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 17716 |
jmsperu
commented
May 9, 2026
Thanks @rp- and @sureshanaparti — should be ready to merge whenever convenient. |
sureshanaparti
commented
May 9, 2026
@blueorangutan test |
blueorangutan
commented
May 9, 2026
@sureshanaparti a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests |
blueorangutan
commented
May 9, 2026
[SF] Trillian test result (tid-16060)
|
Uh oh!
There was an error while loading. Please reload this page.
Summary
LinstorDataMotionStrategy.copyAsync(added in #12830 / Jan 29 2026) callsLinstorUtil.createResourceon the destination pool's controller without first verifying the destination KVM host is registered as a LINSTOR satellite there. Two failure modes follow:We've hit (1) on host-5 → host-6 migrations where host-6 was not registered as a LINSTOR satellite. The migration logs were unhelpful.
Change
Adds
verifyDestinationIsLinstorSatellite()called at the top ofcopyAsync. For each LINSTOR-typed pool involumeDataStoreMap:LinstorUtil.getLinstorNodeNamesdestHost.getName()is missing from the list, throwsCloudRuntimeExceptionwith a clear actionable message that lists the known satellites and tells the operator to eitherlinstor node createor pick a different destinationNon-LINSTOR destination pools are skipped (mixed-storage migrations are unaffected).
Test plan