From 330d8556613c3102f04abb758453fcc57da0acc0 Mon Sep 17 00:00:00 2001 From: sandeeplocharla Date: Fri, 11 Sep 2026 08:23:28 +0530 Subject: [PATCH] Fix for NFS primary storage pool failing to come out of maintenance mode Enable maintenance on KVM NFS goes through deleteStoragePool(uuid, details), which LibvirtStorageAdaptor did not override, so the default no-op ran after the HA monitor unmounted the share. Cancel maintenance then reused a defined libvirt pool with no mount. Override the details delete path to destroy the libvirt pool, and unmount via the HA monitor only after libvirt has deleted the pool. Fixes: #12690 Signed-off-by: sandeeplocharla --- .../cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java | 6 ++++-- .../cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java index 35cc864268c3..9d8ec8fc4637 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java @@ -417,7 +417,7 @@ public boolean deleteStoragePool(StoragePoolType type, String uuid) { if (type == StoragePoolType.NetworkFilesystem) { _haMonitor.removeStoragePool(uuid); } - boolean deleteStatus = adaptor.deleteStoragePool(uuid);; + boolean deleteStatus = adaptor.deleteStoragePool(uuid); synchronized (_storagePools) { _storagePools.remove(uuid); } @@ -426,10 +426,12 @@ public boolean deleteStoragePool(StoragePoolType type, String uuid) { public boolean deleteStoragePool(StoragePoolType type, String uuid, Map details) { StorageAdaptor adaptor = getStorageAdaptor(type); + // For NetworkFilesystem, libvirt will take care of unmounting the nfs mount. If nfs mount has been removed before libvirt's pool + // delete, libvirt will throw an error. + boolean deleteStatus = adaptor.deleteStoragePool(uuid, details); if (type == StoragePoolType.NetworkFilesystem) { _haMonitor.removeStoragePool(uuid); } - boolean deleteStatus = adaptor.deleteStoragePool(uuid, details); synchronized (_storagePools) { _storagePools.remove(uuid); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 6c21065340cd..7608044a09e3 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -903,6 +903,11 @@ private boolean destroyStoragePoolHandleException(Connect conn, String uuid) return false; } + @Override + public boolean deleteStoragePool(String uuid, Map details) { + return deleteStoragePool(uuid); + } + @Override public boolean deleteStoragePool(String uuid) { logger.info("Attempting to remove storage pool " + uuid + " from libvirt");