mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-07 08:06:37 +08:00
fix(storage): apply driver switch on save and repoint upload records
Saving storage settings now activates the selected driver immediately
instead of staging it until migration. When the driver changes, existing
upload rows are repointed to the new storage_driver so /f/{id} reads use
the correct backend. ForDriver can also open non-active drivers from the
saved multi-backend config.
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/db"
|
||||
@@ -87,6 +88,9 @@ func updateSystemConfig(ctx context.Context, key string, req UpdateSystemConfigR
|
||||
if err := tx.Model(&config).Updates(updates).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if err := repointUploadStorageDriversOnDriverSwitch(ctx, tx, key, originalDriver, req.Value); err != nil {
|
||||
return err
|
||||
}
|
||||
resolveStorageMigrationTasksOnDirectDriverUpdate(ctx, tx, key, originalDriver, req.Value)
|
||||
return nil
|
||||
}); err != nil {
|
||||
@@ -97,6 +101,38 @@ func updateSystemConfig(ctx context.Context, key string, req UpdateSystemConfigR
|
||||
return nil
|
||||
}
|
||||
|
||||
func repointUploadStorageDriversOnDriverSwitch(
|
||||
ctx context.Context,
|
||||
tx *gorm.DB,
|
||||
key string,
|
||||
originalDriver storage.Driver,
|
||||
newValue string,
|
||||
) error {
|
||||
if key != model.ConfigKeyStorageConfig || originalDriver == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
var newCfg storage.Config
|
||||
if err := json.Unmarshal([]byte(newValue), &newCfg); err != nil {
|
||||
return fmt.Errorf("parse storage config for driver repoint: %w", err)
|
||||
}
|
||||
if newCfg.Driver == "" || newCfg.Driver == originalDriver {
|
||||
return nil
|
||||
}
|
||||
|
||||
result := tx.Model(&model.Upload{}).
|
||||
Where("storage_driver = ? AND status != ?", string(originalDriver), model.UploadStatusDeleted).
|
||||
Update("storage_driver", string(newCfg.Driver))
|
||||
if result.Error != nil {
|
||||
return result.Error
|
||||
}
|
||||
if result.RowsAffected > 0 {
|
||||
logger.InfoF(ctx, "[StorageConfig] switched driver %s -> %s, repointed %d upload records",
|
||||
originalDriver, newCfg.Driver, result.RowsAffected)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func resolveStorageMigrationTasksOnDirectDriverUpdate(
|
||||
ctx context.Context,
|
||||
tx *gorm.DB,
|
||||
|
||||
@@ -310,10 +310,6 @@ func validateAndMergeStorageConfig(ctx context.Context, value string, currentCon
|
||||
if err := validateMergedStorageConfig(ctx, currentCfg, newCfg, targetCfg); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if newCfg.Driver != "" && newCfg.Driver != currentCfg.Driver {
|
||||
// 切换存储类型时仅暂存目标后端参数,活动 driver 由迁移任务正式切换。
|
||||
targetCfg.Driver = currentCfg.Driver
|
||||
}
|
||||
|
||||
// 序列化为最终保存的真实明文配置,防止保存屏蔽的 ****** 字符
|
||||
unmaskedVal, err := json.Marshal(targetCfg)
|
||||
|
||||
@@ -441,7 +441,7 @@ func TestUpdateStorageConfigValidation(t *testing.T) {
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("stage local config while active s3 is unreachable", func(t *testing.T) {
|
||||
t.Run("switch to local while active s3 is unreachable", func(t *testing.T) {
|
||||
activeCfg := storage.DefaultConfig()
|
||||
activeCfg.Driver = storage.DriverS3
|
||||
activeCfg.S3.Endpoint = "http://127.0.0.1:9999"
|
||||
@@ -486,8 +486,8 @@ func TestUpdateStorageConfigValidation(t *testing.T) {
|
||||
if err := json.Unmarshal([]byte(dbCfg.Value), &savedCfg); err != nil {
|
||||
t.Fatalf("parse saved storage config failed: %v", err)
|
||||
}
|
||||
if savedCfg.Driver != storage.DriverS3 {
|
||||
t.Fatalf("active driver = %q, want %q until migration completes", savedCfg.Driver, storage.DriverS3)
|
||||
if savedCfg.Driver != storage.DriverLocal {
|
||||
t.Fatalf("active driver = %q, want %q after save", savedCfg.Driver, storage.DriverLocal)
|
||||
}
|
||||
if savedCfg.Local.Root != tempDir {
|
||||
t.Fatalf("staged local root = %q, want %q", savedCfg.Local.Root, tempDir)
|
||||
|
||||
Reference in New Issue
Block a user