Skip to content

Commit d127d79

Browse files
authored
KVM: fix SSVM starting when overprovisioning memory (apache#7663)
1 parent f4a4417 commit d127d79

File tree

5 files changed

+30
-25
lines changed

5 files changed

+30
-25
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,10 +2780,15 @@ protected GuestResourceDef createGuestResourceDef(VirtualMachineTO vmTO){
27802780

27812781
grd.setMemBalloning(!_noMemBalloon);
27822782

2783-
Long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
2783+
long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
2784+
long currRam = vmTO.getType() == VirtualMachine.Type.User ? getCurrentMemAccordingToMemBallooning(vmTO, maxRam) : maxRam;
2785+
2786+
if (s_logger.isTraceEnabled()) {
2787+
s_logger.trace(String.format("memory values for VM %s are %d/%d",vmTO.getName(),maxRam, currRam));
2788+
}
27842789

27852790
grd.setMemorySize(maxRam);
2786-
grd.setCurrentMem(getCurrentMemAccordingToMemBallooning(vmTO, maxRam));
2791+
grd.setCurrentMem(currRam);
27872792

27882793
int vcpus = vmTO.getCpus();
27892794
Integer maxVcpus = vmTO.getVcpuMaxLimit();

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ public void setMemBalloning(boolean memoryBalloning) {
282282
@Override
283283
public String toString() {
284284
StringBuilder response = new StringBuilder();
285-
response.append(String.format("<memory>%s</memory>\n", this.currentMemory));
285+
response.append(String.format("<memory>%s</memory>\n", this.memory));
286286
response.append(String.format("<currentMemory>%s</currentMemory>\n", this.currentMemory));
287287

288288
if (this.memory > this.currentMemory) {
@@ -1238,7 +1238,7 @@ public String getMemBalloonStatsPeriod() {
12381238
@Override
12391239
public String toString() {
12401240
StringBuilder memBalloonBuilder = new StringBuilder();
1241-
memBalloonBuilder.append("<memballoon model='" + memBalloonModel + "'>\n");
1241+
memBalloonBuilder.append("<memballoon model='" + memBalloonModel + "' autodeflate='on'>\n");
12421242
if (StringUtils.isNotBlank(memBalloonStatsPeriod)) {
12431243
memBalloonBuilder.append("<stats period='" + memBalloonStatsPeriod +"'/>\n");
12441244
}

plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ private void verifyVcpu(VirtualMachineTO to, Document domainDoc) {
760760

761761
private void verifyMemory(VirtualMachineTO to, Document domainDoc, String minRam) {
762762
assertXpath(domainDoc, "/domain/maxMemory/text()", String.valueOf( to.getMaxRam() / 1024 ));
763-
assertXpath(domainDoc, "/domain/memory/text()",minRam);
763+
assertXpath(domainDoc, "/domain/currentMemory/text()",minRam);
764764
assertXpath(domainDoc, "/domain/cpu/numa/cell/@memory", minRam);
765765
assertXpath(domainDoc, "/domain/currentMemory/text()", minRam);
766766
}

plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,11 @@ public void testDiskDef() {
214214
assertEquals(bus, disk.getBusType());
215215
assertEquals(DiskDef.DeviceType.DISK, disk.getDeviceType());
216216

217-
String xmlDef = disk.toString();
217+
String resultingXml = disk.toString();
218218
String expectedXml = "<disk device='disk' type='file'>\n<driver name='qemu' type='" + type.toString() + "' cache='" + cacheMode.toString() + "' />\n" +
219219
"<source file='" + filePath + "'/>\n<target dev='" + diskLabel + "' bus='" + bus.toString() + "'/>\n</disk>\n";
220220

221-
assertEquals(xmlDef, expectedXml);
221+
assertEquals(expectedXml, resultingXml);
222222
}
223223

224224
@Test
@@ -236,7 +236,7 @@ public void testDiskDefWithEncryption() {
236236
"<secret type='passphrase' uuid='" + passphraseUuid + "' />\n" +
237237
"</encryption>\n" +
238238
"</disk>\n";
239-
assertEquals(disk.toString(), expectedXML);
239+
assertEquals(expectedXML, disk.toString());
240240
}
241241

242242
@Test
@@ -346,7 +346,7 @@ public void testDiskDefWithBurst() {
346346
LibvirtVMDef.setGlobalQemuVersion(2006000L);
347347
LibvirtVMDef.setGlobalLibvirtVersion(9008L);
348348

349-
String xmlDef = disk.toString();
349+
String resultingXml = disk.toString();
350350
String expectedXml = "<disk device='disk' type='file'>\n<driver name='qemu' type='" + type.toString() + "' cache='none' />\n" +
351351
"<source file='" + filePath + "'/>\n<target dev='" + diskLabel + "' bus='" + bus.toString() + "'/>\n" +
352352
"<iotune>\n<read_bytes_sec>"+bytesReadRate+"</read_bytes_sec>\n<write_bytes_sec>"+bytesWriteRate+"</write_bytes_sec>\n" +
@@ -356,29 +356,29 @@ public void testDiskDefWithBurst() {
356356
"<read_bytes_sec_max_length>"+bytesReadRateMaxLength+"</read_bytes_sec_max_length>\n<write_bytes_sec_max_length>"+bytesWriteRateMaxLength+"</write_bytes_sec_max_length>\n" +
357357
"<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";
358358

359-
assertEquals(xmlDef, expectedXml);
359+
assertEquals(expectedXml, resultingXml);
360360
}
361361

362362
@Test
363363
public void memBalloonDefTestNone() {
364-
String expectedXml = "<memballoon model='none'>\n</memballoon>";
364+
String expectedXml = "<memballoon model='none' autodeflate='on'>\n</memballoon>";
365365
MemBalloonDef memBalloonDef = new MemBalloonDef();
366366
memBalloonDef.defNoneMemBalloon();
367367

368-
String xmlDef = memBalloonDef.toString();
368+
String resultingXml = memBalloonDef.toString();
369369

370-
assertEquals(xmlDef, expectedXml);
370+
assertEquals(expectedXml, resultingXml);
371371
}
372372

373373
@Test
374374
public void memBalloonDefTestVirtio() {
375-
String expectedXml = "<memballoon model='virtio'>\n<stats period='60'/>\n</memballoon>";
375+
String expectedXml = "<memballoon model='virtio' autodeflate='on'>\n<stats period='60'/>\n</memballoon>";
376376
MemBalloonDef memBalloonDef = new MemBalloonDef();
377377
memBalloonDef.defVirtioMemBalloon("60");
378378

379-
String xmlDef = memBalloonDef.toString();
379+
String resultingXml = memBalloonDef.toString();
380380

381-
assertEquals(xmlDef, expectedXml);
381+
assertEquals(expectedXml, resultingXml);
382382
}
383383

384384
@Test
@@ -413,11 +413,11 @@ public void testRngDef() {
413413
int bytes = 2048;
414414

415415
LibvirtVMDef.RngDef def = new LibvirtVMDef.RngDef(path, backendModel, bytes, period);
416-
assertEquals(def.getPath(), path);
417-
assertEquals(def.getRngBackendModel(), backendModel);
418-
assertEquals(def.getRngModel(), LibvirtVMDef.RngDef.RngModel.VIRTIO);
419-
assertEquals(def.getRngRateBytes(), bytes);
420-
assertEquals(def.getRngRatePeriod(), period);
416+
assertEquals(path, def.getPath());
417+
assertEquals(backendModel, def.getRngBackendModel());
418+
assertEquals(LibvirtVMDef.RngDef.RngModel.VIRTIO, def.getRngModel());
419+
assertEquals(bytes, def.getRngRateBytes());
420+
assertEquals(period, def.getRngRatePeriod());
421421
}
422422

423423
@Test
@@ -441,8 +441,8 @@ public void testWatchDogDef() {
441441
LibvirtVMDef.WatchDogDef.WatchDogAction action = LibvirtVMDef.WatchDogDef.WatchDogAction.RESET;
442442

443443
LibvirtVMDef.WatchDogDef def = new LibvirtVMDef.WatchDogDef(action, model);
444-
assertEquals(def.getModel(), model);
445-
assertEquals(def.getAction(), action);
444+
assertEquals(model, def.getModel());
445+
assertEquals(action, def.getAction());
446446
}
447447

448448
@Test
@@ -453,6 +453,6 @@ public void testSCSIDef() {
453453
"<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>\n" +
454454
"<driver queues='4'/>\n" +
455455
"</controller>\n";
456-
assertEquals(str, expected);
456+
assertEquals(expected, str);
457457
}
458458
}

server/src/main/java/com/cloud/hypervisor/KVMGuru.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ protected void configureVmMemoryAndCpuCores(VirtualMachineTO virtualMachineTo, H
213213
Integer maxHostCpuCore = max.second();
214214

215215
long minMemory = virtualMachineTo.getMinRam();
216-
Long maxMemory = minMemory;
216+
Long maxMemory = virtualMachineTo.getMaxRam();
217217
int minCpuCores = virtualMachineTo.getCpus();
218218
Integer maxCpuCores = minCpuCores;
219219

0 commit comments

Comments
 (0)