From 606045bcefc3d7054824fd5c6c64e02d3a4fad29 Mon Sep 17 00:00:00 2001 From: rainzm Date: Thu, 8 Jul 2021 19:43:11 +0800 Subject: [PATCH] fix(region): sync storage before syncing host in syncOnPremiseCloudProviderInfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 场景:重新构建了某个存储,相当于把之前某个存储上的所有虚拟机迁移到一个新的存储上。 因为没有syncStorage,所以在同步syncHostStorge的时候无法disconnect host 和 没有的storage,这是因为storage上还有host的虚拟机。syncHostStorages 会失败,storageCache 也就不会同步,上面的icloudImage也不会同步。 --- pkg/compute/models/cloudsync.go | 44 ++++++++++++++++++++++++++++++++- pkg/compute/models/storages.go | 9 ++++--- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index f3a0719374..a1cd09ccab 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -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) diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index d0ebeb3e54..dd12673cf6 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -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