Skip to content

Commit

Permalink
libvirtstorageadaptor: better handle failed libvirt storagepool destroy
Browse files Browse the repository at this point in the history
If the libvirt mount point is still busy and can't be unmounted
right now, it was waited 5 seconds and an plain unmount was tried,
without cleaning up the libvirt storagepool.
This kept libvirt thinking the storagepool
is active and mounted (which it wasn't).

Now after the plain unmount call, also
the libvirt storagepool will be destroyed.
  • Loading branch information
rp- committed Jul 15, 2024
1 parent 7db83db commit c98f682
Showing 1 changed file with 39 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -766,26 +766,53 @@ public KVMStoragePool createStoragePool(String name, String host, int port, Stri
}
}

private boolean destroyStoragePool(Connect conn, String uuid) throws LibvirtException
{
StoragePool sp;
try {
sp = conn.storagePoolLookupByUUIDString(uuid);
} catch (LibvirtException exc) {
s_logger.warn("Storage pool " + uuid + " doesn't exist in libvirt. Assuming it is already removed");
return true;
}

if (sp != null) {
if (sp.isPersistent() == 1) {
sp.destroy();
sp.undefine();
} else {
sp.destroy();
}
sp.free();

return true;
} else {
s_logger.warn("Storage pool " + uuid + " doesn't exist in libvirt. Assuming it is already removed");
return false;
}
}

private boolean destroyStoragePoolHandleException(Connect conn, String uuid)
{
try {
return destroyStoragePool(conn, uuid);
} catch (LibvirtException e) {
s_logger.error(String.format("Failed to destroy libvirt pool %s: %s", uuid, e));
}
return false;
}

@Override
public boolean deleteStoragePool(String uuid) {
s_logger.info("Attempting to remove storage pool " + uuid + " from libvirt");
Connect conn = null;
Connect conn;
try {
conn = LibvirtConnection.getConnection();
} catch (LibvirtException e) {
throw new CloudRuntimeException(e.toString());
}

StoragePool sp = null;
Secret s = null;

try {
sp = conn.storagePoolLookupByUUIDString(uuid);
} catch (LibvirtException e) {
s_logger.warn("Storage pool " + uuid + " doesn't exist in libvirt. Assuming it is already removed");
return true;
}

/*
* Some storage pools, like RBD also have 'secret' information stored in libvirt
* Destroy them if they exist
Expand All @@ -797,13 +824,7 @@ public boolean deleteStoragePool(String uuid) {
}

try {
if (sp.isPersistent() == 1) {
sp.destroy();
sp.undefine();
} else {
sp.destroy();
}
sp.free();
destroyStoragePool(conn, uuid);
if (s != null) {
s.undefine();
s.free();
Expand All @@ -821,6 +842,7 @@ public boolean deleteStoragePool(String uuid) {
String result = Script.runSimpleBashScript("sleep 5 && umount " + targetPath);
if (result == null) {
s_logger.info("Succeeded in unmounting " + targetPath);
destroyStoragePoolHandleException(conn, uuid);
return true;
}
s_logger.error("Failed to unmount " + targetPath);
Expand Down

0 comments on commit c98f682

Please sign in to comment.