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

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


The following commit(s) were added to refs/heads/main by this push:
     new 6ad92964120 Fix KVM incremental snapshot removal when using multiple 
secondary storages (#11180)
6ad92964120 is described below

commit 6ad929641206b073c83727b32ca17167d5be4818
Author: João Jandre <48719461+joaojan...@users.noreply.github.com>
AuthorDate: Mon Jul 21 08:17:27 2025 -0300

    Fix KVM incremental snapshot removal when using multiple secondary storages 
(#11180)
    
    When removing an incremental snapshot (For both KVM and XenServer), it is 
checked if the snapshot has a child or not. If it has, then the snapshot is not 
removed from the storage.
    
    For KVM incremental snapshots, snapshots in the same chain may be on 
different secondary storages (within the same zone).
    
    However, the child search process only considers snapshots from the same 
secondary storage as theirs. Therefore, if a snapshot has its parent snapshot 
on a different secondary storage, it will be completely removed, making the 
snapshot chain inconsistent.
---
 .../java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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 178d42f5c74..6cec193cd0a 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
@@ -155,7 +155,9 @@ public class SnapshotObject implements SnapshotInfo {
     @Override
     public SnapshotInfo getChild() {
         QueryBuilder<SnapshotDataStoreVO> sc = 
QueryBuilder.create(SnapshotDataStoreVO.class);
-        sc.and(sc.entity().getDataStoreId(), Op.EQ, store.getId());
+        if (!HypervisorType.KVM.equals(snapshot.getHypervisorType())) {
+            sc.and(sc.entity().getDataStoreId(), Op.EQ, store.getId());
+        }
         sc.and(sc.entity().getRole(), Op.EQ, store.getRole());
         sc.and(sc.entity().getState(), Op.NIN, State.Destroying, 
State.Destroyed, State.Error);
         sc.and(sc.entity().getParentSnapshotId(), Op.EQ, getId());

Reply via email to