This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.15
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.15 by this push:
     new be255e4  server: protect against stray snapshot-details without 
snapshot (#4924)
be255e4 is described below

commit be255e4203b573a0967768be5b19e03c0100b649
Author: dahn <[email protected]>
AuthorDate: Thu Apr 29 17:10:29 2021 +0200

    server: protect against stray snapshot-details without snapshot (#4924)
    
    This PR makes sure no orphaned snapshot details are considered in the 
cleanup at startup job.
    a real solution would be to implement some kind of cascading delete, but as 
the parent record is "only" marked as removed this would be a bit com
    
    Co-authored-by: Daan Hoogland <[email protected]>
---
 .../cloudstack/engine/orchestration/DataMigrationUtility.java  |  4 +++-
 .../cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java   |  3 +++
 .../org/apache/cloudstack/storage/snapshot/SnapshotObject.java |  5 ++++-
 .../cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java    |  4 ++++
 .../main/java/com/cloud/storage/snapshot/SnapshotManager.java  |  3 ---
 .../java/com/cloud/storage/snapshot/SnapshotManagerImpl.java   | 10 ----------
 6 files changed, 14 insertions(+), 15 deletions(-)

diff --git 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
index dd451f5..7fad871 100644
--- 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
+++ 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
@@ -200,7 +200,9 @@ public class DataMigrationUtility {
                     snapshotVO != null && snapshotVO.getHypervisorType() != 
Hypervisor.HypervisorType.Simulator
                     && snapshot.getParentSnapshotId() == 0 ) {
                 SnapshotInfo snap = 
snapshotFactory.getSnapshot(snapshotVO.getSnapshotId(), DataStoreRole.Image);
-                files.add(snap);
+                if (snap != null) {
+                    files.add(snap);
+                }
             }
         }
 
diff --git 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
index f8be1ad..4257885 100644
--- 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
+++ 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
@@ -87,6 +87,9 @@ public class SnapshotDataFactoryImpl implements 
SnapshotDataFactory {
     @Override
     public SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role) {
         SnapshotVO snapshot = snapshotDao.findById(snapshotId);
+        if (snapshot == null) {
+            return null;
+        }
         SnapshotDataStoreVO snapshotStore = 
snapshotStoreDao.findBySnapshot(snapshotId, role);
         if (snapshotStore == null) {
             snapshotStore = 
snapshotStoreDao.findByVolume(snapshot.getVolumeId(), role);
diff --git 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index f107343..1d343ab 100644
--- 
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ 
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -142,7 +142,10 @@ public class SnapshotObject implements SnapshotInfo {
         List<SnapshotInfo> children = new ArrayList<>();
         if (vos != null) {
             for (SnapshotDataStoreVO vo : vos) {
-                children.add(snapshotFactory.getSnapshot(vo.getSnapshotId(), 
DataStoreRole.Image));
+                SnapshotInfo info = 
snapshotFactory.getSnapshot(vo.getSnapshotId(), DataStoreRole.Image);
+                if (info != null) {
+                    children.add(info);
+                }
             }
         }
         return children;
diff --git 
a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
 
b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 54ce065..34f5893 100644
--- 
a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ 
b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -1097,6 +1097,10 @@ public class AsyncJobManagerImpl extends ManagerBase 
implements AsyncJobManager,
                     final List<SnapshotDetailsVO> snapshotList = 
_snapshotDetailsDao.findDetails(AsyncJob.Constants.MS_ID, Long.toString(msid), 
false);
                     for (final SnapshotDetailsVO snapshotDetailsVO : 
snapshotList) {
                         SnapshotInfo snapshot = 
snapshotFactory.getSnapshot(snapshotDetailsVO.getResourceId(), 
DataStoreRole.Primary);
+                        if (snapshot == null) {
+                            
_snapshotDetailsDao.remove(snapshotDetailsVO.getId());
+                            continue;
+                        }
                         snapshotSrv.processEventOnSnapshotObject(snapshot, 
Snapshot.Event.OperationFailed);
                         
_snapshotDetailsDao.removeDetail(snapshotDetailsVO.getResourceId(), 
AsyncJob.Constants.MS_ID);
                     }
diff --git 
a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java 
b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
index c900b2d..012c2ab 100644
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
@@ -24,7 +24,6 @@ import org.apache.cloudstack.framework.config.Configurable;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.exception.ResourceAllocationException;
-import com.cloud.storage.Snapshot;
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Volume;
 
@@ -83,7 +82,5 @@ public interface SnapshotManager extends Configurable {
 
     SnapshotVO getParentSnapshot(VolumeInfo volume);
 
-    Snapshot backupSnapshot(Long snapshotId);
-
     SnapshotInfo takeSnapshot(VolumeInfo volume) throws 
ResourceAllocationException;
 }
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 4b95eff..4eaebd8 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -421,16 +421,6 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
     }
 
     @Override
-    public Snapshot backupSnapshot(Long snapshotId) {
-        SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, 
DataStoreRole.Image);
-        if (snapshot != null) {
-            throw new CloudRuntimeException("Already in the backup snapshot:" 
+ snapshotId);
-        }
-
-        return snapshotSrv.backupSnapshot(snapshot);
-    }
-
-    @Override
     public Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, 
Long volumeId, Long vmSnapshotId) {
         VMInstanceVO vm = _vmDao.findById(vmId);
         if (vm == null) {

Reply via email to