mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix(region): sync storage before syncing host in syncOnPremiseCloudProviderInfo
场景:重新构建了某个存储,相当于把之前某个存储上的所有虚拟机迁移到一个新的存储上。 因为没有syncStorage,所以在同步syncHostStorge的时候无法disconnect host 和 没有的storage,这是因为storage上还有host的虚拟机。syncHostStorages 会失败,storageCache 也就不会同步,上面的icloudImage也不会同步。
This commit is contained in:
@@ -1390,6 +1390,47 @@ func syncPublicCloudProviderInfo(
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncOnPremiseCloudProviderStorage(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, iregion cloudprovider.ICloudRegion, driver cloudprovider.ICloudProvider, syncRange *SSyncRange) []sStoragecacheSyncPair {
|
||||
istorages, err := iregion.GetIStorages()
|
||||
if err != nil {
|
||||
msg := fmt.Sprintf("GetIStorages for provider %s failed %s", provider.GetName(), err)
|
||||
log.Errorf(msg)
|
||||
return nil
|
||||
}
|
||||
localStorages, remoteStorages, result := StorageManager.SyncStorages(ctx, userCred, provider, nil, istorages)
|
||||
syncResults.Add(StorageManager, result)
|
||||
|
||||
msg := result.Result()
|
||||
notes := fmt.Sprintf("SyncStorages for provider %s result: %s", provider.Name, msg)
|
||||
log.Infof(notes)
|
||||
if result.IsError() {
|
||||
return nil
|
||||
}
|
||||
|
||||
storageCachePairs := make([]sStoragecacheSyncPair, 0)
|
||||
for i := 0; i < len(localStorages); i += 1 {
|
||||
func() {
|
||||
lockman.LockObject(ctx, &localStorages[i])
|
||||
defer lockman.ReleaseObject(ctx, &localStorages[i])
|
||||
|
||||
if localStorages[i].Deleted {
|
||||
return
|
||||
}
|
||||
|
||||
if !isInCache(storageCachePairs, localStorages[i].StoragecacheId) {
|
||||
cachePair := syncStorageCaches(ctx, userCred, provider, &localStorages[i], remoteStorages[i])
|
||||
if cachePair.remote != nil && cachePair.local != nil {
|
||||
storageCachePairs = append(storageCachePairs, cachePair)
|
||||
}
|
||||
}
|
||||
if !remoteStorages[i].DisableSync() {
|
||||
syncStorageDisks(ctx, userCred, syncResults, provider, driver, &localStorages[i], remoteStorages[i], syncRange)
|
||||
}
|
||||
}()
|
||||
}
|
||||
return storageCachePairs
|
||||
}
|
||||
|
||||
func syncOnPremiseCloudProviderInfo(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
@@ -1413,8 +1454,9 @@ func syncOnPremiseCloudProviderInfo(
|
||||
syncRegionBuckets(ctx, userCred, syncResults, provider, localRegion, iregion)
|
||||
}
|
||||
|
||||
storageCachePairs := make([]sStoragecacheSyncPair, 0)
|
||||
var storageCachePairs []sStoragecacheSyncPair
|
||||
if cloudprovider.IsSupportCompute(driver) {
|
||||
storageCachePairs = syncOnPremiseCloudProviderStorage(ctx, userCred, syncResults, provider, iregion, driver, syncRange)
|
||||
ihosts, err := iregion.GetIHosts()
|
||||
if err != nil {
|
||||
msg := fmt.Sprintf("GetIHosts for provider %s failed %s", provider.GetName(), err)
|
||||
|
||||
@@ -655,9 +655,12 @@ func (self *SStorage) SyncStatusWithHosts() {
|
||||
}
|
||||
}
|
||||
|
||||
func (manager *SStorageManager) getStoragesByZoneId(zoneId string, provider *SCloudprovider) ([]SStorage, error) {
|
||||
func (manager *SStorageManager) getStoragesByZone(zone *SZone, provider *SCloudprovider) ([]SStorage, error) {
|
||||
storages := make([]SStorage, 0)
|
||||
q := manager.Query().Equals("zone_id", zoneId)
|
||||
q := manager.Query()
|
||||
if zone != nil {
|
||||
q = q.Equals("zone_id", zone.Id)
|
||||
}
|
||||
if provider != nil {
|
||||
q = q.Equals("manager_id", provider.Id)
|
||||
}
|
||||
@@ -698,7 +701,7 @@ func (manager *SStorageManager) SyncStorages(ctx context.Context, userCred mccli
|
||||
return nil, nil, syncResult
|
||||
}
|
||||
|
||||
dbStorages, err := manager.getStoragesByZoneId(zone.Id, provider)
|
||||
dbStorages, err := manager.getStoragesByZone(zone, provider)
|
||||
if err != nil {
|
||||
syncResult.Error(err)
|
||||
return nil, nil, syncResult
|
||||
|
||||
Reference in New Issue
Block a user