diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java index 84978690ad77..9f5f35154069 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java @@ -47,28 +47,15 @@ public Answer execute(final CheckVMActivityOnStoragePoolCommand command, final L final StorageFilerTO pool = command.getPool(); final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + HAStoragePool haStoragePool = getMonitoredStoragePool(monitor, pool); + if (haStoragePool == null) { + executors.shutdownNow(); + return new Answer(command, false, "Unsupported Storage or HA pool not found"); + } + KVMStoragePool primaryPool = storagePoolMgr.getStoragePool(pool.getType(), pool.getUuid()); if (primaryPool.isPoolSupportHA()){ - HAStoragePool haStoragePool = null; - String vmActivityCheckPath = ""; - if (Storage.StoragePoolType.NetworkFilesystem == pool.getType()) { - haStoragePool = monitor.getStoragePool(pool.getUuid()); - vmActivityCheckPath = libvirtComputingResource.getVmActivityCheckPath(); - } else if (Storage.StoragePoolType.SharedMountPoint == pool.getType()) { - haStoragePool = monitor.getGfsStoragePool(pool.getUuid()); - vmActivityCheckPath = libvirtComputingResource.getVmActivityCheckPathGfs(); - } else if (Storage.StoragePoolType.RBD == pool.getType()) { - haStoragePool = monitor.getRbdStoragePool(pool.getUuid()); - vmActivityCheckPath = libvirtComputingResource.getVmActivityCheckPathRbd(); - } else if (Storage.StoragePoolType.CLVM == pool.getType()) { - haStoragePool = monitor.getClvmStoragePool(pool.getUuid()); - vmActivityCheckPath = libvirtComputingResource.getVmActivityCheckPathClvm(); - } - - if (haStoragePool == null) { - executors.shutdownNow(); - return new Answer(command, false, "Unsupported Storage or HA pool not found"); - } + String vmActivityCheckPath = getVmActivityCheckPath(libvirtComputingResource, pool); final KVMHAVMActivityChecker ha = new KVMHAVMActivityChecker(haStoragePool, command.getHost(), command.getVolumeList(), vmActivityCheckPath, command.getSuspectTimeInSeconds()); final Future future = executors.submit(ha); @@ -91,4 +78,30 @@ public Answer execute(final CheckVMActivityOnStoragePoolCommand command, final L executors.shutdownNow(); return new Answer(command, false, "Unsupported Storage"); } + + protected HAStoragePool getMonitoredStoragePool(final KVMHAMonitor monitor, final StorageFilerTO pool) { + if (Storage.StoragePoolType.NetworkFilesystem == pool.getType()) { + return monitor.getStoragePool(pool.getUuid()); + } else if (Storage.StoragePoolType.SharedMountPoint == pool.getType()) { + return monitor.getGfsStoragePool(pool.getUuid()); + } else if (Storage.StoragePoolType.RBD == pool.getType()) { + return monitor.getRbdStoragePool(pool.getUuid()); + } else if (Storage.StoragePoolType.CLVM == pool.getType()) { + return monitor.getClvmStoragePool(pool.getUuid()); + } + return null; + } + + protected String getVmActivityCheckPath(final LibvirtComputingResource libvirtComputingResource, final StorageFilerTO pool) { + if (Storage.StoragePoolType.NetworkFilesystem == pool.getType()) { + return libvirtComputingResource.getVmActivityCheckPath(); + } else if (Storage.StoragePoolType.SharedMountPoint == pool.getType()) { + return libvirtComputingResource.getVmActivityCheckPathGfs(); + } else if (Storage.StoragePoolType.RBD == pool.getType()) { + return libvirtComputingResource.getVmActivityCheckPathRbd(); + } else if (Storage.StoragePoolType.CLVM == pool.getType()) { + return libvirtComputingResource.getVmActivityCheckPathClvm(); + } + return ""; + } } diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java index 902826123096..bdfc87e488d1 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java @@ -189,6 +189,10 @@ private boolean isVMActivityOnHost(Host agent, DateTime suspectTime) throws HACh boolean activityStatus = true; HashMap> poolVolMap = getVolumeUuidOnHost(agent); for (StoragePool pool : poolVolMap.keySet()) { + if (!isStoragePoolHeartbeatEnabled(pool)) { + logger.debug("Skipping VM activity check for {} on storage pool [{}] because KVM HA storage heartbeat is not enabled for the pool.", agent, pool); + continue; + } activityStatus = verifyActivityOfStorageOnHost(poolVolMap, pool, agent, suspectTime, activityStatus); if (!activityStatus) { logger.warn("It seems that the storage pool [{}] does not have activity on {}.", pool, agent); @@ -199,6 +203,13 @@ private boolean isVMActivityOnHost(Host agent, DateTime suspectTime) throws HACh return activityStatus; } + protected boolean isStoragePoolHeartbeatEnabled(StoragePool pool) { + if (pool == null) { + return false; + } + return Boolean.TRUE.equals(HighAvailabilityManager.KvmHACheckOnStorage.valueIn(pool.getId())); + } + protected boolean verifyActivityOfStorageOnHost(HashMap> poolVolMap, StoragePool pool, Host agent, DateTime suspectTime, boolean activityStatus) throws HACheckerException, IllegalStateException { List volume_list = poolVolMap.get(pool); final CheckVMActivityOnStoragePoolCommand cmd = new CheckVMActivityOnStoragePoolCommand(agent, pool, volume_list, suspectTime);