3232import com .cloud .hypervisor .kvm .resource .LibvirtComputingResource ;
3333import com .cloud .resource .CommandWrapper ;
3434import com .cloud .resource .ResourceWrapper ;
35+ import com .cloud .utils .script .Script ;
3536
3637@ ResourceWrapper (handles = GetVmStatsCommand .class )
3738public 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