This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push:
new d127d7939de KVM: fix SSVM starting when overprovisioning memory (#7663)
d127d7939de is described below
commit d127d7939de92ecf3514128207baab36364e51d1
Author: dahn <[email protected]>
AuthorDate: Fri Jul 28 11:23:30 2023 +0200
KVM: fix SSVM starting when overprovisioning memory (#7663)
---
.../kvm/resource/LibvirtComputingResource.java | 9 +++--
.../hypervisor/kvm/resource/LibvirtVMDef.java | 4 +--
.../kvm/resource/LibvirtComputingResourceTest.java | 2 +-
.../hypervisor/kvm/resource/LibvirtVMDefTest.java | 38 +++++++++++-----------
.../main/java/com/cloud/hypervisor/KVMGuru.java | 2 +-
5 files changed, 30 insertions(+), 25 deletions(-)
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 3f711fa9b80..39f30b6e934 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -2780,10 +2780,15 @@ public class LibvirtComputingResource extends
ServerResourceBase implements Serv
grd.setMemBalloning(!_noMemBalloon);
- Long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
+ long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
+ long currRam = vmTO.getType() == VirtualMachine.Type.User ?
getCurrentMemAccordingToMemBallooning(vmTO, maxRam) : maxRam;
+
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace(String.format("memory values for VM %s are
%d/%d",vmTO.getName(),maxRam, currRam));
+ }
grd.setMemorySize(maxRam);
- grd.setCurrentMem(getCurrentMemAccordingToMemBallooning(vmTO, maxRam));
+ grd.setCurrentMem(currRam);
int vcpus = vmTO.getCpus();
Integer maxVcpus = vmTO.getVcpuMaxLimit();
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
index b739c0ee0ab..720c48096ef 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
@@ -282,7 +282,7 @@ public class LibvirtVMDef {
@Override
public String toString() {
StringBuilder response = new StringBuilder();
- response.append(String.format("<memory>%s</memory>\n",
this.currentMemory));
+ response.append(String.format("<memory>%s</memory>\n",
this.memory));
response.append(String.format("<currentMemory>%s</currentMemory>\n",
this.currentMemory));
if (this.memory > this.currentMemory) {
@@ -1238,7 +1238,7 @@ public class LibvirtVMDef {
@Override
public String toString() {
StringBuilder memBalloonBuilder = new StringBuilder();
- memBalloonBuilder.append("<memballoon model='" + memBalloonModel +
"'>\n");
+ memBalloonBuilder.append("<memballoon model='" + memBalloonModel +
"' autodeflate='on'>\n");
if (StringUtils.isNotBlank(memBalloonStatsPeriod)) {
memBalloonBuilder.append("<stats period='" +
memBalloonStatsPeriod +"'/>\n");
}
diff --git
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index ffe20b4ad30..58682b2663c 100644
---
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -760,7 +760,7 @@ public class LibvirtComputingResourceTest {
private void verifyMemory(VirtualMachineTO to, Document domainDoc, String
minRam) {
assertXpath(domainDoc, "/domain/maxMemory/text()", String.valueOf(
to.getMaxRam() / 1024 ));
- assertXpath(domainDoc, "/domain/memory/text()",minRam);
+ assertXpath(domainDoc, "/domain/currentMemory/text()",minRam);
assertXpath(domainDoc, "/domain/cpu/numa/cell/@memory", minRam);
assertXpath(domainDoc, "/domain/currentMemory/text()", minRam);
}
diff --git
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
index ec59265c832..4379ede8293 100644
---
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
+++
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
@@ -214,11 +214,11 @@ public class LibvirtVMDefTest extends TestCase {
assertEquals(bus, disk.getBusType());
assertEquals(DiskDef.DeviceType.DISK, disk.getDeviceType());
- String xmlDef = disk.toString();
+ String resultingXml = disk.toString();
String expectedXml = "<disk device='disk' type='file'>\n<driver
name='qemu' type='" + type.toString() + "' cache='" + cacheMode.toString() + "'
/>\n" +
"<source file='" + filePath + "'/>\n<target
dev='" + diskLabel + "' bus='" + bus.toString() + "'/>\n</disk>\n";
- assertEquals(xmlDef, expectedXml);
+ assertEquals(expectedXml, resultingXml);
}
@Test
@@ -236,7 +236,7 @@ public class LibvirtVMDefTest extends TestCase {
"<secret type='passphrase' uuid='" + passphraseUuid + "' />\n" +
"</encryption>\n" +
"</disk>\n";
- assertEquals(disk.toString(), expectedXML);
+ assertEquals(expectedXML, disk.toString());
}
@Test
@@ -346,7 +346,7 @@ public class LibvirtVMDefTest extends TestCase {
LibvirtVMDef.setGlobalQemuVersion(2006000L);
LibvirtVMDef.setGlobalLibvirtVersion(9008L);
- String xmlDef = disk.toString();
+ String resultingXml = disk.toString();
String expectedXml = "<disk device='disk' type='file'>\n<driver
name='qemu' type='" + type.toString() + "' cache='none' />\n" +
"<source file='" + filePath + "'/>\n<target dev='" + diskLabel
+ "' bus='" + bus.toString() + "'/>\n" +
"<iotune>\n<read_bytes_sec>"+bytesReadRate+"</read_bytes_sec>\n<write_bytes_sec>"+bytesWriteRate+"</write_bytes_sec>\n"
+
@@ -356,29 +356,29 @@ public class LibvirtVMDefTest extends TestCase {
"<read_bytes_sec_max_length>"+bytesReadRateMaxLength+"</read_bytes_sec_max_length>\n<write_bytes_sec_max_length>"+bytesWriteRateMaxLength+"</write_bytes_sec_max_length>\n"
+
"<read_iops_sec_max_length>"+iopsReadRateMaxLength+"</read_iops_sec_max_length>\n<write_iops_sec_max_length>"+iopsWriteRateMaxLength+"</write_iops_sec_max_length>\n</iotune>\n</disk>\n";
- assertEquals(xmlDef, expectedXml);
+ assertEquals(expectedXml, resultingXml);
}
@Test
public void memBalloonDefTestNone() {
- String expectedXml = "<memballoon model='none'>\n</memballoon>";
+ String expectedXml = "<memballoon model='none'
autodeflate='on'>\n</memballoon>";
MemBalloonDef memBalloonDef = new MemBalloonDef();
memBalloonDef.defNoneMemBalloon();
- String xmlDef = memBalloonDef.toString();
+ String resultingXml = memBalloonDef.toString();
- assertEquals(xmlDef, expectedXml);
+ assertEquals(expectedXml, resultingXml);
}
@Test
public void memBalloonDefTestVirtio() {
- String expectedXml = "<memballoon model='virtio'>\n<stats
period='60'/>\n</memballoon>";
+ String expectedXml = "<memballoon model='virtio'
autodeflate='on'>\n<stats period='60'/>\n</memballoon>";
MemBalloonDef memBalloonDef = new MemBalloonDef();
memBalloonDef.defVirtioMemBalloon("60");
- String xmlDef = memBalloonDef.toString();
+ String resultingXml = memBalloonDef.toString();
- assertEquals(xmlDef, expectedXml);
+ assertEquals(expectedXml, resultingXml);
}
@Test
@@ -413,11 +413,11 @@ public class LibvirtVMDefTest extends TestCase {
int bytes = 2048;
LibvirtVMDef.RngDef def = new LibvirtVMDef.RngDef(path, backendModel,
bytes, period);
- assertEquals(def.getPath(), path);
- assertEquals(def.getRngBackendModel(), backendModel);
- assertEquals(def.getRngModel(), LibvirtVMDef.RngDef.RngModel.VIRTIO);
- assertEquals(def.getRngRateBytes(), bytes);
- assertEquals(def.getRngRatePeriod(), period);
+ assertEquals(path, def.getPath());
+ assertEquals(backendModel, def.getRngBackendModel());
+ assertEquals(LibvirtVMDef.RngDef.RngModel.VIRTIO, def.getRngModel());
+ assertEquals(bytes, def.getRngRateBytes());
+ assertEquals(period, def.getRngRatePeriod());
}
@Test
@@ -441,8 +441,8 @@ public class LibvirtVMDefTest extends TestCase {
LibvirtVMDef.WatchDogDef.WatchDogAction action =
LibvirtVMDef.WatchDogDef.WatchDogAction.RESET;
LibvirtVMDef.WatchDogDef def = new LibvirtVMDef.WatchDogDef(action,
model);
- assertEquals(def.getModel(), model);
- assertEquals(def.getAction(), action);
+ assertEquals(model, def.getModel());
+ assertEquals(action, def.getAction());
}
@Test
@@ -453,6 +453,6 @@ public class LibvirtVMDefTest extends TestCase {
"<address type='pci' domain='0x0000' bus='0x00' slot='0x09'
function='0x0'/>\n" +
"<driver queues='4'/>\n" +
"</controller>\n";
- assertEquals(str, expected);
+ assertEquals(expected, str);
}
}
diff --git a/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
b/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
index f0ccffbc719..7c02d95f3eb 100644
--- a/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
+++ b/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
@@ -213,7 +213,7 @@ public class KVMGuru extends HypervisorGuruBase implements
HypervisorGuru {
Integer maxHostCpuCore = max.second();
long minMemory = virtualMachineTo.getMinRam();
- Long maxMemory = minMemory;
+ Long maxMemory = virtualMachineTo.getMaxRam();
int minCpuCores = virtualMachineTo.getCpus();
Integer maxCpuCores = minCpuCores;