From 2f7bdc90b361ff39baf75cc5beef5e53284ea864 Mon Sep 17 00:00:00 2001 From: Sachin R Doddaguni Date: Tue, 14 Apr 2026 15:01:59 -0700 Subject: [PATCH 1/3] Fix bulk power state query missing VM lifecycle state field The IdsPowerStateSelectSearch partial select did not include the VM lifecycle state, causing isPowerStateInSyncWithInstanceState to always return true when state was null. This prevented retry of failed StopCommands on subsequent ping cycles. --- .../src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java index a38b6af3aa0b..d8fb50fd95e7 100755 --- a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -358,7 +358,8 @@ protected void init() { IdsPowerStateSelectSearch.entity().getPowerHostId(), IdsPowerStateSelectSearch.entity().getPowerState(), IdsPowerStateSelectSearch.entity().getPowerStateUpdateCount(), - IdsPowerStateSelectSearch.entity().getPowerStateUpdateTime()); + IdsPowerStateSelectSearch.entity().getPowerStateUpdateTime(), + IdsPowerStateSelectSearch.entity().getState()); IdsPowerStateSelectSearch.done(); CountByOfferingId = createSearchBuilder(Integer.class); @@ -1105,6 +1106,10 @@ public Map updatePowerState( private boolean isPowerStateInSyncWithInstanceState(final VirtualMachine.PowerState powerState, final long powerHostId, final VMInstanceVO instance) { State instanceState = instance.getState(); + if (instanceState == null) { + s_logger.warn(String.format("VM %s has null instance state during power state sync check, treating as out of sync", instance)); + return false; + } if ((powerState == VirtualMachine.PowerState.PowerOff && instanceState == State.Running) || (powerState == VirtualMachine.PowerState.PowerOn && instanceState == State.Stopped)) { HostVO instanceHost = hostDao.findById(instance.getHostId()); From b37d94bd610f64cfe8abe38ab1de5137a4d566eb Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 15 Apr 2026 10:19:56 +0530 Subject: [PATCH 2/3] fix log --- .../src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java index d8fb50fd95e7..68cc3b4da640 100755 --- a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -1107,7 +1107,7 @@ public Map updatePowerState( private boolean isPowerStateInSyncWithInstanceState(final VirtualMachine.PowerState powerState, final long powerHostId, final VMInstanceVO instance) { State instanceState = instance.getState(); if (instanceState == null) { - s_logger.warn(String.format("VM %s has null instance state during power state sync check, treating as out of sync", instance)); + logger.warn("VM {} has null instance state during power state sync check, treating as out of sync", instance); return false; } if ((powerState == VirtualMachine.PowerState.PowerOff && instanceState == State.Running) From bc06e4e5b00435998d4428ede1b48b6435994f22 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 16 Apr 2026 10:50:39 -0300 Subject: [PATCH 3/3] Add defensive check for instance host ID to prevent NPE --- .../src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java index 68cc3b4da640..d8c9b9253c89 100755 --- a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -1113,7 +1113,7 @@ private boolean isPowerStateInSyncWithInstanceState(final VirtualMachine.PowerSt if ((powerState == VirtualMachine.PowerState.PowerOff && instanceState == State.Running) || (powerState == VirtualMachine.PowerState.PowerOn && instanceState == State.Stopped)) { HostVO instanceHost = hostDao.findById(instance.getHostId()); - HostVO powerHost = powerHostId == instance.getHostId() ? instanceHost : hostDao.findById(powerHostId); + HostVO powerHost = instance.getHostId() != null && powerHostId == instance.getHostId() ? instanceHost : hostDao.findById(powerHostId); logger.debug("VM: {} on host: {} and power host : {} is in {} state, but power state is {}", instance, instanceHost, powerHost, instanceState, powerState); return false;