Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -378,16 +378,8 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym
planner = getDeploymentPlannerByName(plannerName);
}

Host lastHost = null;

String considerLastHostStr = (String)vmProfile.getParameter(VirtualMachineProfile.Param.ConsiderLastHost);
boolean considerLastHost = vm.getLastHostId() != null && haVmTag == null &&
(considerLastHostStr == null || Boolean.TRUE.toString().equalsIgnoreCase(considerLastHostStr));
if (considerLastHost) {
HostVO host = _hostDao.findById(vm.getLastHostId());
logger.debug("This VM has last host_id specified, trying to choose the same host: " + host);
lastHost = host;

Host lastHost = checkDeployInVmLastHost(vmProfile, vm);
if (lastHost != null) {
DeployDestination deployDestination = deployInVmLastHost(vmProfile, plan, avoids, planner, vm, dc, offering, cpuRequested, ramRequested, volumesRequireEncryption);
if (deployDestination != null) {
return deployDestination;
Expand Down Expand Up @@ -456,6 +448,31 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym
return dest;
}

private Host checkDeployInVmLastHost(VirtualMachineProfile vmProfile, VirtualMachine vm) {
String considerLastHostStr = (String)vmProfile.getParameter(VirtualMachineProfile.Param.ConsiderLastHost);
String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag);
boolean considerLastHost = vm.getLastHostId() != null && haVmTag == null &&
(considerLastHostStr == null || Boolean.TRUE.toString().equalsIgnoreCase(considerLastHostStr));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @sureshanaparti I'm not clear why the first part of this OR operator would make it consider the last host. I would assume if the ConsiderLastHost parameter is not set that this evaluates to false?

Copy link
Contributor

@DaanHoogland DaanHoogland Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez , true is the documented default, so we should treat null as true. (if it is not passed in the parameters, I actually do not know if that would be handled upstream already)

if (!considerLastHost) {
return null;
}

logger.debug("This VM has last host_id: {}", vm.getLastHostId());
HostVO lastHost = _hostDao.findById(vm.getLastHostId());
if (lastHost == null) {
logger.debug("Unable to deploy VM {} in the last host, last host doesn't exist", vm.getName());
return null;
}

logger.debug("VM's last host is {}, trying to choose the same host if it is not in maintenance state", lastHost);
if (lastHost.isInMaintenanceStates()) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably checking other states as well? Or migrating only to enabled and running hosts?

logger.debug("Unable to deploy VM {} in the last host, last host {} is in maintenance state", vm.getName(), lastHost.getName());
return null;
}

return lastHost;
}

private void avoidDifferentArchResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) {
VirtualMachineTemplate template = vmProfile.getTemplate();
for (CPU.CPUArch arch : clusterArchTypes) {
Expand Down Expand Up @@ -1474,7 +1491,7 @@ private Pair<Boolean, Boolean> findVMStorageRequirements(VirtualMachineProfile v

protected Pair<Host, Map<Volume, StoragePool>> findPotentialDeploymentResources(List<Host> suitableHosts, Map<Volume, List<StoragePool>> suitableVolumeStoragePools,
ExcludeList avoid, PlannerResourceUsage resourceUsageRequired, List<Volume> readyAndReusedVolumes, List<Long> preferredHosts, VirtualMachine vm) {
logger.debug("Trying to find a potenial host and associated storage pools from the suitable host/pool lists for this VM");
logger.debug("Trying to find a potential host and associated storage pools from the suitable host/pool lists for this VM");

boolean hostCanAccessPool = false;
boolean haveEnoughSpace = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ public Long migrate(final HaWorkVO work) {
if (checkAndCancelWorkIfNeeded(work)) {
return null;
}
logger.info("Migration attempt: for VM {}from host {}. Starting attempt: {}/{} times.", vm, srcHost, 1 + work.getTimesTried(), _maxRetries);
logger.info("Migration attempt: for {} from {}. Starting attempt: {}/{} times.", vm, srcHost, 1 + work.getTimesTried(), _maxRetries);

if (VirtualMachine.State.Stopped.equals(vm.getState())) {
logger.info(String.format("vm %s is Stopped, skipping migrate.", vm));
Expand All @@ -843,8 +843,6 @@ public Long migrate(final HaWorkVO work) {
logger.info(String.format("VM %s is running on a different host %s, skipping migration", vm, vm.getHostId()));
return null;
}
logger.info("Migration attempt: for VM " + vm.getUuid() + "from host id " + srcHostId +
". Starting attempt: " + (1 + work.getTimesTried()) + "/" + _maxRetries + " times.");

try {
work.setStep(Step.Migrating);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1417,7 +1417,7 @@ private boolean doMaintain(final long hostId) {
throw new CloudRuntimeException("There are active VMs using the host's local storage pool. Please stop all VMs on this host that use local storage.");
}
} else {
logger.info("Maintenance: scheduling migration of VM {} from host {}", vm, host);
logger.info("Maintenance: scheduling migration of {} from {}", vm, host);
_haMgr.scheduleMigration(vm, HighAvailabilityManager.ReasonType.HostMaintenance);
}
}
Expand Down
Loading