From 3eb713bffee1214b62ea285d81419011a2b5d8ee Mon Sep 17 00:00:00 2001 From: wanyaoqi <18528551+wanyaoqi@users.noreply.github.com> Date: Fri, 19 Apr 2024 18:27:09 +0800 Subject: [PATCH] fix(regin,host): delete snapshots after stream complete (#20084) --- pkg/compute/models/guest_actions.go | 24 ++++++++++++++++++------ pkg/hostman/guestman/qemu-kvm.go | 2 ++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index eba948c722..6e7f265589 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -3150,13 +3150,25 @@ func (self *SGuest) PerformStatus(ctx context.Context, userCred mcclient.TokenCr } } - if ispId := self.GetMetadata(ctx, api.BASE_INSTANCE_SNAPSHOT_ID, userCred); len(ispId) > 0 { - ispM, err := InstanceSnapshotManager.FetchById(ispId) - if err == nil { - isp := ispM.(*SInstanceSnapshot) - isp.DecRefCount(ctx, userCred) + if input.Status == api.VM_RUNNING && input.BlockJobsCount == 0 { + if ispId := self.GetMetadata(ctx, api.BASE_INSTANCE_SNAPSHOT_ID, userCred); len(ispId) > 0 { + var disksMerged = true + disks, _ := self.GetDisks() + for _, disk := range disks { + if disk.GetMetadata(ctx, "merge_snapshot", userCred) == "true" { + disksMerged = false + } + } + + if disksMerged { + ispM, err := InstanceSnapshotManager.FetchById(ispId) + if err == nil { + isp := ispM.(*SInstanceSnapshot) + isp.DecRefCount(ctx, userCred) + } + self.SetMetadata(ctx, api.BASE_INSTANCE_SNAPSHOT_ID, "", userCred) + } } - self.SetMetadata(ctx, api.BASE_INSTANCE_SNAPSHOT_ID, "", userCred) } if preStatus != self.Status && !self.isNotRunningStatus(preStatus) && self.isNotRunningStatus(self.Status) { diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index d6f51d00ad..1cadc6d6c9 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -2958,6 +2958,8 @@ func (s *SKVMGuestInstance) sendStreamDisksComplete(ctx context.Context) { if err := s.SaveLiveDesc(s.Desc); err != nil { log.Errorf("save guest desc failed %s", err) } + + s.SyncStatus("") } func (s *SKVMGuestInstance) GetQemuVersionStr() string {