From ce0f965ad78f6806610b4bc2a63ac40a9bd9fe59 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 30 Jun 2026 10:39:04 +0800 Subject: [PATCH] [migration]: Fix storage migration host filters Introduce MigrateVolume host allocation semantics for storage migration so running VMs get KVM host property checks while stopped VMs skip runtime component version filtering. Resolves: ZSTAC-75332 Change-Id: I6c393d7ec962d71fb5437d7a41d0891deb7abae7 --- .../AttachedVolumePrimaryStorageAllocatorFlow.java | 2 +- .../allocator/HostPrimaryStorageAllocatorFlow.java | 6 +++--- .../java/org/zstack/header/vm/VmInstanceConstant.java | 1 + .../zstack/kvm/KVMHostAllocatorFilterExtensionPoint.java | 8 +++++++- .../primary/local/LocalStorageAllocatorFactory.java | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java index ed8ff7c9e05..ecfeaf8b2bc 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java @@ -31,7 +31,7 @@ public class AttachedVolumePrimaryStorageAllocatorFlow extends AbstractHostAlloc public void allocate() { throwExceptionIfIAmTheFirstFlow(); - if (VmOperation.NewCreate.toString().equals(spec.getVmOperation())) { + if (VmOperation.NewCreate.toString().equals(spec.getVmOperation()) || VmOperation.MigrateVolume.toString().equals(spec.getVmOperation())) { next(candidates); return; } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java index b2ace6d403b..81157e217c0 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java @@ -141,11 +141,11 @@ private List filterHostHavingAccessiblePrimaryStorage(List huuid private List allocateFromCandidates() { List huuids = getHostUuidsFromCandidates(); Set requiredPsUuids = spec.getRequiredPrimaryStorageUuids(); - if (!VmOperation.NewCreate.toString().equals(spec.getVmOperation())) { - return filterHostHavingAccessiblePrimaryStorage(huuids, spec); - } else { + if (VmOperation.NewCreate.toString().equals(spec.getVmOperation()) || VmOperation.MigrateVolume.toString().equals(spec.getVmOperation())) { huuids = filterHostHavingAccessiblePrimaryStorage(huuids, spec) .stream().map(ResourceVO::getUuid).collect(Collectors.toList()); + } else { + return filterHostHavingAccessiblePrimaryStorage(huuids, spec); } if (huuids.isEmpty()) { diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index 896e60e414e..ec6cb7a2daf 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -59,6 +59,7 @@ enum VmOperation { Reboot, Destroy, Migrate, + MigrateVolume, AttachVolume, AttachNic, ChangeNicNetwork, diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAllocatorFilterExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAllocatorFilterExtensionPoint.java index 5c12980bb50..0e9dc85d551 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAllocatorFilterExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAllocatorFilterExtensionPoint.java @@ -5,6 +5,8 @@ import org.zstack.header.allocator.HostAllocatorSpec; import org.zstack.header.host.HostVO; import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceConstant.VmOperation; +import org.zstack.header.vm.VmInstanceState; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -171,7 +173,11 @@ public List filterHostCandidates(List candidates, HostAllocatorS return candidates; } - if (!VmInstanceConstant.VmOperation.Migrate.toString().equals(spec.getVmOperation())) { + if (!VmOperation.Migrate.toString().equals(spec.getVmOperation()) && !VmOperation.MigrateVolume.toString().equals(spec.getVmOperation())) { + return candidates; + } + + if (VmInstanceState.Stopped.toString().equals(spec.getVmInstance().getState())) { return candidates; } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java index 9d84ec2a0fc..3a2a861ff98 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java @@ -107,7 +107,7 @@ public boolean stop() { public List filterHostCandidates(List candidates, HostAllocatorSpec spec) { long reservedCapacity = SizeUtils.sizeStringToBytes(PrimaryStorageGlobalConfig.RESERVED_CAPACITY.value()); - if (VmOperation.NewCreate.toString().equals(spec.getVmOperation())) { + if (VmOperation.NewCreate.toString().equals(spec.getVmOperation()) || VmOperation.MigrateVolume.toString().equals(spec.getVmOperation())) { List huuids = getNeedCheckHostLocalStorageList(candidates, spec); if (huuids.isEmpty()) { return candidates;