Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean> future = executors.submit(ha);
Expand All @@ -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 "";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,10 @@ private boolean isVMActivityOnHost(Host agent, DateTime suspectTime) throws HACh
boolean activityStatus = true;
HashMap<StoragePool, List<Volume>> 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);
Expand All @@ -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<StoragePool, List<Volume>> poolVolMap, StoragePool pool, Host agent, DateTime suspectTime, boolean activityStatus) throws HACheckerException, IllegalStateException {
List<Volume> volume_list = poolVolMap.get(pool);
final CheckVMActivityOnStoragePoolCommand cmd = new CheckVMActivityOnStoragePoolCommand(agent, pool, volume_list, suspectTime);
Expand Down
Loading