From 2c417131154b873eddf0ac89ed5d6264076cd476 Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Tue, 27 Oct 2020 12:26:23 +0200 Subject: [PATCH 1/7] Moved dedicated hosts to the end of the resultset when selecting an endpoint --- .../storage/endpoint/DefaultEndPointSelector.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index 09b4b1ab3853..de184270a396 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -29,6 +29,7 @@ import javax.inject.Inject; +import com.cloud.dc.dao.DedicatedResourceDao; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; @@ -64,6 +65,8 @@ public class DefaultEndPointSelector implements EndPointSelector { private static final Logger s_logger = Logger.getLogger(DefaultEndPointSelector.class); @Inject private HostDao hostDao; + @Inject + private DedicatedResourceDao dedicatedResourceDao; private final String findOneHostOnPrimaryStorage = "select t.id from " + "(select h.id, cd.value " + "from host h join storage_pool_host_ref s on h.id = s.host_id " @@ -128,9 +131,15 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) } } + List dedicatedHosts = dedicatedResourceDao.listAllHosts(); + // TODO: order by rand() is slow if there are lot of hosts sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery - sbuilder.append(" ORDER by rand() limit 1"); + sbuilder.append(" ORDER by "); + for (Long hostId: dedicatedHosts){ // put dedicated hosts at the end of the result set + sbuilder.append("field(t.id, '" + hostId +"')," ); + } + sbuilder.append(" rand() limit 1"); String sql = sbuilder.toString(); HostVO host = null; TransactionLegacy txn = TransactionLegacy.currentTxn(); From dfd956745ca7ab9b4892fc07966d9f983f97c2f6 Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Wed, 28 Oct 2020 11:05:30 +0200 Subject: [PATCH 2/7] Reduced calling the field method to 1 call and randomized dedicated hosts --- .../storage/endpoint/DefaultEndPointSelector.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index de184270a396..b7cd205ecf0a 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -25,6 +25,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import javax.inject.Inject; @@ -136,8 +137,17 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) // TODO: order by rand() is slow if there are lot of hosts sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery sbuilder.append(" ORDER by "); - for (Long hostId: dedicatedHosts){ // put dedicated hosts at the end of the result set - sbuilder.append("field(t.id, '" + hostId +"')," ); + if (dedicatedHosts.size() > 0) { + Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. + sbuilder.append("field(t.id, "); + Iterator hostIt = dedicatedHosts.iterator(); + while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set + sbuilder.append("'" + hostIt.next() + "'"); + if (hostIt.hasNext()) { + sbuilder.append(","); + } + } + sbuilder.append(")," ); } sbuilder.append(" rand() limit 1"); String sql = sbuilder.toString(); From d85bcdfdd7f46c25acf8d60141a478b7784c427c Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Mon, 9 Nov 2020 10:42:09 +0200 Subject: [PATCH 3/7] Moved logic to function --- .../endpoint/DefaultEndPointSelector.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index b7cd205ecf0a..7ae8529702ec 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -138,16 +138,7 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery sbuilder.append(" ORDER by "); if (dedicatedHosts.size() > 0) { - Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. - sbuilder.append("field(t.id, "); - Iterator hostIt = dedicatedHosts.iterator(); - while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set - sbuilder.append("'" + hostIt.next() + "'"); - if (hostIt.hasNext()) { - sbuilder.append(","); - } - } - sbuilder.append(")," ); + moveDedicatedHostsToLowerPriority(sbuilder, dedicatedHosts); } sbuilder.append(" rand() limit 1"); String sql = sbuilder.toString(); @@ -173,6 +164,19 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) return RemoteHostEndPoint.getHypervisorHostEndPoint(host); } + private void moveDedicatedHostsToLowerPriority(StringBuilder sbuilder, List dedicatedHosts) { + Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. + sbuilder.append("field(t.id, "); + Iterator hostIt = dedicatedHosts.iterator(); + while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set + sbuilder.append("'" + hostIt.next() + "'"); + if (hostIt.hasNext()) { + sbuilder.append(","); + } + } + sbuilder.append(")," ); + } + protected EndPoint findEndPointForImageMove(DataStore srcStore, DataStore destStore) { // find any xenserver/kvm host in the scope Scope srcScope = srcStore.getScope(); From 033c66bef4a711808fca22a347b27c4fcb64e498 Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Fri, 13 Nov 2020 12:57:57 +0200 Subject: [PATCH 4/7] Checking for dedicated hosts by scope and excluding dedicated hosts belonging to calling account from lower priority list. --- .../endpoint/DefaultEndPointSelector.java | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index 7ae8529702ec..a774ef099780 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -30,7 +30,11 @@ import javax.inject.Inject; +import com.cloud.dc.DedicatedResourceVO; import com.cloud.dc.dao.DedicatedResourceDao; +import com.cloud.user.Account; +import com.cloud.utils.Pair; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; @@ -119,6 +123,8 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) StringBuilder sbuilder = new StringBuilder(); sbuilder.append(sqlBase); + List dedicatedHosts = new ArrayList(); + if (scope != null) { if (scope.getScopeType() == ScopeType.HOST) { sbuilder.append(" and h.id = "); @@ -126,13 +132,29 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) } else if (scope.getScopeType() == ScopeType.CLUSTER) { sbuilder.append(" and h.cluster_id = "); sbuilder.append(scope.getScopeId()); + DedicatedResourceVO dedicatedHost = dedicatedResourceDao.findByClusterId(scope.getScopeId()); + if (dedicatedHost != null){ + List clusterHosts = hostDao.findByClusterId(scope.getScopeId()); + for (HostVO hostVO: clusterHosts){ + dedicatedHosts.add(hostVO.getId()); + } + } } else if (scope.getScopeType() == ScopeType.ZONE) { sbuilder.append(" and h.data_center_id = "); sbuilder.append(scope.getScopeId()); + DedicatedResourceVO dedicatedHost = dedicatedResourceDao.findByZoneId(scope.getScopeId()); + if (dedicatedHost != null){ + List zoneHosts = hostDao.findByClusterId(scope.getScopeId()); + for (HostVO hostVO: zoneHosts){ + dedicatedHosts.add(hostVO.getId()); + } + } } } - - List dedicatedHosts = dedicatedResourceDao.listAllHosts(); + // We didn't find any hosts specifically dedicated to a zone or cluster + if (dedicatedHosts.size() == 0) { + dedicatedHosts = dedicatedResourceDao.listAllHosts(); + } // TODO: order by rand() is slow if there are lot of hosts sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery @@ -165,16 +187,38 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) } private void moveDedicatedHostsToLowerPriority(StringBuilder sbuilder, List dedicatedHosts) { - Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. - sbuilder.append("field(t.id, "); - Iterator hostIt = dedicatedHosts.iterator(); - while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set - sbuilder.append("'" + hostIt.next() + "'"); - if (hostIt.hasNext()) { - sbuilder.append(","); + + // Check if we have a call context + final CallContext context = CallContext.current(); + if (context != null) { + Account account = context.getCallingAccount(); + if (account != null) { + // Remove hosts for this account. Only leave hosts dedicated to other accounts in the lower priority list. + Pair, Integer> hostIds = dedicatedResourceDao.searchDedicatedHosts(null, null, account.getId(), null, null); + List accountDedicatedHosts = hostIds.first(); + for (DedicatedResourceVO accountDedicatedResource: accountDedicatedHosts){ + Iterator dedicatedHostsIterator = dedicatedHosts.iterator(); + while (dedicatedHostsIterator.hasNext()) { + if (dedicatedHostsIterator.next() == accountDedicatedResource.getHostId()) { + dedicatedHostsIterator.remove(); + } + } + } + } + } + + if (dedicatedHosts.size() > 0) { + Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. + sbuilder.append("field(t.id, "); + Iterator hostIt = dedicatedHosts.iterator(); + while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set + sbuilder.append("'" + hostIt.next() + "'"); + if (hostIt.hasNext()) { + sbuilder.append(","); + } } + sbuilder.append(")," ); } - sbuilder.append(")," ); } protected EndPoint findEndPointForImageMove(DataStore srcStore, DataStore destStore) { From 0103724a9b71a37afa283da516720bff750572d9 Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Mon, 16 Nov 2020 10:51:47 +0200 Subject: [PATCH 5/7] Fixed cluster/zone issue --- .../cloudstack/storage/endpoint/DefaultEndPointSelector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index a774ef099780..e51dce923ae8 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -144,7 +144,7 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) sbuilder.append(scope.getScopeId()); DedicatedResourceVO dedicatedHost = dedicatedResourceDao.findByZoneId(scope.getScopeId()); if (dedicatedHost != null){ - List zoneHosts = hostDao.findByClusterId(scope.getScopeId()); + List zoneHosts = hostDao.findByDataCenterId(scope.getScopeId()); for (HostVO hostVO: zoneHosts){ dedicatedHosts.add(hostVO.getId()); } From b21b734efb5383bc697d2b190d4465cc4bbe7f01 Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Tue, 17 Nov 2020 12:17:00 +0200 Subject: [PATCH 6/7] Fetching dedidcated hosts by zone and cluster id and changed logic --- .../cloud/vm/VirtualMachineManagerImpl.java | 6 +- .../endpoint/DefaultEndPointSelector.java | 29 +++------ .../cloud/dc/dao/DedicatedResourceDao.java | 3 + .../dc/dao/DedicatedResourceDaoImpl.java | 59 +++++++++++++++++++ 4 files changed, 74 insertions(+), 23 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 14b3078cb4c4..d43eff17b72e 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1659,8 +1659,10 @@ protected boolean sendStop(final VirtualMachineGuru guru, final VirtualMachinePr guru.finalizeStop(profile, answer); final UserVmVO userVm = _userVmDao.findById(vm.getId()); - userVm.setPowerState(PowerState.PowerOff); - _userVmDao.update(userVm.getId(), userVm); + if (userVm != null){ + userVm.setPowerState(PowerState.PowerOff); + _userVmDao.update(userVm.getId(), userVm); + } } else { s_logger.error("Invalid answer received in response to a StopCommand for " + vm.getInstanceName()); return false; diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index e51dce923ae8..6a903e4235a4 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -132,27 +132,13 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) } else if (scope.getScopeType() == ScopeType.CLUSTER) { sbuilder.append(" and h.cluster_id = "); sbuilder.append(scope.getScopeId()); - DedicatedResourceVO dedicatedHost = dedicatedResourceDao.findByClusterId(scope.getScopeId()); - if (dedicatedHost != null){ - List clusterHosts = hostDao.findByClusterId(scope.getScopeId()); - for (HostVO hostVO: clusterHosts){ - dedicatedHosts.add(hostVO.getId()); - } - } + dedicatedHosts = dedicatedResourceDao.findHostsByCluster(scope.getScopeId()); } else if (scope.getScopeType() == ScopeType.ZONE) { sbuilder.append(" and h.data_center_id = "); sbuilder.append(scope.getScopeId()); - DedicatedResourceVO dedicatedHost = dedicatedResourceDao.findByZoneId(scope.getScopeId()); - if (dedicatedHost != null){ - List zoneHosts = hostDao.findByDataCenterId(scope.getScopeId()); - for (HostVO hostVO: zoneHosts){ - dedicatedHosts.add(hostVO.getId()); - } - } + dedicatedHosts = dedicatedResourceDao.findHostsByZone(scope.getScopeId()); } - } - // We didn't find any hosts specifically dedicated to a zone or cluster - if (dedicatedHosts.size() == 0) { + } else { dedicatedHosts = dedicatedResourceDao.listAllHosts(); } @@ -210,10 +196,11 @@ private void moveDedicatedHostsToLowerPriority(StringBuilder sbuilder, List 0) { Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well. sbuilder.append("field(t.id, "); - Iterator hostIt = dedicatedHosts.iterator(); - while (hostIt.hasNext()) { // put dedicated hosts at the end of the result set - sbuilder.append("'" + hostIt.next() + "'"); - if (hostIt.hasNext()) { + int hostIndex = 0; + for (Long hostId: dedicatedHosts) { // put dedicated hosts at the end of the result set + sbuilder.append("'" + hostId + "'"); + hostIndex++; + if (hostIndex < dedicatedHosts.size()){ sbuilder.append(","); } } diff --git a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java index 7c41439b1ec0..3527ef7638e2 100644 --- a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java +++ b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java @@ -55,4 +55,7 @@ public interface DedicatedResourceDao extends GenericDao listByAffinityGroupId(Long affinityGroupId); + List findHostsByCluster(Long clusterId); + + List findHostsByZone(Long zoneId); } \ No newline at end of file diff --git a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java index c406755f9945..c10ef2dc25fc 100644 --- a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java +++ b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java @@ -16,9 +16,14 @@ // under the License. package com.cloud.dc.dao; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.utils.db.Filter; import org.springframework.stereotype.Component; @@ -32,10 +37,17 @@ import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.TransactionLegacy; +import com.cloud.utils.db.JoinBuilder; + +import javax.inject.Inject; @Component @DB public class DedicatedResourceDaoImpl extends GenericDaoBase implements DedicatedResourceDao { + + @Inject + protected HostDao hostDao; + protected final SearchBuilder ZoneSearch; protected final SearchBuilder PodSearch; protected final SearchBuilder ClusterSearch; @@ -64,6 +76,8 @@ public class DedicatedResourceDaoImpl extends GenericDaoBase ListPodsSearch; protected GenericSearchBuilder ListClustersSearch; protected GenericSearchBuilder ListHostsSearch; + protected SearchBuilder ListHostsByCluster; + protected SearchBuilder ListHostsByZone; protected DedicatedResourceDaoImpl() { PodSearch = createSearchBuilder(); @@ -369,4 +383,49 @@ public List listByAffinityGroupId(Long affinityGroupId) { sc.setParameters("affinityGroupId", affinityGroupId); return listBy(sc); } + + @Override + public boolean configure(String name, Map params) { + ListHostsByCluster = createSearchBuilder(); + SearchBuilder clusterHostsSB = hostDao.createSearchBuilder(); + clusterHostsSB.and("cluster_id", clusterHostsSB.entity().getClusterId(), Op.EQ); + clusterHostsSB.and("type", clusterHostsSB.entity().getType(), Op.EQ); + ListHostsByCluster.join("clusterHostsSB", clusterHostsSB, clusterHostsSB.entity().getId(), ListHostsByCluster.entity().getHostId(), JoinBuilder.JoinType.INNER); + ListHostsByCluster.done(); + + ListHostsByZone = createSearchBuilder(); + SearchBuilder zoneHostsSB = hostDao.createSearchBuilder(); + zoneHostsSB = hostDao.createSearchBuilder(); + zoneHostsSB.and("zone_id", zoneHostsSB.entity().getDataCenterId(), Op.EQ); + zoneHostsSB.and("type", zoneHostsSB.entity().getType(), Op.EQ); + ListHostsByZone.join("zoneHostsSB", zoneHostsSB, zoneHostsSB.entity().getId(), ListHostsByZone.entity().getHostId(), JoinBuilder.JoinType.INNER); + ListHostsByZone.done(); + return true; + } + + @Override + public List findHostsByCluster(Long clusterId) { + List hosts = new ArrayList<>(); + SearchCriteria sc = ListHostsByCluster.create(); + sc.setJoinParameters("clusterHostsSB", "type", Host.Type.Routing); + sc.setJoinParameters("clusterHostsSB","cluster_id", clusterId); + List results = customSearch(sc, null); + for (DedicatedResourceVO dedicatedResourceVO: results){ + hosts.add(dedicatedResourceVO.getHostId()); + } + return hosts; + } + + @Override + public List findHostsByZone(Long zoneId) { + List hosts = new ArrayList<>(); + SearchCriteria sc = ListHostsByZone.create(); + sc.setJoinParameters("zoneHostsSB", "type", Host.Type.Routing); + sc.setJoinParameters("zoneHostsSB","zone_id", zoneId); + List results = customSearch(sc, null); + for (DedicatedResourceVO dedicatedResourceVO: results){ + hosts.add(dedicatedResourceVO.getHostId()); + } + return hosts; + } } From 0e9d86caeacf882d4fe9e9c02bd102a046a8171a Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Tue, 17 Nov 2020 13:55:25 +0200 Subject: [PATCH 7/7] Fixed bad merge --- .../src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index e9df75a560bf..f1ab9cd1ff95 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1675,12 +1675,11 @@ protected boolean sendStop(final VirtualMachineGuru guru, final VirtualMachinePr final UserVmVO userVm = _userVmDao.findById(vm.getId()); if (vm.getType() == VirtualMachine.Type.User) { - final UserVmVO userVm = _userVmDao.findById(vm.getId()); if (userVm != null){ userVm.setPowerState(PowerState.PowerOff); _userVmDao.update(userVm.getId(), userVm); } - } + } } else { s_logger.error("Invalid answer received in response to a StopCommand for " + vm.getInstanceName()); return false;