Merge pull request #6352 from ioito/hotfix/qx-rds-sync-optimized

fix: 优化rds zone同步逻辑
This commit is contained in:
Zexi Li
2020-05-15 11:05:42 +08:00
committed by GitHub
7 changed files with 118 additions and 68 deletions
+3 -1
View File
@@ -757,7 +757,9 @@ type ICloudDBInstance interface {
GetConnectionStr() string
GetInternalConnectionStr() string
GetIZoneId() string
GetZone1Id() string
GetZone2Id() string
GetZone3Id() string
GetIVpcId() string
GetDBNetwork() (*SDBInstanceNetwork, error)
+32 -23
View File
@@ -132,9 +132,6 @@ type SDBInstance struct {
Zone2 string `width:"36" charset:"ascii" nullable:"false" create:"optional" list:"user"`
// 可用区3
Zone3 string `width:"36" charset:"ascii" nullable:"false" create:"optional" list:"user"`
// 可用区Id(对应公有云的可用区Id)
ZoneId string `width:"36" charset:"ascii" nullable:"false" create:"optional"`
}
func (manager *SDBInstanceManager) GetContextManagers() [][]db.IModelManager {
@@ -545,14 +542,6 @@ func (self *SDBInstance) GetVpc() (*SVpc, error) {
return vpc.(*SVpc), nil
}
func (self *SDBInstance) GetZone() (*SZone, error) {
zone, err := ZoneManager.FetchById(self.ZoneId)
if err != nil {
return nil, err
}
return zone.(*SZone), nil
}
func (self *SDBInstance) GetNetwork() (*SNetwork, error) {
dbnet := DBInstanceNetworkManager.Query().SubQuery()
q := NetworkManager.Query()
@@ -1348,7 +1337,7 @@ func (self *SDBInstance) ValidateDeleteCondition(ctx context.Context) error {
func (self *SDBInstance) GetDBInstanceSkuQuery() *sqlchemy.SQuery {
q := DBInstanceSkuManager.Query().Equals("storage_type", self.StorageType).Equals("category", self.Category).
Equals("cloudregion_id", self.CloudregionId).Equals("engine", self.Engine).Equals("engine_version", self.EngineVersion)
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3, "zone_id": self.ZoneId} {
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3} {
if len(v) > 0 {
q = q.Equals(k, v)
}
@@ -1451,6 +1440,30 @@ func (self *SDBInstance) SetZoneInfo(ctx context.Context, userCred mcclient.Toke
return err
}
func (self *SDBInstance) SetZoneIds(extInstance cloudprovider.ICloudDBInstance) {
zone1 := extInstance.GetZone1Id()
if len(zone1) > 0 {
zone, _ := db.FetchByExternalId(ZoneManager, zone1)
if zone != nil {
self.Zone1 = zone.GetId()
}
}
zone2 := extInstance.GetZone2Id()
if len(zone2) > 0 {
zone, _ := db.FetchByExternalId(ZoneManager, zone2)
if zone != nil {
self.Zone2 = zone.GetId()
}
}
zone3 := extInstance.GetZone3Id()
if len(zone3) > 0 {
zone, _ := db.FetchByExternalId(ZoneManager, zone3)
if zone != nil {
self.Zone3 = zone.GetId()
}
}
}
func (self *SDBInstance) SyncWithCloudDBInstance(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, extInstance cloudprovider.ICloudDBInstance) error {
diff, err := db.UpdateWithLock(ctx, self, func() error {
self.Engine = extInstance.GetEngine()
@@ -1461,22 +1474,22 @@ func (self *SDBInstance) SyncWithCloudDBInstance(ctx context.Context, userCred m
self.DiskSizeGB = extInstance.GetDiskSizeGB()
self.StorageType = extInstance.GetStorageType()
self.Status = extInstance.GetStatus()
self.Port = extInstance.GetPort()
self.ConnectionStr = extInstance.GetConnectionStr()
self.InternalConnectionStr = extInstance.GetInternalConnectionStr()
self.MaintainTime = extInstance.GetMaintainTime()
self.ZoneId = extInstance.GetIZoneId()
err := self.setZoneInfo()
if err != nil {
log.Errorf("failed to set zone info for dbinstance %s(%s) error: %v", self.Name, self.Id, err)
}
self.SetZoneIds(extInstance)
if createdAt := extInstance.GetCreatedAt(); !createdAt.IsZero() {
self.CreatedAt = createdAt
}
if expiredAt := extInstance.GetExpiredAt(); !expiredAt.IsZero() {
self.ExpiredAt = expiredAt
}
if len(self.VpcId) == 0 {
if vpcId := extInstance.GetIVpcId(); len(vpcId) > 0 {
vpc, err := db.FetchByExternalId(VpcManager, vpcId)
@@ -1545,11 +1558,7 @@ func (manager *SDBInstanceManager) newFromCloudDBInstance(ctx context.Context, u
instance.InternalConnectionStr = extInstance.GetInternalConnectionStr()
instance.MaintainTime = extInstance.GetMaintainTime()
instance.ZoneId = extInstance.GetIZoneId()
err = instance.setZoneInfo()
if err != nil {
log.Errorf("failed to set zone info for dbinstance %s error: %v", instance.ExternalId, err)
}
instance.SetZoneIds(extInstance)
if secgroupId := extInstance.GetSecurityGroupId(); len(secgroupId) > 0 {
q := SecurityGroupCacheManager.Query().Equals("manager_id", provider.Id).Equals("external_id", secgroupId)
+1 -31
View File
@@ -1665,37 +1665,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateDBInstance(ctx cont
log.Errorf("timeout for waiting dbinstance running error: %v", err)
}
dbinstance.ZoneId = idbinstance.GetIZoneId()
err = dbinstance.SetZoneInfo(ctx, userCred)
if err != nil {
log.Errorf("failed to set dbinstance %s(%s) zoneInfo from cloud dbinstance: %v", dbinstance.Name, dbinstance.Id, err)
}
_, err = db.Update(dbinstance, func() error {
dbinstance.Engine = idbinstance.GetEngine()
dbinstance.EngineVersion = idbinstance.GetEngineVersion()
dbinstance.StorageType = idbinstance.GetStorageType()
dbinstance.DiskSizeGB = idbinstance.GetDiskSizeGB()
dbinstance.Category = idbinstance.GetCategory()
dbinstance.VcpuCount = idbinstance.GetVcpuCount()
dbinstance.VmemSizeMb = idbinstance.GetVmemSizeMB()
dbinstance.InstanceType = idbinstance.GetInstanceType()
dbinstance.ConnectionStr = idbinstance.GetConnectionStr()
dbinstance.InternalConnectionStr = idbinstance.GetInternalConnectionStr()
dbinstance.MaintainTime = idbinstance.GetMaintainTime()
dbinstance.Port = idbinstance.GetPort()
if createdAt := idbinstance.GetCreatedAt(); !createdAt.IsZero() {
dbinstance.CreatedAt = idbinstance.GetCreatedAt()
}
if expiredAt := idbinstance.GetExpiredAt(); !expiredAt.IsZero() {
dbinstance.ExpiredAt = expiredAt
}
return nil
})
if err != nil {
log.Errorf("failed to update dbinstance conf: %v", err)
}
dbinstance.SyncWithCloudDBInstance(ctx, userCred, dbinstance.GetCloudprovider(), idbinstance)
network, err := idbinstance.GetDBNetwork()
if err != nil {
+37 -2
View File
@@ -259,8 +259,43 @@ func (rds *SDBInstance) Refresh() error {
return jsonutils.Update(rds, instance)
}
func (rds *SDBInstance) GetIZoneId() string {
return rds.ZoneId
func (rds *SDBInstance) getZoneId(index int) string {
zoneId := rds.getZone(index)
if len(zoneId) > 0 {
zone, err := rds.region.getZoneById(zoneId)
if err != nil {
log.Errorf("failed to found zone %s for rds %s", zoneId, rds.GetName())
return ""
}
return zone.GetGlobalId()
}
return ""
}
func (rds *SDBInstance) GetZone1Id() string {
return rds.getZoneId(1)
}
func (rds *SDBInstance) GetZone2Id() string {
return rds.getZoneId(2)
}
func (rds *SDBInstance) GetZone3Id() string {
return rds.getZoneId(3)
}
func (rds *SDBInstance) getZone(index int) string {
zoneStr := strings.Replace(rds.ZoneId, ")", "", -1)
zoneInfo := strings.Split(zoneStr, ",")
if len(zoneInfo) < index {
return ""
}
zone := zoneInfo[index-1]
zoneCode := zone[len(zone)-1]
if strings.HasPrefix(rds.ZoneId, fmt.Sprintf("%s-", rds.RegionId)) {
return fmt.Sprintf("%s-%s", rds.RegionId, string(zoneCode))
}
return fmt.Sprintf("%s%s", rds.RegionId, string(zoneCode))
}
func (rds *SDBInstance) GetDBNetwork() (*cloudprovider.SDBInstanceNetwork, error) {
+9 -1
View File
@@ -232,7 +232,7 @@ func (region *SRegion) GetDBInstance(instanceId string) (*SDBInstance, error) {
return nil, cloudprovider.ErrDuplicateId
}
func (rds *SDBInstance) GetIZoneId() string {
func (rds *SDBInstance) GetZone1Id() string {
if len(rds.AvailabilityZone) > 0 {
zone, err := rds.region.getZoneById(rds.AvailabilityZone)
if err != nil {
@@ -244,6 +244,14 @@ func (rds *SDBInstance) GetIZoneId() string {
return ""
}
func (rds *SDBInstance) GetZone2Id() string {
return ""
}
func (rds *SDBInstance) GetZone3Id() string {
return ""
}
func (rds *SDBInstance) GetIDBInstanceAccounts() ([]cloudprovider.ICloudDBInstanceAccount, error) {
accounts := []cloudprovider.ICloudDBInstanceAccount{}
if len(rds.MasterUsername) > 0 {
+15 -2
View File
@@ -352,8 +352,21 @@ func (rds *SDBInstance) GetInternalConnectionStr() string {
return strings.Join(ret, ",")
}
func (rds *SDBInstance) GetIZoneId() string {
return rds.GceZone
func (rds *SDBInstance) GetZone1Id() string {
zone, err := rds.region.GetZone(rds.GceZone)
if err != nil {
log.Errorf("failed to found rds %s zone %s", rds.Name, rds.GceZone)
return ""
}
return zone.GetGlobalId()
}
func (rds *SDBInstance) GetZone2Id() string {
return ""
}
func (rds *SDBInstance) GetZone3Id() string {
return ""
}
func (rds *SDBInstance) GetIVpcId() string {
+21 -8
View File
@@ -17,7 +17,6 @@ package huawei
import (
"context"
"fmt"
"strings"
"time"
"github.com/pkg/errors"
@@ -284,16 +283,30 @@ func (rds *SDBInstance) Refresh() error {
return jsonutils.Update(rds, instance)
}
func (rds *SDBInstance) GetIZoneId() string {
zones := []string{}
func (rds *SDBInstance) GetZone1Id() string {
return rds.GetZoneIdByRole("master")
}
func (rds *SDBInstance) GetZoneIdByRole(role string) string {
for _, node := range rds.Nodes {
if node.Role == "master" {
zones = append([]string{node.AvailabilityZone}, zones...)
} else if node.Role == "slave" {
zones = append(zones, node.AvailabilityZone)
if node.Role == role {
zone, err := rds.region.getZoneById(node.AvailabilityZone)
if err != nil {
log.Errorf("failed to found zone %s for rds %s error: %v", node.AvailabilityZone, rds.Name, err)
return ""
}
return zone.GetGlobalId()
}
}
return strings.Join(zones, ",")
return ""
}
func (rds *SDBInstance) GetZone2Id() string {
return rds.GetZoneIdByRole("slave")
}
func (rds *SDBInstance) GetZone3Id() string {
return ""
}
type SRdsNetwork struct {