From 519df52abd5a0f3d65bcd3603beef52029f3e9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 7 Oct 2026 12:44:48 +0800 Subject: [PATCH] fix(region): skip sync rds sku when network is empty (#25784) --- pkg/compute/models/cloudregions.go | 44 ++++++++++++++++++++++++ pkg/compute/models/cloudsync.go | 38 +++++++++++++------- pkg/compute/models/dbinstance_skus.go | 10 ++++-- pkg/compute/models/elasticcache_skus.go | 10 ++++-- pkg/compute/models/networks.go | 12 +++++++ pkg/compute/models/server_skus.go | 10 ++++-- pkg/compute/tasks/network_create_task.go | 3 ++ 7 files changed, 108 insertions(+), 19 deletions(-) diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 8f9fd38867..71d9d7519c 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -1330,6 +1330,50 @@ func (self *SCloudregion) StartSyncSkusTask(ctx context.Context, userCred mcclie return task.ScheduleRun(nil) } +// skipSkuSyncWithoutNetwork 当前 region 没有可用子网时跳过虚拟机、RDS、Redis 套餐同步。 +func (self *SCloudregion) skipSkuSyncWithoutNetwork(ctx context.Context) bool { + cnt, err := self.GetNetworkCount(ctx) + if err != nil { + log.Errorf("region %s(%s) GetNetworkCount fail %s, skip sku sync", self.Name, self.Id, err) + return true + } + if cnt > 0 { + return false + } + log.Debugf("region %s(%s) has no available network, skip sku sync", self.Name, self.Id) + return true +} + +// TriggerSkuSyncOnFirstNetwork 公有云区域出现第一个可用子网时触发虚拟机、RDS、Redis 套餐同步。 +func (self *SCloudregion) TriggerSkuSyncOnFirstNetwork(ctx context.Context, userCred mcclient.TokenCredential) { + if self.GetCloudEnv() != cloudprovider.CLOUD_ENV_PUBLIC_CLOUD { + return + } + cnt, err := self.GetNetworkCount(ctx) + if err != nil { + log.Errorf("region %s(%s) GetNetworkCount fail %s", self.Name, self.Id, err) + return + } + if cnt != 1 { + return + } + log.Infof("first available network ready in public region %s(%s), trigger sku sync", self.Name, self.Id) + if err := self.StartSyncSkusTask(ctx, userCred, ServerSkuManager.Keyword()); err != nil { + log.Errorf("start server sku sync for region %s fail %s", self.Name, err) + } + driver := self.GetDriver() + if driver != nil && driver.IsSupportedElasticcache() { + if err := self.StartSyncSkusTask(ctx, userCred, ElasticcacheSkuManager.Keyword()); err != nil { + log.Errorf("start elasticcache sku sync for region %s fail %s", self.Name, err) + } + } + if driver != nil && driver.IsSupportedDBInstance() { + if err := self.StartSyncSkusTask(ctx, userCred, DBInstanceSkuManager.Keyword()); err != nil { + log.Errorf("start dbinstance sku sync for region %s fail %s", self.Name, err) + } + } +} + func (self *SCloudregion) GetCloudproviders() ([]SCloudprovider, error) { sq := CloudproviderRegionManager.Query().Equals("cloudregion_id", self.Id).SubQuery() q := CloudproviderManager.Query() diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 6b52e2b79e..cfba49cfd7 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -161,19 +161,22 @@ func syncRegionSkus(ctx context.Context, userCred mcclient.TokenCredential, loca return } - cnt, err := ServerSkuManager.GetSkuCountByRegion(regionId) - if err != nil { - log.Errorf("GetSkuCountByRegion fail %s", err) - return + skipSku := localRegion.skipSkuSyncWithoutNetwork(ctx) + if !skipSku { + cnt, err := ServerSkuManager.GetSkuCountByRegion(regionId) + if err != nil { + log.Errorf("GetSkuCountByRegion fail %s", err) + return + } + + if cnt == 0 { + // 提前同步instance type.如果同步失败可能导致vm 内存显示为0 + localRegion.StartSyncSkusTask(ctx, userCred, ServerSkuManager.Keyword()) + } } - if cnt == 0 { - // 提前同步instance type.如果同步失败可能导致vm 内存显示为0 - localRegion.StartSyncSkusTask(ctx, userCred, ServerSkuManager.Keyword()) - } - - if localRegion.GetDriver().IsSupportedElasticcache() { - cnt, err = ElasticcacheSkuManager.GetSkuCountByRegion(regionId) + if localRegion.GetDriver().IsSupportedElasticcache() && !skipSku { + cnt, err := ElasticcacheSkuManager.GetSkuCountByRegion(regionId) if err != nil { log.Errorf("ElasticcacheSkuManager.GetSkuCountByRegion fail %s", err) return @@ -184,8 +187,8 @@ func syncRegionSkus(ctx context.Context, userCred mcclient.TokenCredential, loca } } - if localRegion.GetDriver().IsSupportedDBInstance() { - cnt, err = DBInstanceSkuManager.GetSkuCountByRegion(regionId) + if localRegion.GetDriver().IsSupportedDBInstance() && !skipSku { + cnt, err := DBInstanceSkuManager.GetSkuCountByRegion(regionId) if err != nil { log.Errorf("DBInstanceSkuManager.GetSkuCountByRegion fail %s", err) return @@ -1236,6 +1239,9 @@ func syncSkusFromPrivateCloud( remoteRegion cloudprovider.ICloudRegion, xor bool, ) { + if region.skipSkuSyncWithoutNetwork(ctx) { + return + } skus, err := remoteRegion.GetISkus() if err != nil { msg := fmt.Sprintf("GetISkus for region %s(%s) failed %v", region.Name, region.Id, err) @@ -1307,6 +1313,9 @@ func syncRegionDBInstances( } func syncDBInstanceSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion, syncRange *SSyncRange) { + if localRegion.skipSkuSyncWithoutNetwork(ctx) { + return + } skus, err := func() ([]cloudprovider.ICloudDBInstanceSku, error) { defer syncResults.AddRequestCost(DBInstanceSkuManager)() return remoteRegion.GetIDBInstanceSkus() @@ -1365,6 +1374,9 @@ func syncNATSkus(ctx context.Context, userCred mcclient.TokenCredential, syncRes } func syncCacheSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion, syncRange *SSyncRange) { + if localRegion.skipSkuSyncWithoutNetwork(ctx) { + return + } skus, err := func() ([]cloudprovider.ICloudElasticcacheSku, error) { defer syncResults.AddRequestCost(ElasticcacheSkuManager)() return remoteRegion.GetIElasticcacheSkus() diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 8e68cc6603..f5eb68f718 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -494,11 +494,14 @@ func (manager *SDBInstanceSkuManager) SyncDBInstanceSkus( region *SCloudregion, xor bool, ) compare.SyncResult { + result := compare.SyncResult{} + if region.skipSkuSyncWithoutNetwork(ctx) { + return result + } + lockman.LockRawObject(ctx, manager.Keyword(), region.Id) defer lockman.ReleaseRawObject(ctx, manager.Keyword(), region.Id) - result := compare.SyncResult{} - meta, err := yunionmeta.FetchYunionmeta(ctx) if err != nil { result.Error(errors.Wrapf(err, "FetchYunionmeta")) @@ -672,6 +675,9 @@ func SyncRegionDBInstanceSkus(ctx context.Context, userCred mcclient.TokenCreden log.Debugf("region %s(%s) not support dbinstance, skip sync", region.Name, region.Id) continue } + if region.skipSkuSyncWithoutNetwork(ctx) { + continue + } skuMeta := &SDBInstanceSku{} skuMeta.SetModelManager(DBInstanceSkuManager, skuMeta) skuMeta.Id = region.ExternalId diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index a7eb4ab447..34df024ac4 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -362,11 +362,14 @@ func (self *SElasticcacheSku) GetElasticcacheCount() (int, error) { } func (manager *SElasticcacheSkuManager) SyncElasticcacheSkus(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion, xor bool) compare.SyncResult { + syncResult := compare.SyncResult{} + if region.skipSkuSyncWithoutNetwork(ctx) { + return syncResult + } + lockman.LockRawObject(ctx, manager.Keyword(), region.Id) defer lockman.ReleaseRawObject(ctx, manager.Keyword(), region.Id) - syncResult := compare.SyncResult{} - meta, err := yunionmeta.FetchYunionmeta(ctx) if err != nil { return syncResult @@ -829,6 +832,9 @@ func SyncElasticCacheSkus(ctx context.Context, userCred mcclient.TokenCredential if !region.GetDriver().IsSupportedElasticcache() { continue } + if region.skipSkuSyncWithoutNetwork(ctx) { + continue + } skuMeta := &SElasticcacheSku{} skuMeta.SetModelManager(ElasticcacheSkuManager, skuMeta) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index d9bcbb030b..4cf77e010c 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -855,10 +855,22 @@ func (manager *SNetworkManager) newFromCloudNetwork(ctx context.Context, userCre Obj: net, Action: notifyclient.ActionSyncCreate, }) + if net.Status == api.NETWORK_STATUS_AVAILABLE { + net.TriggerPublicCloudSkuSync(ctx, userCred) + } return net, nil } +func (snet *SNetwork) TriggerPublicCloudSkuSync(ctx context.Context, userCred mcclient.TokenCredential) { + region, err := snet.GetRegion() + if err != nil { + log.Errorf("network %s(%s) get region for sku sync fail %s", snet.Name, snet.Id, err) + return + } + region.TriggerSkuSyncOnFirstNetwork(ctx, userCred) +} + func (net *SNetwork) IsAddressInRange(address netutils.IPV4Addr) bool { return net.getIPRange().Contains(address) } diff --git a/pkg/compute/models/server_skus.go b/pkg/compute/models/server_skus.go index 6d82c27730..8727891d2b 100644 --- a/pkg/compute/models/server_skus.go +++ b/pkg/compute/models/server_skus.go @@ -1337,11 +1337,14 @@ func (manager *SServerSkuManager) GetLocalSkus() (map[string]bool, error) { } func (region *SCloudregion) SyncServerSkus(ctx context.Context, userCred mcclient.TokenCredential, xor bool) compare.SyncResult { + result := compare.SyncResult{} + if region.skipSkuSyncWithoutNetwork(ctx) { + return result + } + lockman.LockRawObject(ctx, ServerSkuManager.Keyword(), region.Id) defer lockman.ReleaseRawObject(ctx, ServerSkuManager.Keyword(), region.Id) - result := compare.SyncResult{} - meta, err := yunionmeta.FetchYunionmeta(ctx) if err != nil { result.Error(errors.Wrapf(err, "FetchYunionmeta")) @@ -1594,6 +1597,9 @@ func SyncServerSkus(ctx context.Context, userCred mcclient.TokenCredential, isSt for i := range cloudregions { region := &cloudregions[i] + if region.skipSkuSyncWithoutNetwork(ctx) { + continue + } skuMeta := &SServerSku{} skuMeta.SetModelManager(ServerSkuManager, skuMeta) diff --git a/pkg/compute/tasks/network_create_task.go b/pkg/compute/tasks/network_create_task.go index d68bd9470a..40b7f71c15 100644 --- a/pkg/compute/tasks/network_create_task.go +++ b/pkg/compute/tasks/network_create_task.go @@ -65,6 +65,9 @@ func (self *NetworkCreateTask) OnInit(ctx context.Context, obj db.IStandaloneMod self.taskFailed(ctx, net, errors.Wrapf(err, "RequestCreateNetwork")) return } + if net.Status == api.NETWORK_STATUS_AVAILABLE { + net.TriggerPublicCloudSkuSync(ctx, self.UserCred) + } net.ClearSchedDescCache() logclient.AddActionLogWithStartable(self, net, logclient.ACT_CREATE, "", self.UserCred, true)