From a80fdaaddfbdada9ed832b599ef634401e6d2554 Mon Sep 17 00:00:00 2001 From: rainzm Date: Thu, 15 Apr 2021 18:55:54 +0800 Subject: [PATCH] fix(region): purge instancesnapshot when purging guest fix #10760 --- pkg/compute/models/purge.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index 67bd75cad9..a76e121365 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -126,6 +126,7 @@ func (guest *SGuest) purge(ctx context.Context, userCred mcclient.TokenCredentia guest.DetachAllNetworks(ctx, userCred) guest.EjectIso(userCred) guest.DeleteEip(ctx, userCred) + guest.purgeInstanceSnapshots(ctx, userCred) guest.DeleteAllDisksInDB(ctx, userCred) if !utils.IsInStringArray(guest.Hypervisor, HypervisorIndependentInstanceSnapshot) { guest.DeleteAllInstanceSnapshotInDB(ctx, userCred) @@ -138,6 +139,30 @@ func (guest *SGuest) purge(ctx context.Context, userCred mcclient.TokenCredentia return guest.RealDelete(ctx, userCred) } +func (guest *SGuest) purgeInstanceSnapshots(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, guest) + defer lockman.ReleaseObject(ctx, guest) + + iss, err := guest.GetInstanceSnapshots() + if err != nil { + return errors.Wrap(err, "unable to GetInstanceSnapshots") + } + for i := range iss { + err := iss[i].purge(ctx, userCred) + if err != nil { + return errors.Wrapf(err, "unable to purge InstanceSnapshot %s", iss[i].Id) + } + } + return nil +} + +func (is *SInstanceSnapshot) purge(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, is) + defer lockman.ReleaseObject(ctx, is) + + return is.RealDelete(ctx, userCred) +} + func (storage *SStorage) purgeDisks(ctx context.Context, userCred mcclient.TokenCredential) error { lockman.LockObject(ctx, storage) defer lockman.ReleaseObject(ctx, storage)