From f843c537f06cd19995ffd55b34bc693c890b61a5 Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Sat, 18 Jul 2020 14:12:53 -0300 Subject: [PATCH] Fix snapshots garbage collection (#4188) * Cleanup orphan entries from snapshot store ref for primary storage * Add debug message --- .../storage/datastore/db/SnapshotDataStoreDao.java | 2 ++ .../storage/image/db/SnapshotDataStoreDaoImpl.java | 9 +++++++++ .../main/java/com/cloud/storage/StorageManagerImpl.java | 5 ++++- 3 files changed, 15 insertions(+), 1 deletion(-) 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());