fix(region): skip sync rds sku when network is empty (#25784)

This commit is contained in:
屈轩
2026-10-07 12:44:48 +08:00
committed by GitHub
parent 1ac9a4b8e0
commit 519df52abd
7 changed files with 108 additions and 19 deletions
+44
View File
@@ -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()
+25 -13
View File
@@ -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()
+8 -2
View File
@@ -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
+8 -2
View File
@@ -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)
+12
View File
@@ -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)
}
+8 -2
View File
@@ -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)
+3
View File
@@ -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)