diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index 257c6a23e41..b575fdb4f02 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -1071,7 +1071,7 @@ public class XenServerStorageProcessor implements StorageProcessor { return false; } - private boolean destroySnapshotOnPrimaryStorage(final Connection conn, final String lastSnapshotUuid) { + protected boolean destroySnapshotOnPrimaryStorage(final Connection conn, final String lastSnapshotUuid) { try { final VDI snapshot = getVDIbyUuid(conn, lastSnapshotUuid); if (snapshot == null) { diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index ca58e4a4154..dea1752abd7 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -559,12 +559,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { physicalSize = Long.parseLong(tmp[1]); finalPath = folder + File.separator + snapshotBackupUuid + ".vhd"; } - - final String volumeUuid = snapshotTO.getVolume().getPath(); - - destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); } + // remove every snapshot except this one from primary storage + final String volumeUuid = snapshotTO.getVolume().getPath(); + destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); + final SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); newSnapshot.setPath(finalPath); newSnapshot.setPhysicalSize(physicalSize); @@ -577,12 +577,13 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { s_logger.info("New snapshot physical utilization: "+physicalSize); return new CopyCmdAnswer(newSnapshot); - } catch (final Types.XenAPIException e) { - details = "BackupSnapshot Failed due to " + e.toString(); - s_logger.warn(details, e); } catch (final Exception e) { - details = "BackupSnapshot Failed due to " + e.getMessage(); + final String reason = e instanceof Types.XenAPIException ? e.toString() : e.getMessage(); + details = "BackupSnapshot Failed due to " + reason; s_logger.warn(details, e); + + // remove last bad primary snapshot when exception happens + destroySnapshotOnPrimaryStorage(conn, snapshotUuid); } return new CopyCmdAnswer(details);