From b5ab7482a80ca13d06be858a898468a265ecda3e Mon Sep 17 00:00:00 2001 From: ForSourceCodeAnalysis Date: Sun, 21 Jul 2024 07:17:23 +0000 Subject: [PATCH] fix:reload all storages --- internal/op/storage.go | 18 ++++++++++++++++++ pkg/generic_sync/map.go | 10 ++++++++++ server/handles/storage.go | 20 ++++++++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/internal/op/storage.go b/internal/op/storage.go index 2f0831c452e..fe7139e1205 100644 --- a/internal/op/storage.go +++ b/internal/op/storage.go @@ -2,6 +2,7 @@ package op import ( "context" + "slices" "sort" "strings" "time" @@ -190,6 +191,23 @@ func UpdateStorage(ctx context.Context, storage model.Storage) error { log.Debugf("storage %+v is update", storageDriver) return err } +func DeleteMemoryStorage(dbMountPaths []string) { + keys := storagesMap.Keys() + for _, v := range keys { + if slices.Contains(dbMountPaths, v) { + continue + } + storageDriver, ok := storagesMap.Load(v) + if !ok { + continue + } + //ignore err + storageDriver.Drop(context.Background()) + //delete + storagesMap.Delete(v) + + } +} func DeleteStorageById(ctx context.Context, id uint) error { storage, err := db.GetStorageById(id) diff --git a/pkg/generic_sync/map.go b/pkg/generic_sync/map.go index 96612f0cc44..8ef78c01cb2 100644 --- a/pkg/generic_sync/map.go +++ b/pkg/generic_sync/map.go @@ -352,6 +352,16 @@ func (m *MapOf[K, V]) Values() []V { return values } +// Keys returns a slice of the keys in the map. +func (m *MapOf[K, V]) Keys() []K { + var keys []K + m.Range(func(key K, value V) bool { + keys = append(keys, key) + return true + }) + return keys +} + func (m *MapOf[K, V]) Count() int { return len(m.dirty) } diff --git a/server/handles/storage.go b/server/handles/storage.go index c6c0a41d158..11c3033772e 100644 --- a/server/handles/storage.go +++ b/server/handles/storage.go @@ -128,16 +128,18 @@ func LoadAllStorages(c *gin.Context) { } conf.StoragesLoaded = false go func(storages []model.Storage) { + //current mount paths in db + var mountPaths []string for _, storage := range storages { + mountPaths = append(mountPaths, storage.MountPath) + //GetStorageByMountPath used old storagesMap,if err is not nil, + // the mountPath is added by other server , just do LoadStorage storageDriver, err := op.GetStorageByMountPath(storage.MountPath) - if err != nil { - log.Errorf("failed get storage driver: %+v", err) - continue - } - // drop the storage in the driver - if err := storageDriver.Drop(context.Background()); err != nil { - log.Errorf("failed drop storage: %+v", err) - continue + if err == nil { + if err := storageDriver.Drop(context.Background()); err != nil { + log.Errorf("failed drop storage: %+v", err) + continue + } } if err := op.LoadStorage(context.Background(), storage); err != nil { log.Errorf("failed get enabled storages: %+v", err) @@ -146,6 +148,8 @@ func LoadAllStorages(c *gin.Context) { log.Infof("success load storage: [%s], driver: [%s]", storage.MountPath, storage.Driver) } + //deal the keys in storagesMap, but not in mountPaths + op.DeleteMemoryStorage(mountPaths) conf.StoragesLoaded = true }(storages) common.SuccessResp(c)