package org.ovirt.engine.core.bll.scheduling;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class VdsFreeMemoryChecker {
private RunVmDelayer delayer;
private static final Logger log = LoggerFactory.getLogger(VdsFreeMemoryChecker.class);
public VdsFreeMemoryChecker(RunVmDelayer delayer) {
this.delayer = delayer;
}
public boolean evaluate(VDS vds, VM vm) {
// first check if this host has enough free memory to run the VM.
if (!SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm)) {
if (vds.getPendingVmemSize() == 0) {
// there are no pending VMs to run - we hit the hard limit of memory, no special treatment
return false;
}
log.debug("not enough memory on host. throttling...");
// not enough memory to run the vm. delay execution to free up pending memory.
delayer.delay(vds.getId());
// fetch a fresh vds and check its memory again
vds = DbFacade.getInstance().getVdsDao().get(vds.getId());
// check free memory on the updated host
return SlaValidator.getInstance().hasOvercommitMemoryToRunVM(vds, vm);
}
return true;
}
}