fix: quota usage not updated after disk resizing

This commit is contained in:
Qiu Jian
2020-07-19 13:24:31 +08:00
parent 4e7af6e2e7
commit f2e4a9af63
4 changed files with 43 additions and 0 deletions
+1
View File
@@ -71,6 +71,7 @@ type IQuotaManager interface {
checkSetPendingQuota(ctx context.Context, userCred mcclient.TokenCredential, quota IQuota) error
cancelPendingUsage(ctx context.Context, userCred mcclient.TokenCredential, localUsage IQuota, cancelUsage IQuota, save bool) error
cancelUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota) error
addUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota) error
getQuotaCount(ctx context.Context, request IQuota, pendingKey IQuotaKeys) (int, error)
FetchIdNames(ctx context.Context, idMap map[string]map[string]string) (map[string]map[string]string, error)
+11
View File
@@ -113,6 +113,17 @@ func (manager *SQuotaBaseManager) _cancelUsage(ctx context.Context, userCred mcc
return manager.changeUsage(ctx, userCred, usage, false)
}
func (manager *SQuotaBaseManager) addUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota) error {
LockQuota(ctx, manager, usage)
defer ReleaseQuota(ctx, manager, usage)
return manager._addUsage(ctx, userCred, usage)
}
func (manager *SQuotaBaseManager) _addUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota) error {
return manager.changeUsage(ctx, userCred, usage, true)
}
func (manager *SQuotaBaseManager) changeUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota, isAdd bool) error {
usages, err := manager.usageStore.GetParentQuotas(ctx, usage.GetKeys())
if err != nil {
+14
View File
@@ -87,6 +87,20 @@ func cancelUsage(ctx context.Context, userCred mcclient.TokenCredential, usage I
}
}
func AddUsages(ctx context.Context, userCred mcclient.TokenCredential, usages []db.IUsage) {
for _, usage := range usages {
addUsage(ctx, userCred, usage.(IQuota))
}
}
func addUsage(ctx context.Context, userCred mcclient.TokenCredential, usage IQuota) {
manager := getQuotaManager(usage)
err := manager.addUsage(ctx, userCred, usage)
if err != nil {
log.Errorf("cancelUsage %s fail: %s", jsonutils.Marshal(usage), err)
}
}
func GetQuotaCount(ctx context.Context, request IQuota, pendingKeys IQuotaKeys) (int, error) {
manager := getQuotaManager(request)
return manager.getQuotaCount(ctx, request, pendingKeys)
+17
View File
@@ -23,6 +23,7 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/quotas"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/compute/models"
"yunion.io/x/onecloud/pkg/mcclient"
@@ -105,6 +106,7 @@ func (self *DiskResizeTask) OnDiskResizeComplete(ctx context.Context, disk *mode
self.OnStartResizeDiskFailed(ctx, disk, err)
return
}
diff := int(sizeMb) - disk.DiskSize
oldStatus := disk.Status
_, err = db.Update(disk, func() error {
disk.Status = api.DISK_READY
@@ -119,6 +121,21 @@ func (self *DiskResizeTask) OnDiskResizeComplete(ctx context.Context, disk *mode
self.SetDiskReady(ctx, disk, self.GetUserCred(), "")
notes := fmt.Sprintf("%s=>%s", oldStatus, disk.Status)
db.OpsLog.LogEvent(disk, db.ACT_UPDATE_STATUS, notes, self.UserCred)
if diff > 0 {
var addUsage models.SQuota
keys, err := disk.GetQuotaKeys()
if err != nil { // just log and ignore
log.Errorf("disk.GetQuotaKeys fail %s", err)
} else {
addUsage.SetKeys(keys)
addUsage.Storage = diff
quotas.AddUsages(ctx, self.UserCred, []db.IUsage{&addUsage})
}
} else if diff < 0 {
// unlikely
}
self.CleanHostSchedCache(disk)
db.OpsLog.LogEvent(disk, db.ACT_RESIZE, disk.GetShortDesc(ctx), self.UserCred)
logclient.AddActionLogWithStartable(self, disk, logclient.ACT_RESIZE, nil, self.UserCred, true)