mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
kvm: Agent should not check if remaining memory on host is sufficient (#2766)
When a Instance is (attempted to be) started in KVM Host the Agent should not worry about the allocated memory on this host. To make a proper judgement we need to take more into account: - Memory Overcommit ratio - Host reserved memory - Host overcommit memory The Management Server has all the information and the DeploymentPlanner has to make the decision if a Instance should and can be started on a Host, not the host itself. Signed-off-by: Wido den Hollander <wido@widodh.nl>
This commit is contained in:
parent
75030e5522
commit
65f31f1a9f
@ -277,7 +277,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
protected int _rngRateBytes = 2048;
|
protected int _rngRateBytes = 2048;
|
||||||
private File _qemuSocketsPath;
|
private File _qemuSocketsPath;
|
||||||
private final String _qemuGuestAgentSocketName = "org.qemu.guest_agent.0";
|
private final String _qemuGuestAgentSocketName = "org.qemu.guest_agent.0";
|
||||||
private long _totalMemory;
|
|
||||||
protected WatchDogAction _watchDogAction = WatchDogAction.NONE;
|
protected WatchDogAction _watchDogAction = WatchDogAction.NONE;
|
||||||
protected WatchDogModel _watchDogModel = WatchDogModel.I6300ESB;
|
protected WatchDogModel _watchDogModel = WatchDogModel.I6300ESB;
|
||||||
|
|
||||||
@ -2603,7 +2602,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
public StartupCommand[] initialize() {
|
public StartupCommand[] initialize() {
|
||||||
|
|
||||||
final List<Object> info = getHostInfo();
|
final List<Object> info = getHostInfo();
|
||||||
_totalMemory = (Long)info.get(2);
|
|
||||||
|
|
||||||
final StartupRoutingCommand cmd =
|
final StartupRoutingCommand cmd =
|
||||||
new StartupRoutingCommand((Integer)info.get(0), (Long)info.get(1), (Long)info.get(2), (Long)info.get(4), (String)info.get(3), _hypervisorType,
|
new StartupRoutingCommand((Integer)info.get(0), (Long)info.get(1), (Long)info.get(2), (Long)info.get(4), (String)info.get(3), _hypervisorType,
|
||||||
@ -3792,10 +3790,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTotalMemory() {
|
|
||||||
return _totalMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHostDistro() {
|
public String getHostDistro() {
|
||||||
return _hostDistro;
|
return _hostDistro;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,6 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.libvirt.Connect;
|
import org.libvirt.Connect;
|
||||||
import org.libvirt.Domain;
|
|
||||||
import org.libvirt.DomainInfo.DomainState;
|
import org.libvirt.DomainInfo.DomainState;
|
||||||
import org.libvirt.LibvirtException;
|
import org.libvirt.LibvirtException;
|
||||||
|
|
||||||
@ -65,13 +64,6 @@ public final class LibvirtStartCommandWrapper extends CommandWrapper<StartComman
|
|||||||
vm = libvirtComputingResource.createVMFromSpec(vmSpec);
|
vm = libvirtComputingResource.createVMFromSpec(vmSpec);
|
||||||
conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType());
|
conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType());
|
||||||
|
|
||||||
Long remainingMem = getFreeMemory(conn, libvirtComputingResource);
|
|
||||||
if (remainingMem == null){
|
|
||||||
return new StartAnswer(command, "failed to get free memory");
|
|
||||||
} else if (remainingMem < vmSpec.getMinRam()) {
|
|
||||||
return new StartAnswer(command, "Not enough memory on the host, remaining: " + remainingMem + ", asking: " + vmSpec.getMinRam());
|
|
||||||
}
|
|
||||||
|
|
||||||
final NicTO[] nics = vmSpec.getNics();
|
final NicTO[] nics = vmSpec.getNics();
|
||||||
|
|
||||||
for (final NicTO nic : nics) {
|
for (final NicTO nic : nics) {
|
||||||
@ -160,22 +152,4 @@ public final class LibvirtStartCommandWrapper extends CommandWrapper<StartComman
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Long getFreeMemory(final Connect conn, final LibvirtComputingResource libvirtComputingResource){
|
|
||||||
try {
|
|
||||||
long allocatedMem = 0;
|
|
||||||
int[] ids = conn.listDomains();
|
|
||||||
for(int id :ids) {
|
|
||||||
Domain dm = conn.domainLookupByID(id);
|
|
||||||
allocatedMem += dm.getMaxMemory() * 1024L;
|
|
||||||
s_logger.debug("vm: " + dm.getName() + " mem: " + dm.getMaxMemory() * 1024L);
|
|
||||||
}
|
|
||||||
Long remainingMem = libvirtComputingResource.getTotalMemory() - allocatedMem;
|
|
||||||
s_logger.debug("remaining mem" + remainingMem);
|
|
||||||
return remainingMem;
|
|
||||||
} catch (Exception e) {
|
|
||||||
s_logger.debug("failed to get free memory", e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5038,7 +5038,6 @@ public class LibvirtComputingResourceTest {
|
|||||||
when(conn.domainLookupByID(vmId)).thenReturn(dm);
|
when(conn.domainLookupByID(vmId)).thenReturn(dm);
|
||||||
when(dm.getMaxMemory()).thenReturn(1024L);
|
when(dm.getMaxMemory()).thenReturn(1024L);
|
||||||
when(dm.getName()).thenReturn(vmName);
|
when(dm.getName()).thenReturn(vmName);
|
||||||
when(libvirtComputingResource.getTotalMemory()).thenReturn(2048*1024L);
|
|
||||||
doNothing().when(libvirtComputingResource).createVbd(conn, vmSpec, vmName, vmDef);
|
doNothing().when(libvirtComputingResource).createVbd(conn, vmSpec, vmName, vmDef);
|
||||||
} catch (final LibvirtException e) {
|
} catch (final LibvirtException e) {
|
||||||
fail(e.getMessage());
|
fail(e.getMessage());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user