From d67af8661bc11d98af4da502adb44810e8467667 Mon Sep 17 00:00:00 2001 From: cl-k-takahashi <39983652+cl-k-takahashi@users.noreply.github.com> Date: Thu, 7 Jun 2018 15:53:21 +0900 Subject: [PATCH] kvm: check if storage pool is mounted before creating pool xml (#2696) Now the KVM agent checks whether a storage pool is mounted or not mounted before calling storagePoolCreateXML(). Signed-off-by: Kai Takahashi --- .../kvm/storage/LibvirtStorageAdaptor.java | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 64d2a0421b0..24cf0312046 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -147,44 +147,24 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { StoragePool sp = null; try { s_logger.debug(spd.toString()); + // check whether the pool is already mounted + int mountpointResult = Script.runSimpleBashScriptForExitValue("mountpoint -q " + targetPath); + // if the pool is mounted, try to unmount it + if(mountpointResult == 0) { + s_logger.info("Attempting to unmount old mount at " + targetPath); + String result = Script.runSimpleBashScript("umount -l " + targetPath); + if (result == null) { + s_logger.info("Succeeded in unmounting " + targetPath); + } else { + s_logger.error("Failed in unmounting storage"); + } + } + sp = conn.storagePoolCreateXML(spd.toString(), 0); return sp; } catch (LibvirtException e) { s_logger.error(e.toString()); - // if error is that pool is mounted, try to handle it - if (e.toString().contains("already mounted")) { - s_logger.error("Attempting to unmount old mount libvirt is unaware of at " + targetPath); - String result = Script.runSimpleBashScript("umount -l " + targetPath); - if (result == null) { - s_logger.error("Succeeded in unmounting " + targetPath); - try { - sp = conn.storagePoolCreateXML(spd.toString(), 0); - s_logger.error("Succeeded in redefining storage"); - return sp; - } catch (LibvirtException l) { - s_logger.error("Target was already mounted, unmounted it but failed to redefine storage:" + l); - } - } else { - s_logger.error("Failed in unmounting and redefining storage"); - } - } else { - s_logger.error("Internal error occurred when attempting to mount: specified path may be invalid"); - throw e; - } - if (sp != null) { - try { - if (sp.isPersistent() == 1) { - sp.destroy(); - sp.undefine(); - } else { - sp.destroy(); - } - sp.free(); - } catch (LibvirtException l) { - s_logger.debug("Failed to undefine " + fsType.toString() + " storage pool with: " + l.toString()); - } - } - return null; + throw e; } }