fix(region): sync storage before syncing host in syncOnPremiseCloudProviderInfo

场景:重新构建了某个存储,相当于把之前某个存储上的所有虚拟机迁移到一个新的存储上。

因为没有syncStorage,所以在同步syncHostStorge的时候无法disconnect host
和 没有的storage,这是因为storage上还有host的虚拟机。syncHostStorages
会失败,storageCache 也就不会同步,上面的icloudImage也不会同步。
This commit is contained in:
rainzm
2021-07-09 19:19:53 +08:00
parent 79a4303be8
commit 606045bcef
2 changed files with 49 additions and 4 deletions
+43 -1
View File
@@ -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)
+6 -3
View File
@@ -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