This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new ffebe8eaa64 Fix bulk power state query missing VM lifecycle state 
field (#13027)
ffebe8eaa64 is described below

commit ffebe8eaa64607e4294ee2d072e53b0347de5e9e
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Mon Apr 27 15:38:52 2026 +0530

    Fix bulk power state query missing VM lifecycle state field (#13027)
    
    * 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.
    
    * Add defensive check for instance host ID to prevent NPE
    
    Co-authored-by: Sachin R Doddaguni <[email protected]>
    Co-authored-by: nvazquez <[email protected]>
---
 .../schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

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 a38b6af3aa0..d8c9b9253c8 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 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
                 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,10 +1106,14 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
 
     private boolean isPowerStateInSyncWithInstanceState(final 
VirtualMachine.PowerState powerState, final long powerHostId, final 
VMInstanceVO instance) {
         State instanceState = instance.getState();
+        if (instanceState == null) {
+            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)
                 || (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;

Reply via email to