diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java index 819cb7bc6ce..91ea07c5860 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java @@ -71,4 +71,6 @@ StateDao listAllByVolumeAndDataStore(long volumeId, DataStoreRole role); List listByState(ObjectInDataStoreStateMachine.State... states); + + SnapshotDataStoreVO findDestroyedReferenceBySnapshot(long snapshotId, DataStoreRole role); } diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java index c7358d1558b..151b9bae8bc 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java @@ -461,6 +461,15 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase sc = snapshotSearch.create(); + sc.setParameters("snapshot_id", snapshotId); + sc.setParameters("store_role", role); + sc.setParameters("state", State.Destroyed); + return findOneBy(sc); + } + private boolean isSnapshotChainingRequired(long volumeId) { hypervisorsSupportingSnapshotsChaining.add(Hypervisor.HypervisorType.XenServer); diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 79343ab4725..3c4f0070bed 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -1393,8 +1393,11 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } _snapshotDao.remove(destroyedSnapshotStoreVO.getSnapshotId()); - SnapshotDataStoreVO snapshotOnPrimary = _snapshotStoreDao.findBySnapshot(destroyedSnapshotStoreVO.getSnapshotId(), DataStoreRole.Primary); + SnapshotDataStoreVO snapshotOnPrimary = _snapshotStoreDao.findDestroyedReferenceBySnapshot(destroyedSnapshotStoreVO.getSnapshotId(), DataStoreRole.Primary); if (snapshotOnPrimary != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Deleting snapshot on primary store reference DB entry: " + snapshotOnPrimary); + } _snapshotStoreDao.remove(snapshotOnPrimary.getId()); } _snapshotStoreDao.remove(destroyedSnapshotStoreVO.getId());