diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index bb4246eb7df9..ba54d69a71c1 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -40,6 +40,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.storage.ScopeType; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroupService; @@ -1942,14 +1943,23 @@ public HashMap getVirtualMachineStatistics(long hostId, Stri @Override public HashMap getVolumeStatistics(long clusterId, String poolUuid, StoragePoolType poolType, List volumeLocators, int timeout) { List neighbors = _resourceMgr.listHostsInClusterByStatus(clusterId, Status.Up); - StoragePool storagePool = _storagePoolDao.findPoolByUUID(poolUuid); + StoragePoolVO storagePool = _storagePoolDao.findPoolByUUID(poolUuid); for (HostVO neighbor : neighbors) { - if (storagePool.isManaged()) { + // apply filters: + // - managed storage + // - local storage + if (storagePool.isManaged() || storagePool.isLocal()) { volumeLocators = getVolumesByHost(neighbor, storagePool); } + // - zone wide storage for specific hypervisortypes + if (ScopeType.ZONE.equals(storagePool.getScope()) && storagePool.getHypervisor() != neighbor.getHypervisorType()) { + // skip this neighbour if their hypervisor type is not the same as that of the store + continue; + } + GetVolumeStatsCommand cmd = new GetVolumeStatsCommand(poolType, poolUuid, volumeLocators); if (timeout > 0) {