From 3a456f1b3149c8682e052897bab15860eae5e359 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 10 Mar 2022 12:49:03 +0100 Subject: [PATCH] server: mark volume snapshots as Destroyed if it does not exist on primary and secondary storage when delete a volume (#6057) * server: mark volume snapshots as Destroyed in some cases when delete a volume in QCOW2 format when delete a volume in QCOW2 format, if volume snapshot does not exist on primary and secondary storage, mark the snapshot as Destroyed. * Update #6057: remove check on volume format --- .../cloud/storage/snapshot/SnapshotApiService.java | 2 ++ .../storage/volume/VolumeServiceImpl.java | 8 ++++++-- .../cloud/storage/snapshot/SnapshotManagerImpl.java | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java b/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java index a80391b3525..cb67ba75caa 100644 --- a/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java +++ b/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java @@ -118,4 +118,6 @@ public interface SnapshotApiService { Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, Long volumeId, Long vmSnapshotId); SnapshotPolicy updateSnapshotPolicy(UpdateSnapshotPolicyCmd updateSnapshotPolicyCmd); + + void markVolumeSnapshotsAsDestroyed(Volume volume); } diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 92526846729..e762ddfd816 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -122,6 +122,7 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.storage.snapshot.SnapshotApiService; import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.template.TemplateProp; import com.cloud.user.AccountManager; @@ -194,6 +195,8 @@ public class VolumeServiceImpl implements VolumeService { private StorageManager _storageMgr; @Inject private AnnotationDao annotationDao; + @Inject + private SnapshotApiService snapshotApiService; private final static String SNAPSHOT_ID = "SNAPSHOT_ID"; @@ -448,9 +451,9 @@ public class VolumeServiceImpl implements VolumeService { volDao.remove(vo.getId()); } - SnapshotDataStoreVO snapStoreVo = _snapshotStoreDao.findByVolume(vo.getId(), DataStoreRole.Primary); + List snapStoreVOs = _snapshotStoreDao.listAllByVolumeAndDataStore(vo.getId(), DataStoreRole.Primary); - if (snapStoreVo != null) { + for (SnapshotDataStoreVO snapStoreVo : snapStoreVOs) { long storagePoolId = snapStoreVo.getDataStoreId(); StoragePoolVO storagePoolVO = storagePoolDao.findById(storagePoolId); @@ -468,6 +471,7 @@ public class VolumeServiceImpl implements VolumeService { _snapshotStoreDao.remove(snapStoreVo.getId()); } } + snapshotApiService.markVolumeSnapshotsAsDestroyed(vo); } else { vo.processEvent(Event.OperationFailed); apiResult.setResult(result.getResult()); diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java index ffa393bd866..43cbf1f78d3 100755 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -60,6 +60,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -1543,4 +1544,16 @@ public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implement _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, new Long(volume.getSize())); return snapshot; } + + @Override + public void markVolumeSnapshotsAsDestroyed(Volume volume) { + List snapshots = _snapshotDao.listByVolumeId(volume.getId()); + for (SnapshotVO snapshot: snapshots) { + List snapshotDataStoreVOs = _snapshotStoreDao.findBySnapshotId(snapshot.getId()); + if (CollectionUtils.isEmpty(snapshotDataStoreVOs)) { + snapshot.setState(Snapshot.State.Destroyed); + _snapshotDao.update(snapshot.getId(), snapshot); + } + } + } }