diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index f3ef8529ec..26ae0972b0 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -536,3 +536,40 @@ func (manager *SServerSkuManager) GetSkuCountByProvider(provider string) int { return q.Count() } + +// 删除表中zone not found的记录 +func (manager *SServerSkuManager) PendingDeleteInvalidSku() error { + zones := make([]SZone, 0) + err := ZoneManager.Query("id").Distinct().All(&zones) + if err != nil { + log.Errorf(err.Error()) + return httperrors.NewInternalServerError("query zone list failed.") + } + + zoneIds := []string{} + for _, zone := range zones { + zoneIds = append(zoneIds, zone.Id) + } + + skus := make([]SServerSku, 0) + q := manager.Query() + err = q.NotIn("zone_id", zoneIds).All(&skus) + if err != nil { + log.Errorf(err.Error()) + return httperrors.NewInternalServerError("query sku list failed.") + } + + for i := range skus { + sku := skus[i] + _, err = manager.TableSpec().Update(&sku, func() error { + return sku.MarkDelete() + }) + + if err != nil { + log.Errorf(err.Error()) + return httperrors.NewInternalServerError("delete sku %s failed.", sku.Id) + } + } + + return nil +} diff --git a/pkg/compute/service/service.go b/pkg/compute/service/service.go index bd4623bd21..bc41ecc8b3 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -63,6 +63,7 @@ func StartService() { cron.AddJob2("AutoDiskSnapshot", options.Options.AutoSnapshotDay, options.Options.AutoSnapshotHour, 0, 0, models.DiskManager.AutoDiskSnapshot, false) cron.AddJob2("SyncSkus", options.Options.SyncSkusDay, options.Options.SyncSkusHour, 0, 0, skus.SyncSkus, true) + cron.AddJob2("CleanInvalidSkus", options.Options.SyncSkusDay, options.Options.SyncSkusHour, 0, 0, skus.DeleteInvalidSkus, true) // skus只在启动时进行清理 cron.Start() defer cron.Stop() diff --git a/pkg/compute/skus/skus.go b/pkg/compute/skus/skus.go index 58e675ffe7..5ec475b3e9 100644 --- a/pkg/compute/skus/skus.go +++ b/pkg/compute/skus/skus.go @@ -306,6 +306,7 @@ func (self *SkusZoneList) SyncToLocalDB() error { return err } +// 全量同步sku列表. func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { if isStart { if models.ServerSkuManager.GetSkuCountByProvider("") > 0 { @@ -322,6 +323,7 @@ func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential, isStart bo } } +// 同步指定provider sku列表 func SyncSkusByProviderIds(providerIds []string) error { skus := SkusZoneList{} log.Debugf("SyncSkusByProviderIds %s", providerIds) @@ -335,3 +337,11 @@ func SyncSkusByProviderIds(providerIds []string) error { return nil } + +// 伪删除无效的sku.只在启动进程时进行清理。 +func DeleteInvalidSkus(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { + if isStart { + log.Debugf("DeleteInvalidSkus in processing...") + models.ServerSkuManager.PendingDeleteInvalidSku() + } +}