@@ -106,6 +106,10 @@ protected Answer takeDiskOnlyVmSnapshotOfRunningVm(CreateDiskOnlyVmSnapshotComma
106106 return new CreateDiskOnlyVmSnapshotAnswer (cmd , false , errorMsg , null );
107107 }
108108 return new CreateDiskOnlyVmSnapshotAnswer (cmd , false , e .getMessage (), null );
109+ } catch (Exception e ) {
110+ String errorMsg = String .format ("Creation of disk-only VM snapshot for VM [%s] failed due to %s." , vmName , e .getMessage ());
111+ logger .error (errorMsg , e );
112+ return new CreateDiskOnlyVmSnapshotAnswer (cmd , false , errorMsg , null );
109113 } finally {
110114 if (dm != null ) {
111115 try {
@@ -146,21 +150,13 @@ protected Answer takeDiskOnlyVmSnapshotOfStoppedVm(CreateDiskOnlyVmSnapshotComma
146150 }
147151 } catch (LibvirtException | QemuImgException e ) {
148152 logger .error ("Exception while creating disk-only VM snapshot for VM [{}]. Deleting leftover deltas." , vmName , e );
149- for (VolumeObjectTO volumeObjectTO : volumeObjectTos ) {
150- Pair <Long , String > volSizeAndNewPath = mapVolumeToSnapshotSizeAndNewVolumePath .get (volumeObjectTO .getUuid ());
151- PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO ) volumeObjectTO .getDataStore ();
152- KVMStoragePool kvmStoragePool = storagePoolMgr .getStoragePool (primaryDataStoreTO .getPoolType (), primaryDataStoreTO .getUuid ());
153-
154- if (volSizeAndNewPath == null ) {
155- continue ;
156- }
157- try {
158- Files .deleteIfExists (Path .of (kvmStoragePool .getLocalPathFor (volSizeAndNewPath .second ())));
159- } catch (IOException ex ) {
160- logger .warn ("Tried to delete leftover snapshot at [{}] failed." , volSizeAndNewPath .second (), ex );
161- }
162- }
153+ cleanupLeftoverDeltas (volumeObjectTos , mapVolumeToSnapshotSizeAndNewVolumePath , storagePoolMgr );
163154 return new Answer (cmd , e );
155+ } catch (Exception e ) {
156+ logger .error ("Unexpected exception while creating disk-only VM snapshot for VM [{}]. Deleting leftover deltas." , vmName , e );
157+ cleanupLeftoverDeltas (volumeObjectTos , mapVolumeToSnapshotSizeAndNewVolumePath , storagePoolMgr );
158+ return new CreateDiskOnlyVmSnapshotAnswer (cmd , false ,
159+ String .format ("Creation of disk-only VM snapshot for VM [%s] failed due to %s." , vmName , e .getMessage ()), null );
164160 }
165161
166162 return new CreateDiskOnlyVmSnapshotAnswer (cmd , true , null , mapVolumeToSnapshotSizeAndNewVolumePath );
@@ -192,6 +188,23 @@ protected Pair<String, Map<String, Pair<Long, String>>> createSnapshotXmlAndNewV
192188 return new Pair <>(snapshotXml , volumeObjectToNewPathMap );
193189 }
194190
191+ protected void cleanupLeftoverDeltas (List <VolumeObjectTO > volumeObjectTos , Map <String , Pair <Long , String >> mapVolumeToSnapshotSizeAndNewVolumePath , KVMStoragePoolManager storagePoolMgr ) {
192+ for (VolumeObjectTO volumeObjectTO : volumeObjectTos ) {
193+ Pair <Long , String > volSizeAndNewPath = mapVolumeToSnapshotSizeAndNewVolumePath .get (volumeObjectTO .getUuid ());
194+ PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO ) volumeObjectTO .getDataStore ();
195+ KVMStoragePool kvmStoragePool = storagePoolMgr .getStoragePool (primaryDataStoreTO .getPoolType (), primaryDataStoreTO .getUuid ());
196+
197+ if (volSizeAndNewPath == null ) {
198+ continue ;
199+ }
200+ try {
201+ Files .deleteIfExists (Path .of (kvmStoragePool .getLocalPathFor (volSizeAndNewPath .second ())));
202+ } catch (IOException ex ) {
203+ logger .warn ("Tried to delete leftover snapshot at [{}] failed." , volSizeAndNewPath .second (), ex );
204+ }
205+ }
206+ }
207+
195208 protected long getFileSize (String path ) {
196209 return new File (path ).length ();
197210 }
0 commit comments