Cleanup copied disks in case of failure copying from temporary storage

This commit is contained in:
nvazquez 2026-06-23 23:17:05 -03:00
parent 31bd9ed45c
commit 07453d0ab1
No known key found for this signature in database
GPG Key ID: 656E1BCC8CB54F84
2 changed files with 27 additions and 2 deletions

View File

@ -156,12 +156,30 @@ public abstract class LibvirtBaseConvertCommandWrapper <T extends Command, A ext
String destinationName = UUID.randomUUID().toString();
KVMPhysicalDisk destinationDisk = storagePoolMgr.copyPhysicalDisk(sourceDisk, destinationName, destinationPool, 7200 * 1000);
targetDisks.add(destinationDisk);
try {
KVMPhysicalDisk destinationDisk = storagePoolMgr.copyPhysicalDisk(sourceDisk, destinationName, destinationPool, 7200 * 1000);
targetDisks.add(destinationDisk);
} catch (Exception e) {
String err = String.format("Error copying converted instance disk number %s from the temporary location %s" +
" to destination storage pool %s: %s", i, sourceDisk.getPool().getLocalPath(), destinationPool.getUuid(), e.getMessage());
logger.error(err, e);
cleanupMovedDisksOnDestinationPool(targetDisks);
return null;
}
}
return targetDisks;
}
private void cleanupMovedDisksOnDestinationPool(List<KVMPhysicalDisk> targetDisks) {
if (CollectionUtils.isEmpty(targetDisks)) {
return;
}
for (KVMPhysicalDisk disk : targetDisks) {
logger.info(String.format("Cleaning up disk %s from pool %s after conversion", disk.getName(), disk.getPool().getUuid()));
disk.getPool().deletePhysicalDisk(disk.getName(), Storage.ImageFormat.QCOW2);
}
}
protected UnmanagedInstanceTO getConvertedUnmanagedInstance(String baseName,
List<KVMPhysicalDisk> vmDisks,
LibvirtDomainXMLParser xmlParser) {

View File

@ -35,6 +35,7 @@ import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk;
import com.cloud.hypervisor.kvm.storage.KVMStoragePool;
import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager;
import com.cloud.resource.ResourceWrapper;
import org.apache.commons.collections4.CollectionUtils;
@ResourceWrapper(handles = ImportConvertedInstanceCommand.class)
public class LibvirtImportConvertedInstanceCommandWrapper extends LibvirtBaseConvertCommandWrapper<ImportConvertedInstanceCommand, Answer, LibvirtComputingResource> {
@ -71,6 +72,12 @@ public class LibvirtImportConvertedInstanceCommandWrapper extends LibvirtBaseCon
cleanupDisksAndDomainFromTemporaryLocation(temporaryDisks, temporaryStoragePool, temporaryConvertUuid, true);
}
if (CollectionUtils.isEmpty(disks)) {
String msg = String.format("Unable to import the converted disks for VM %s from destination pools", sourceInstanceName);
logger.error(msg);
return new ImportConvertedInstanceAnswer(cmd, false, msg);
}
UnmanagedInstanceTO convertedInstanceTO = getConvertedUnmanagedInstance(temporaryConvertUuid,
disks, xmlParser);
return new ImportConvertedInstanceAnswer(cmd, convertedInstanceTO);