From aa1e640e7a17c5fd1027c863864d1f8a251ae1b2 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Thu, 23 Apr 2026 21:19:50 +0800 Subject: [PATCH] [storage]: include Memory volumes in cascade deletion Extend VolumeCascadeExtension to match VolumeType.Memory alongside Data when cascading PrimaryStorage/Account deletion, so memory snapshot volumes and their snapshot/tree records are cleaned up instead of becoming orphaned rows pointing at deleted resources. Resolves: ZSV-11826 Change-Id: I71746a7768726671706b6a7970776a6d64616d71 --- .../org/zstack/storage/volume/VolumeCascadeExtension.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeCascadeExtension.java b/storage/src/main/java/org/zstack/storage/volume/VolumeCascadeExtension.java index e0e52c8ec83..1672596d72f 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeCascadeExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeCascadeExtension.java @@ -141,7 +141,7 @@ private List volumesCleanupFromAction(CascadeAction action) { } volumeUuids = ResourceHelper.findOwnResourceUuidList(VolumeEO.class, auuids, - q -> q.eq(VolumeVO_.type, VolumeType.Data)); + q -> q.in(VolumeVO_.type, Arrays.asList(VolumeType.Data, VolumeType.Memory))); return volumeUuids; } @@ -168,7 +168,7 @@ private List volumesFromAction(CascadeAction action) { List psUuids = CollectionUtils.transform(pinvs, PrimaryStorageInventory::getUuid); SimpleQuery q = dbf.createQuery(VolumeVO.class); - q.add(VolumeVO_.type, Op.EQ, VolumeType.Data); + q.add(VolumeVO_.type, Op.IN, Arrays.asList(VolumeType.Data, VolumeType.Memory)); q.add(VolumeVO_.primaryStorageUuid, Op.IN, psUuids); List vos = q.list(); return toVolumeDeletionStruct(action, vos); @@ -176,7 +176,8 @@ private List volumesFromAction(CascadeAction action) { final List auuids = CollectionUtils.transform(action.getParentIssuerContext(), AccountInventory::getUuid); List vos = ResourceHelper.findOwnResources(VolumeVO.class, auuids); - vos.removeIf(volume -> volume.getType() != VolumeType.Data); + vos.removeIf(volume -> volume.getType() != VolumeType.Data + && volume.getType() != VolumeType.Memory); if (!vos.isEmpty()) { return toVolumeDeletionStruct(action, vos);