diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index f5ca96a256..2179aaeb3a 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -4623,6 +4623,9 @@ func (self *SGuest) PerformSnapshotAndClone( quotas.CancelPendingUsage(ctx, userCred, &pendingUsage, &pendingUsage, false) quotas.CancelPendingUsage(ctx, userCred, &pendingRegionUsage, &pendingRegionUsage, false) return nil, httperrors.NewInternalServerError("create instance snapshot failed: %s", err) + } else { + cancelRegionUsage := &SRegionQuota{Snapshot: snapshotUsage.Snapshot} + quotas.CancelPendingUsage(ctx, userCred, &pendingRegionUsage, cancelRegionUsage, true) } err = self.StartInstanceSnapshotAndCloneTask( diff --git a/pkg/compute/tasks/instance_snapshot_and_clone_task.go b/pkg/compute/tasks/instance_snapshot_and_clone_task.go index 034d9ebbe4..4f0ca1afb5 100644 --- a/pkg/compute/tasks/instance_snapshot_and_clone_task.go +++ b/pkg/compute/tasks/instance_snapshot_and_clone_task.go @@ -50,7 +50,7 @@ func (self *InstanceSnapshotAndCloneTask) taskFailed( func (self *InstanceSnapshotAndCloneTask) taskComplete( ctx context.Context, isp *models.SInstanceSnapshot, data jsonutils.JSONObject) { - self.finalReleasePendingUsage(ctx) + self.finalReleasePendingUsage(ctx, true) guest := models.GuestManager.FetchGuestById(isp.GuestId) guest.StartSyncstatus(ctx, self.UserCred, "") db.OpsLog.LogEvent(guest, db.ACT_VM_SNAPSHOT_AND_CLONE, "", self.UserCred) @@ -60,21 +60,21 @@ func (self *InstanceSnapshotAndCloneTask) taskComplete( } func (self *InstanceSnapshotAndCloneTask) SetStageFailed(ctx context.Context, reason string) { - self.finalReleasePendingUsage(ctx) + self.finalReleasePendingUsage(ctx, false) self.STask.SetStageFailed(ctx, reason) } -func (self *InstanceSnapshotAndCloneTask) finalReleasePendingUsage(ctx context.Context) { +func (self *InstanceSnapshotAndCloneTask) finalReleasePendingUsage(ctx context.Context, success bool) { pendingUsage := models.SQuota{} err := self.GetPendingUsage(&pendingUsage, 0) if err == nil && !pendingUsage.IsEmpty() { - quotas.CancelPendingUsage(ctx, self.UserCred, &pendingUsage, &pendingUsage, false) // failure cleanup + quotas.CancelPendingUsage(ctx, self.UserCred, &pendingUsage, &pendingUsage, success) } pendingRegionUsage := models.SRegionQuota{} err = self.GetPendingUsage(&pendingRegionUsage, 1) if err == nil && !pendingRegionUsage.IsEmpty() { - quotas.CancelPendingUsage(ctx, self.UserCred, &pendingRegionUsage, &pendingRegionUsage, false) // failure cleanup + quotas.CancelPendingUsage(ctx, self.UserCred, &pendingRegionUsage, &pendingRegionUsage, success) } }