From a5ce8f3b4a7cc7c661c9eede23cff8e0cf6d65db Mon Sep 17 00:00:00 2001 From: Haidong Pang Date: Fri, 15 May 2026 20:02:11 +0800 Subject: [PATCH 1/2] [vm]: handle missing VM in StopVmGC Resolves: ZSTAC-84158 Change-Id: I134a9c60e40d5bc9f4ad2b3cc27424b29858f0a9 --- .../src/main/java/org/zstack/compute/vm/StopVmGC.java | 11 +++++++++++ .../org/zstack/header/vm/StopVmOnHypervisorMsg.java | 9 +++++++++ .../main/java/org/zstack/kvm/KVMAgentCommands.java | 10 ++++++++++ plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 1 + 4 files changed, 31 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/vm/StopVmGC.java b/compute/src/main/java/org/zstack/compute/vm/StopVmGC.java index a55de8878cf..1c79a9035f0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/StopVmGC.java +++ b/compute/src/main/java/org/zstack/compute/vm/StopVmGC.java @@ -51,6 +51,7 @@ protected void triggerNow(GCCompletion completion) { public void run(FlowTrigger trigger, Map data) { StopVmOnHypervisorMsg msg = new StopVmOnHypervisorMsg(); msg.setVmInventory(inventory); + msg.setIgnoreNotFoundError(true); bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, hostUuid); bus.send(msg, new CloudBusCallBack(trigger) { @Override @@ -66,6 +67,16 @@ public void run(MessageReply reply) { }).then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { + String vmHostUuid = Q.New(VmInstanceVO.class).select(VmInstanceVO_.hostUuid) + .eq(VmInstanceVO_.uuid, inventory.getUuid()).findValue(); + if (!hostUuid.equals(vmHostUuid)) { + logger.debug(String.format("skip changing vm[uuid:%s] state to stopped after StopVmGC, " + + "current host[uuid:%s] is not gc host[uuid:%s]", inventory.getUuid(), + vmHostUuid, hostUuid)); + trigger.next(); + return; + } + ChangeVmStateMsg cmsg = new ChangeVmStateMsg(); cmsg.setVmInstanceUuid(inventory.getUuid()); cmsg.setStateEvent(VmInstanceStateEvent.stopped.toString()); diff --git a/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java index bffd82dce1f..690454f798e 100755 --- a/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java +++ b/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java @@ -7,6 +7,7 @@ public class StopVmOnHypervisorMsg extends NeedReplyMessage implements HostMessa private VmInstanceInventory vmInventory; private String type; private boolean debug; + private boolean ignoreNotFoundError; public VmInstanceInventory getVmInventory() { return vmInventory; @@ -36,4 +37,12 @@ public boolean isDebug() { public void setDebug(boolean debug) { this.debug = debug; } + + public boolean isIgnoreNotFoundError() { + return ignoreNotFoundError; + } + + public void setIgnoreNotFoundError(boolean ignoreNotFoundError) { + this.ignoreNotFoundError = ignoreNotFoundError; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index ff737c20e83..39e45aeae8f 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -3328,6 +3328,8 @@ public static class StopVmCmd extends AgentCommand { private String type; @GrayVersion(value = "5.0.0") private long timeout; + @GrayVersion(value = "5.5.22") + private boolean ignoreNotFoundError; private List vmNics; public String getUuid() { @@ -3354,6 +3356,14 @@ public void setType(String type) { this.type = type; } + public boolean isIgnoreNotFoundError() { + return ignoreNotFoundError; + } + + public void setIgnoreNotFoundError(boolean ignoreNotFoundError) { + this.ignoreNotFoundError = ignoreNotFoundError; + } + public List getVmNics() { return vmNics; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 48370a2a144..638f0f4d566 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -3872,6 +3872,7 @@ protected void stopVm(final StopVmOnHypervisorMsg msg, final NoErrorCompletion c cmd.setUuid(vminv.getUuid()); cmd.setType(msg.getType()); cmd.setTimeout(120); + cmd.setIgnoreNotFoundError(msg.isIgnoreNotFoundError()); cmd.setVmNics(vminv.getVmNics()); try { From 1c5248b6dd4fef3c66d964fc0263d4ee9b025de1 Mon Sep 17 00:00:00 2001 From: Haidong Pang Date: Mon, 18 May 2026 16:07:37 +0800 Subject: [PATCH 2/2] [vm]: allow nullable stop not-found flag Resolves: ZSTAC-84158 Change-Id: I10d2fba8187a7ebcac48063dae5cf71fa2686d79 --- .../java/org/zstack/header/vm/StopVmOnHypervisorMsg.java | 6 +++--- .../kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java index 690454f798e..966928e74d4 100755 --- a/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java +++ b/header/src/main/java/org/zstack/header/vm/StopVmOnHypervisorMsg.java @@ -7,7 +7,7 @@ public class StopVmOnHypervisorMsg extends NeedReplyMessage implements HostMessa private VmInstanceInventory vmInventory; private String type; private boolean debug; - private boolean ignoreNotFoundError; + private Boolean ignoreNotFoundError; public VmInstanceInventory getVmInventory() { return vmInventory; @@ -38,11 +38,11 @@ public void setDebug(boolean debug) { this.debug = debug; } - public boolean isIgnoreNotFoundError() { + public Boolean isIgnoreNotFoundError() { return ignoreNotFoundError; } - public void setIgnoreNotFoundError(boolean ignoreNotFoundError) { + public void setIgnoreNotFoundError(Boolean ignoreNotFoundError) { this.ignoreNotFoundError = ignoreNotFoundError; } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 39e45aeae8f..ddd376c55f5 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -3329,7 +3329,7 @@ public static class StopVmCmd extends AgentCommand { @GrayVersion(value = "5.0.0") private long timeout; @GrayVersion(value = "5.5.22") - private boolean ignoreNotFoundError; + private Boolean ignoreNotFoundError; private List vmNics; public String getUuid() { @@ -3356,11 +3356,11 @@ public void setType(String type) { this.type = type; } - public boolean isIgnoreNotFoundError() { + public Boolean isIgnoreNotFoundError() { return ignoreNotFoundError; } - public void setIgnoreNotFoundError(boolean ignoreNotFoundError) { + public void setIgnoreNotFoundError(Boolean ignoreNotFoundError) { this.ignoreNotFoundError = ignoreNotFoundError; }