feat(admin): 运行时策略 - 配置对象存储策略与默认并发

This commit is contained in:
ddcat666
2026-09-29 08:26:13 +08:00
parent 387d3562ad
commit bcccddb4e9
12 changed files with 207 additions and 48 deletions

View File

@@ -324,6 +324,7 @@ func (s *Service) openResourceRange(userID string, resource *model.Resource, ran
setting.Provider = firstNonEmpty(resource.Provider, setting.Provider)
setting.Endpoint = firstNonEmpty(resource.Endpoint, setting.Endpoint)
setting.Bucket = firstNonEmpty(resource.Bucket, setting.Bucket)
setting = s.storageSettingWithRuntimePolicy(setting)
stream, err := getOriginOSSObjectRange(setting, resource.ObjectKey, normalizeSingleByteRange(rangeHeader))
if err != nil {
return nil, err
@@ -445,7 +446,7 @@ func (s *Service) storeResourceObject(resource *model.Resource, fileName string,
if settingErr != nil {
return "", settingErr
}
etag, err := putOSSObject(setting, resource.ObjectKey, resource.MimeType, resource.Size, body)
etag, err := putOSSObject(s.storageSettingWithRuntimePolicy(setting), resource.ObjectKey, resource.MimeType, resource.Size, body)
if err != nil {
return "", err
}

View File

@@ -1,14 +1,33 @@
package app
import "infinite-canvas/backend/internal/storage"
import (
"time"
"infinite-canvas/backend/internal/storage"
)
type ossSettingValue = storage.Settings
type ossProviderCredentials = storage.Credentials
type ossObjectStream = storage.ObjectStream
func (s *Service) storageSettingWithRuntimePolicy(setting ossSettingValue) ossSettingValue {
setting = normalizeOSSSetting(setting)
policy, err := s.RuntimePolicy()
if err != nil {
return setting
}
setting.Runtime = storage.RuntimePolicy{
TransferTimeout: time.Duration(policy.Storage.TransferTimeoutSeconds) * time.Second,
AccessURLTTL: time.Duration(policy.Storage.AccessURLTTLSeconds) * time.Second,
ProviderAccessURLTTL: time.Duration(policy.Storage.ProviderAccessURLTTLSeconds) * time.Second,
MaxBufferedUploadSize: policy.Storage.NonSeekableBufferMB * 1024 * 1024,
ErrorBodyLimit: policy.Storage.ErrorBodyKB * 1024,
}
return normalizeOSSSetting(setting)
}
var (
putOSSObject = storage.PutOSSObject
putAliyunOSSObject = storage.PutAliyunOSSObject
getOSSObjectRange = storage.GetOSSObjectRange
getAliyunOSSObjectRange = storage.GetAliyunOSSObjectRange
signedOSSObjectURL = storage.SignedOSSObjectURL

View File

@@ -81,7 +81,7 @@ func (s *Service) testOSSSetting(scope string, ownerID string, actorID string, r
}()
testKey := path.Join(value.PathPrefix, ".yingce-tests", scope, newID())
if err := verifyOSSConnection(value, testKey); err != nil {
if err := verifyOSSConnection(s.storageSettingWithRuntimePolicy(value), testKey); err != nil {
return nil, err
}

View File

@@ -281,7 +281,7 @@ func (s *Service) storeTaskMediaObject(resource *model.Resource, _ string, body
if err != nil {
return "", err
}
return putOSSObject(setting, resource.ObjectKey, resource.MimeType, resource.Size, body)
return putOSSObject(s.storageSettingWithRuntimePolicy(setting), resource.ObjectKey, resource.MimeType, resource.Size, body)
}
// Cleanup is best effort only after durable completion. Expired leftovers are