From 1da76d27f13e045ac88e6c494d604d6133486c9c Mon Sep 17 00:00:00 2001 From: Sid Kattoju <45833770+skattoju4@users.noreply.github.com> Date: Fri, 21 Aug 2020 05:08:36 -0400 Subject: [PATCH] iscsi session cleanup now configurable, filters iscsi partitions (#4219) Added property to agent.properties that enables or disables the iscsi session clean up feature. #4210 Added a condition to prevent disk partitions from being cleaned up. #4216 --- agent/conf/agent.properties | 5 +++++ .../kvm/resource/LibvirtComputingResource.java | 13 ++++++++++--- .../kvm/storage/IscsiStorageCleanupMonitor.java | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties index b45526aa6af..426c701df44 100644 --- a/agent/conf/agent.properties +++ b/agent/conf/agent.properties @@ -218,3 +218,8 @@ hypervisor.type=kvm # timer. # For all actions refer to the libvirt documentation. # Recommended values are: none, reset and poweroff. +# +iscsi.session.cleanup.enabled=false +# Automatically clean up iscsi sessions not attached to any VM. +# Should be enabled for users using managed storage for example solidfire. +# Should be disabled for users with unmanaged iscsi connections on their hosts diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 950dffa6f70..580d6284952 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -61,6 +61,7 @@ import org.apache.cloudstack.utils.security.KeyStoreUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.joda.time.Duration; @@ -1088,9 +1089,15 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv storageProcessor.configure(name, params); storageHandler = new StorageSubsystemCommandHandlerBase(storageProcessor); - IscsiStorageCleanupMonitor isciCleanupMonitor = new IscsiStorageCleanupMonitor(); - final Thread cleanupMonitor = new Thread(isciCleanupMonitor); - cleanupMonitor.start(); + Boolean _iscsiCleanUpEnabled = Boolean.parseBoolean((String)params.get("iscsi.session.cleanup.enabled")); + + if (BooleanUtils.isTrue(_iscsiCleanUpEnabled)) { + IscsiStorageCleanupMonitor isciCleanupMonitor = new IscsiStorageCleanupMonitor(); + final Thread cleanupMonitor = new Thread(isciCleanupMonitor); + cleanupMonitor.start(); + } else { + s_logger.info("iscsi session clean up is disabled"); + } return true; } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiStorageCleanupMonitor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiStorageCleanupMonitor.java index e5ce6bbd9ac..c8a5fc88a19 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiStorageCleanupMonitor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiStorageCleanupMonitor.java @@ -38,6 +38,7 @@ public class IscsiStorageCleanupMonitor implements Runnable{ private static final String ISCSI_PATH_PREFIX = "/dev/disk/by-path"; private static final String KEYWORD_ISCSI = "iscsi"; private static final String KEYWORD_IQN = "iqn"; + private static final String REGEX_PART = "\\S+part\\d+$"; private IscsiAdmStorageAdaptor iscsiStorageAdaptor; @@ -114,7 +115,7 @@ public class IscsiStorageCleanupMonitor implements Runnable{ //check the volume map. If an entry exists change the status to True for (final LibvirtVMDef.DiskDef disk : disks) { - if (diskStatusMap.containsKey(disk.getDiskPath())) { + if (diskStatusMap.containsKey(disk.getDiskPath())&&!disk.getDiskPath().matches(REGEX_PART)) { diskStatusMap.put(disk.getDiskPath(), true); s_logger.debug("active disk found by cleanup thread" + disk.getDiskPath()); }