Skip to content

Commit 001a0cc

Browse files
authored
Merge branch 'ablecloud-team:ablestack-diplo' into diplo-2026
2 parents d6838ba + 8694150 commit 001a0cc

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@
3232
import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
3333
import com.cloud.resource.CommandWrapper;
3434
import com.cloud.resource.ResourceWrapper;
35+
import com.cloud.utils.script.Script;
3536

3637
@ResourceWrapper(handles = GetVmStatsCommand.class)
3738
public final class LibvirtGetVmStatsCommandWrapper extends CommandWrapper<GetVmStatsCommand, Answer, LibvirtComputingResource> {
39+
private static final int DOM_JOB_INFO_TIMEOUT_MS = 10000;
40+
private static final String JOB_TYPE_PREFIX = "Job type:";
41+
private static final String JOB_TYPE_NONE = "None";
3842

3943

4044
@Override
@@ -43,6 +47,10 @@ public Answer execute(final GetVmStatsCommand command, final LibvirtComputingRes
4347
try {
4448
final HashMap<String, VmStatsEntry> vmStatsNameMap = new HashMap<String, VmStatsEntry>();
4549
for (final String vmName : vmNames) {
50+
if (!isVmStatsCollectable(vmName)) {
51+
logger.debug("Skipping VM stats collection for [{}] because a libvirt job is currently active.", vmName);
52+
continue;
53+
}
4654

4755
final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
4856

@@ -64,4 +72,26 @@ public Answer execute(final GetVmStatsCommand command, final LibvirtComputingRes
6472
return new GetVmStatsAnswer(command, null);
6573
}
6674
}
75+
76+
private boolean isVmStatsCollectable(final String vmName) {
77+
final String output = Script.runSimpleBashScript(String.format(
78+
"virsh -c qemu:///system domjobinfo %s 2>&1", vmName), DOM_JOB_INFO_TIMEOUT_MS);
79+
if (output == null) {
80+
logger.debug("Skipping VM stats collection for [{}] because domjobinfo returned null output.", vmName);
81+
return false;
82+
}
83+
84+
for (final String line : output.split("\\R")) {
85+
final String trimmedLine = line.trim();
86+
if (!trimmedLine.startsWith(JOB_TYPE_PREFIX)) {
87+
continue;
88+
}
89+
90+
final String jobType = trimmedLine.substring(JOB_TYPE_PREFIX.length()).trim();
91+
return JOB_TYPE_NONE.equals(jobType);
92+
}
93+
94+
logger.debug("Skipping VM stats collection for [{}] because domjobinfo output did not include a job type. Output: {}", vmName, output);
95+
return false;
96+
}
6797
}

0 commit comments

Comments
 (0)