From 229f5c910d71f68345ec9da781d7a6f3e97f6d4b Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Thu, 21 May 2026 14:30:30 +0800 Subject: [PATCH] [storage]: fix unstable DeleteSnapShotGroup2Case Resolves: ZSV-12287 Related: ZSV-5936 Change-Id: I627364726d796a7a67666162637065687263676c --- .../storage/snapshot/VolumeSnapshotBase.java | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java index 2195fb7576a..9bc012613e8 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java @@ -1,16 +1,15 @@ package org.zstack.storage.snapshot; -import org.hibernate.exception.ConstraintViolationException; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.springframework.dao.DataIntegrityViolationException; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; @@ -26,12 +25,10 @@ import org.zstack.header.storage.snapshot.*; import org.zstack.header.storage.snapshot.VolumeSnapshotStatus.StatusEvent; import org.zstack.utils.CollectionUtils; -import org.zstack.utils.ExceptionDSL; import org.zstack.utils.Utils; import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.logging.CLogger; -import javax.persistence.PersistenceException; import java.util.Map; /** @@ -210,8 +207,21 @@ public void run(MessageReply rsp) { */ private void changeStatus(VolumeSnapshotStatus.StatusEvent event) { - self.setStatus(self.getStatus().nextState(event)); - dbf.update(self); + String uuid = self.getUuid(); + VolumeSnapshotVO latest = dbf.reload(self); + if (latest == null) { + logger.debug(String.format("volume snapshot[uuid=%s] is not found", uuid)); + return; + } + + VolumeSnapshotStatus next = latest.getStatus().nextState(event); + SQL.New(VolumeSnapshotVO.class) + .eq(VolumeSnapshotVO_.uuid, latest.getUuid()) + .set(VolumeSnapshotVO_.status, next) + .update(); + + latest.setStatus(next); + self = latest; } private void handle(final VolumeSnapshotPrimaryStorageDeletionMsg msg) { @@ -237,23 +247,20 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { VolumeSnapshotPrimaryStorageDeletionReply dreply = new VolumeSnapshotPrimaryStorageDeletionReply(); - try { - updateDb(); - } catch (DataIntegrityViolationException | PersistenceException e) { - if (!ExceptionDSL.isCausedBy(e, ConstraintViolationException.class) && !ExceptionDSL.isCausedBy(e, DataIntegrityViolationException.class)) { - throw e; - } - // volume snapshot group may has been removed, try again. - updateDb(); + String uuid = self.getUuid(); + VolumeSnapshotVO latest = dbf.reload(self); + if (latest == null) { + logger.debug(String.format("volume snapshot[uuid=%s] is not found", uuid)); + bus.reply(msg, dreply); + return; } - bus.reply(msg, dreply); - } - private void updateDb() { - self = dbf.reload(self); - self.setPrimaryStorageInstallPath(null); - self.setPrimaryStorageUuid(null); - dbf.update(self); + SQL.New(VolumeSnapshotVO.class) + .eq(VolumeSnapshotVO_.uuid, latest.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, null) + .set(VolumeSnapshotVO_.primaryStorageUuid, null) + .update(); + bus.reply(msg, dreply); } }); }