Skip to content

Commit eb31e3d

Browse files
committed
Merge release branch 4.18 to main
* 4.18: Allow KVM overcommit to work without reducing minimum VM memory when vm ballooning is disabled (#7810)
2 parents 84974a1 + dc5e4f3 commit eb31e3d

File tree

4 files changed

+24
-22
lines changed

4 files changed

+24
-22
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,15 +2791,10 @@ protected GuestResourceDef createGuestResourceDef(VirtualMachineTO vmTO){
27912791

27922792
grd.setMemBalloning(!_noMemBalloon);
27932793

2794-
long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
2795-
long currRam = vmTO.getType() == VirtualMachine.Type.User ? getCurrentMemAccordingToMemBallooning(vmTO, maxRam) : maxRam;
2796-
2797-
if (s_logger.isTraceEnabled()) {
2798-
s_logger.trace(String.format("memory values for VM %s are %d/%d",vmTO.getName(),maxRam, currRam));
2799-
}
2794+
Long maxRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMaxRam());
28002795

28012796
grd.setMemorySize(maxRam);
2802-
grd.setCurrentMem(currRam);
2797+
grd.setCurrentMem(getCurrentMemAccordingToMemBallooning(vmTO, maxRam));
28032798

28042799
int vcpus = vmTO.getCpus();
28052800
Integer maxVcpus = vmTO.getVcpuMaxLimit();
@@ -2811,12 +2806,17 @@ protected GuestResourceDef createGuestResourceDef(VirtualMachineTO vmTO){
28112806
}
28122807

28132808
protected long getCurrentMemAccordingToMemBallooning(VirtualMachineTO vmTO, long maxRam) {
2809+
long retVal = maxRam;
28142810
if (_noMemBalloon) {
28152811
s_logger.warn(String.format("Setting VM's [%s] current memory as max memory [%s] due to memory ballooning is disabled. If you are using a custom service offering, verify if memory ballooning really should be disabled.", vmTO.toString(), maxRam));
2816-
return maxRam;
2812+
} else if (vmTO != null && vmTO.getType() != VirtualMachine.Type.User) {
2813+
s_logger.warn(String.format("Setting System VM's [%s] current memory as max memory [%s].", vmTO.toString(), maxRam));
28172814
} else {
2818-
return ByteScaleUtils.bytesToKibibytes(vmTO.getMinRam());
2815+
long minRam = ByteScaleUtils.bytesToKibibytes(vmTO.getMinRam());
2816+
s_logger.debug(String.format("Setting VM's [%s] current memory as min memory [%s] due to memory ballooning is enabled.", vmTO.toString(), minRam));
2817+
retVal = minRam;
28192818
}
2819+
return retVal;
28202820
}
28212821

28222822
/**

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.memory));
285+
response.append(String.format("<memory>%s</memory>\n", this.currentMemory));
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 + "' autodeflate='on'>\n");
1241+
memBalloonBuilder.append("<memballoon model='" + memBalloonModel + "'>\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: 3 additions & 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/currentMemory/text()",minRam);
763+
assertXpath(domainDoc, "/domain/memory/text()",minRam);
764764
assertXpath(domainDoc, "/domain/cpu/numa/cell/@memory", minRam);
765765
assertXpath(domainDoc, "/domain/currentMemory/text()", minRam);
766766
}
@@ -5762,6 +5762,7 @@ public void testAddExtraConfigComponentNotEmptyExtraConfig() {
57625762

57635763
public void validateGetCurrentMemAccordingToMemBallooningWithoutMemBalooning(){
57645764
VirtualMachineTO vmTo = Mockito.mock(VirtualMachineTO.class);
5765+
Mockito.when(vmTo.getType()).thenReturn(Type.User);
57655766
LibvirtComputingResource libvirtComputingResource = new LibvirtComputingResource();
57665767
libvirtComputingResource._noMemBalloon = true;
57675768
long maxMemory = 2048;
@@ -5780,6 +5781,7 @@ public void validateGetCurrentMemAccordingToMemBallooningWithtMemBalooning(){
57805781
long minMemory = ByteScaleUtils.mebibytesToBytes(64);
57815782

57825783
VirtualMachineTO vmTo = Mockito.mock(VirtualMachineTO.class);
5784+
Mockito.when(vmTo.getType()).thenReturn(Type.User);
57835785
Mockito.when(vmTo.getMinRam()).thenReturn(minMemory);
57845786

57855787
long currentMemory = libvirtComputingResource.getCurrentMemAccordingToMemBallooning(vmTo, maxMemory);

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,11 @@ public void testDiskDef() {
266266
assertEquals(bus, disk.getBusType());
267267
assertEquals(DiskDef.DeviceType.DISK, disk.getDeviceType());
268268

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

273-
assertEquals(expectedXml, resultingXml);
273+
assertEquals(expectedXml, xmlDef);
274274
}
275275

276276
@Test
@@ -398,7 +398,7 @@ public void testDiskDefWithBurst() {
398398
LibvirtVMDef.setGlobalQemuVersion(2006000L);
399399
LibvirtVMDef.setGlobalLibvirtVersion(9008L);
400400

401-
String resultingXml = disk.toString();
401+
String xmlDef = disk.toString();
402402
String expectedXml = "<disk device='disk' type='file'>\n<driver name='qemu' type='" + type.toString() + "' cache='none' />\n" +
403403
"<source file='" + filePath + "'/>\n<target dev='" + diskLabel + "' bus='" + bus.toString() + "'/>\n" +
404404
"<iotune>\n<read_bytes_sec>"+bytesReadRate+"</read_bytes_sec>\n<write_bytes_sec>"+bytesWriteRate+"</write_bytes_sec>\n" +
@@ -408,29 +408,29 @@ public void testDiskDefWithBurst() {
408408
"<read_bytes_sec_max_length>"+bytesReadRateMaxLength+"</read_bytes_sec_max_length>\n<write_bytes_sec_max_length>"+bytesWriteRateMaxLength+"</write_bytes_sec_max_length>\n" +
409409
"<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";
410410

411-
assertEquals(expectedXml, resultingXml);
411+
assertEquals(expectedXml, xmlDef);
412412
}
413413

414414
@Test
415415
public void memBalloonDefTestNone() {
416-
String expectedXml = "<memballoon model='none' autodeflate='on'>\n</memballoon>";
416+
String expectedXml = "<memballoon model='none'>\n</memballoon>";
417417
MemBalloonDef memBalloonDef = new MemBalloonDef();
418418
memBalloonDef.defNoneMemBalloon();
419419

420-
String resultingXml = memBalloonDef.toString();
420+
String xmlDef = memBalloonDef.toString();
421421

422-
assertEquals(expectedXml, resultingXml);
422+
assertEquals(expectedXml, xmlDef);
423423
}
424424

425425
@Test
426426
public void memBalloonDefTestVirtio() {
427-
String expectedXml = "<memballoon model='virtio' autodeflate='on'>\n<stats period='60'/>\n</memballoon>";
427+
String expectedXml = "<memballoon model='virtio'>\n<stats period='60'/>\n</memballoon>";
428428
MemBalloonDef memBalloonDef = new MemBalloonDef();
429429
memBalloonDef.defVirtioMemBalloon("60");
430430

431-
String resultingXml = memBalloonDef.toString();
431+
String xmlDef = memBalloonDef.toString();
432432

433-
assertEquals(expectedXml, resultingXml);
433+
assertEquals(expectedXml, xmlDef);
434434
}
435435

436436
@Test

0 commit comments

Comments
 (0)