From 9b31ef8c63df17da7f66bc6ac1e7277523b5c378 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 27 Sep 2024 18:06:32 +0800 Subject: [PATCH] [xinfini]: try to delete cloned volume which not exist in db Resolves: ZSTAC-70087 Change-Id: I64636a756a6776667067706e7a6e667a796f686d --- .../org/zstack/xinfini/XInfiniApiHelper.java | 28 ++++++++++++++++++- .../xinfini/XInfiniStorageController.java | 6 +--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index e2c40dabfdd..db99097d32a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -4,10 +4,13 @@ import com.google.common.cache.CacheBuilder; import com.google.common.collect.Maps; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.db.Q; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; import org.zstack.header.core.Completion; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -393,6 +396,13 @@ public void deleteVolume(int volId, boolean force) { retryUtilResourceDeleted(gReq, GetVolumeResponse.class); } + public void deleteVolumeAndSnapshot(int volId) { + for (VolumeSnapshotModule mod : queryVolumeSnapshotByVolumeId(volId)) { + deleteVolumeSnapshot(mod.getSpec().getId()); + } + deleteVolume(volId, true); + } + public void deleteVolumeSnapshot(int snapShotId) { // check snapshot cloned volume QueryVolumeRequest vReq = new QueryVolumeRequest(); @@ -400,8 +410,24 @@ public void deleteVolumeSnapshot(int snapShotId) { QueryVolumeResponse vRsp = queryErrorOut(vReq, QueryVolumeResponse.class); if (vRsp.getMetadata().getPagination().getCount() > 0) { List volNames = vRsp.getItems().stream().map(VolumeModule::getSpec).map(VolumeModule.VolumeSpec::getName).collect(Collectors.toList()); + List installPaths = vRsp.getItems().stream() + .map(v -> XInfiniPathHelper.buildXInfiniPath(v.getSpec().getPoolId(), v.getSpec().getId())) + .collect(Collectors.toList()); + + logger.info(String.format("find cloned volumes paths: %s", installPaths)); - throw new OperationFailureException(operr("snapshot %s has %d cloned volumes, volumes names: %s", snapShotId, vRsp.getMetadata().getPagination().getCount(), volNames)); + boolean exist = Q.New(VolumeVO.class) + .in(VolumeVO_.installPath, installPaths) + .isExists(); + + if (exist) { + throw new OperationFailureException(operr("snapshot %s has %d cloned volumes, volumes names: %s", snapShotId, vRsp.getMetadata().getPagination().getCount(), volNames)); + } + logger.info("all cloned volumes not exist in database, try to delete them"); + // try to delete cloned volumes if not exist in db + for (VolumeModule v : vRsp.getItems()) { + deleteVolumeAndSnapshot(v.getSpec().getId()); + } } DeleteVolumeSnapshotRequest req = new DeleteVolumeSnapshotRequest(); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 1938babd6f2..cb4eabe942a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -699,11 +699,7 @@ public void deleteVolume(String installPath, Completion comp) { @Override public void deleteVolumeAndSnapshot(String installPath, Completion comp) { int volId = getVolIdFromPath(installPath); - for (VolumeSnapshotModule mod : apiHelper.queryVolumeSnapshotByVolumeId(volId)) { - apiHelper.deleteVolumeSnapshot(mod.getSpec().getId()); - } - - apiHelper.deleteVolume(volId, true); + apiHelper.deleteVolumeAndSnapshot(volId); comp.success(); }