fix(region): skip sync vm disk error (#18039)

This commit is contained in:
屈轩
2023-09-19 10:34:42 +08:00
committed by GitHub
parent a523c10ae0
commit b9ada100a7
8 changed files with 26 additions and 20 deletions
+7 -2
View File
@@ -1432,13 +1432,14 @@ func (manager *SDiskManager) getDisksByStorage(storage *SStorage) ([]SDisk, erro
}
func (manager *SDiskManager) findOrCreateDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, vdisk cloudprovider.ICloudDisk, index int, syncOwnerId mcclient.IIdentityProvider, managerId string) (*SDisk, error) {
diskObj, err := db.FetchByExternalIdAndManagerId(manager, vdisk.GetGlobalId(), func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
diskId := vdisk.GetGlobalId()
diskObj, err := db.FetchByExternalIdAndManagerId(manager, diskId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
sq := StorageManager.Query().SubQuery()
return q.Join(sq, sqlchemy.Equals(sq.Field("id"), q.Field("storage_id"))).Filter(sqlchemy.Equals(sq.Field("manager_id"), managerId))
})
if err != nil {
if errors.Cause(err) != sql.ErrNoRows {
return nil, errors.Wrapf(err, "db.FetchByExternalIdAndManagerId")
return nil, errors.Wrapf(err, "db.FetchByExternalIdAndManagerId %s", diskId)
}
vstorage, err := vdisk.GetIStorage()
if err != nil {
@@ -1485,6 +1486,10 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To
for i := 0; i < len(removed); i += 1 {
err = removed[i].syncRemoveCloudDisk(ctx, userCred)
if err != nil {
// vm not sync, so skip disk used by vm error
if errors.Cause(err) == httperrors.ErrNotEmpty {
continue
}
syncResult.DeleteError(err)
} else {
syncResult.Delete()
+2 -2
View File
@@ -712,7 +712,7 @@ func (manager *SElasticcacheManager) newFromCloudElasticcache(ctx context.Contex
return q.Equals("manager_id", provider.Id)
})
if err != nil {
return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchVpcId")
return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchVpcId %s", vpcId)
}
instance.VpcId = vpc.GetId()
}
@@ -726,7 +726,7 @@ func (manager *SElasticcacheManager) newFromCloudElasticcache(ctx context.Contex
Filter(sqlchemy.Equals(vpc.Field("manager_id"), provider.Id))
})
if err != nil {
return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchNetworkId")
return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchNetworkId %s", networkId)
}
instance.NetworkId = network.GetId()
}
+5 -7
View File
@@ -617,9 +617,7 @@ func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred
Filter(sqlchemy.Equals(vpc.Field("manager_id"), provider.Id))
})
if err != nil {
msg := fmt.Sprintf("failed to found network by externalId %s error: %v", networkId, err)
log.Errorf(msg)
return nil, errors.Error(msg)
return nil, errors.Wrapf(err, "failed to found network by externalId %s", networkId)
}
eip.NetworkId = network.GetId()
}
@@ -951,15 +949,15 @@ func (self *SElasticip) AssociateNatGateway(ctx context.Context, userCred mcclie
}
func (manager *SElasticipManager) getEipByExtEip(ctx context.Context, userCred mcclient.TokenCredential, extEip cloudprovider.ICloudEIP, provider *SCloudprovider, region *SCloudregion, syncOwnerId mcclient.IIdentityProvider) (*SElasticip, error) {
eipObj, err := db.FetchByExternalIdAndManagerId(manager, extEip.GetGlobalId(), func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
eipId := extEip.GetGlobalId()
eipObj, err := db.FetchByExternalIdAndManagerId(manager, eipId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
return q.Equals("manager_id", provider.Id)
})
if err == nil {
return eipObj.(*SElasticip), nil
}
if err != sql.ErrNoRows {
log.Errorf("FetchByExternalId fail %s", err)
return nil, err
if errors.Cause(err) != sql.ErrNoRows {
return nil, errors.Wrapf(err, "FetchByExternalIdAndManagerId %s", eipId)
}
return manager.newFromCloudEip(ctx, userCred, extEip, provider, region, syncOwnerId)
+4 -1
View File
@@ -3529,7 +3529,7 @@ func getCloudNicNetwork(ctx context.Context, vnic cloudprovider.ICloudNic, host
Filter(sqlchemy.Equals(vpc.Field("manager_id"), host.ManagerId))
})
if err != nil {
return nil, fmt.Errorf("Cannot find network of external_id %s: %v", vnetId, err)
return nil, errors.Wrapf(err, "Cannot find network of external_id %s", vnetId)
}
localNet := localNetObj.(*SNetwork)
return localNet, nil
@@ -3827,6 +3827,9 @@ func (self *SGuest) fixSysDiskIndex() error {
sysDisk.SetModelManager(GuestdiskManager, sysDisk)
err := sysQ.First(sysDisk)
if err != nil {
if errors.Cause(err) == sql.ErrNoRows {
return nil
}
return err
}
if sysDisk.Index == 0 {
+2 -2
View File
@@ -2318,7 +2318,7 @@ func (hh *SHost) newCloudHostStorage(ctx context.Context, userCred mcclient.Toke
return q.Equals("manager_id", provider.Id)
})
if err != nil {
if err == sql.ErrNoRows {
if errors.Cause(err) == sql.ErrNoRows {
// no cloud storage found, this may happen for on-premise host
// create the storage right now
zone, _ := hh.GetZone()
@@ -2553,7 +2553,7 @@ func (hh *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCredent
sq := HostManager.Query().SubQuery()
return q.Join(sq, sqlchemy.Equals(sq.Field("id"), q.Field("host_id"))).Filter(sqlchemy.Equals(sq.Field("manager_id"), hh.ManagerId))
})
if err != nil && err != sql.ErrNoRows {
if err != nil && errors.Cause(err) != sql.ErrNoRows {
log.Errorf("failed to found guest by externalId %s error: %v", added[i].GetGlobalId(), err)
continue
}
+1 -1
View File
@@ -598,7 +598,7 @@ func (lbb *SLoadbalancerBackend) constructFieldsFromCloudLoadbalancerBackend(ext
return q.Join(sq, sqlchemy.Equals(sq.Field("id"), q.Field("host_id"))).Filter(sqlchemy.Equals(sq.Field("manager_id"), managerId))
})
if err != nil {
return err
return errors.Wrapf(err, "FetchByExternalIdAndManagerId %s", ext.GetBackendId())
}
guest := instance.(*SGuest)
+1 -1
View File
@@ -315,7 +315,7 @@ func (self *SNatSEntry) SyncWithCloudNatSTable(ctx context.Context, userCred mcc
Filter(sqlchemy.Equals(vpc.Field("manager_id"), managerId))
})
if err != nil {
return err
return errors.Wrapf(err, "search network by externalId: %s", extNetworkId)
}
self.NetworkId = network.GetId()
}
+4 -4
View File
@@ -281,7 +281,7 @@ func (manager *SVpcManager) GetOrCreateVpcForClassicNetwork(ctx context.Context,
return _vpc.(*SVpc), nil
}
if errors.Cause(err) != sql.ErrNoRows {
return nil, errors.Wrap(err, "db.FetchByExternalId")
return nil, errors.Wrapf(err, "db.FetchByExternalId %s", externalId)
}
vpc := &SVpc{}
vpc.IsDefault = false
@@ -324,7 +324,7 @@ func (svpc *SVpc) GetNetworkByExtId(extId string) (*SNetwork, error) {
return q
})
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "GetNetworkByExtId(%s)", extId)
}
return network.(*SNetwork), nil
}
@@ -1660,7 +1660,7 @@ func (svpc *SVpc) GetVpcPeeringConnectionByExtId(extId string) (*SVpcPeeringConn
return q.Equals("vpc_id", svpc.Id)
})
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "FetchByExternalIdAndManagerId %s", extId)
}
return peer.(*SVpcPeeringConnection), nil
}
@@ -1670,7 +1670,7 @@ func (svpc *SVpc) GetAccepterVpcPeeringConnectionByExtId(extId string) (*SVpcPee
return q.Equals("peer_vpc_id", svpc.Id)
})
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "FetchByExternalIdAndManagerId %s", extId)
}
return peer.(*SVpcPeeringConnection), nil
}