diff --git a/config/default.yaml b/config/default.yaml index 8e9c70deb10..f097588ffc7 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -214,6 +214,11 @@ object_storage: # Maximum amount to upload in one request to object storage max_upload_part: 100MB + # Maximum number of attempts to make a request to object storage + # Some object storage providers (for instance Backblaze) expects the client to retry upload upon 5xx errors + # If you're using such a provider then you can increase this value + max_request_attempts: 3 + streaming_playlists: bucket_name: 'streaming-playlists' diff --git a/config/production.yaml.example b/config/production.yaml.example index a43c08bd3c0..0e8fd86ee14 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example @@ -212,6 +212,11 @@ object_storage: # Maximum amount to upload in one request to object storage max_upload_part: 100MB + # Maximum number of attempts to make a request to object storage + # Some object storage providers (for instance Backblaze) expects the client to retry upload upon 5xx errors + # If you're using such a provider then you can increase this value + max_request_attempts: 3 + streaming_playlists: bucket_name: 'streaming-playlists' diff --git a/server/core/initializers/checker-before-init.ts b/server/core/initializers/checker-before-init.ts index 9dbd1fcad8c..73743ebe738 100644 --- a/server/core/initializers/checker-before-init.ts +++ b/server/core/initializers/checker-before-init.ts @@ -67,7 +67,7 @@ function checkMissedConfig () { 'object_storage.credentials.secret_access_key', 'object_storage.max_upload_part', 'object_storage.streaming_playlists.bucket_name', 'object_storage.streaming_playlists.prefix', 'object_storage.streaming_playlists.base_url', 'object_storage.web_videos.bucket_name', 'object_storage.web_videos.prefix', 'object_storage.web_videos.base_url', 'object_storage.original_video_files.bucket_name', - 'object_storage.original_video_files.prefix', 'object_storage.original_video_files.base_url', + 'object_storage.original_video_files.prefix', 'object_storage.original_video_files.base_url', 'object_storage.max_request_attempts', 'theme.default', 'feeds.videos.count', 'feeds.comments.count', 'geo_ip.enabled', 'geo_ip.country.database_url', 'geo_ip.city.database_url', diff --git a/server/core/initializers/config.ts b/server/core/initializers/config.ts index d7749ce9a13..5fe0f8376fa 100644 --- a/server/core/initializers/config.ts +++ b/server/core/initializers/config.ts @@ -133,6 +133,7 @@ const CONFIG = { OBJECT_STORAGE: { ENABLED: config.get('object_storage.enabled'), MAX_UPLOAD_PART: bytes.parse(config.get('object_storage.max_upload_part')), + MAX_REQUEST_ATTEMPTS: config.get('object_storage.max_request_attempts'), ENDPOINT: config.get('object_storage.endpoint'), REGION: config.get('object_storage.region'), UPLOAD_ACL: { diff --git a/server/core/lib/object-storage/shared/client.ts b/server/core/lib/object-storage/shared/client.ts index 42a573d827c..fbbb2480a70 100644 --- a/server/core/lib/object-storage/shared/client.ts +++ b/server/core/lib/object-storage/shared/client.ts @@ -45,7 +45,8 @@ function getClient () { secretAccessKey: OBJECT_STORAGE.CREDENTIALS.SECRET_ACCESS_KEY } : undefined, - requestHandler: await getProxyRequestHandler() + requestHandler: await getProxyRequestHandler(), + maxAttempts: CONFIG.OBJECT_STORAGE.MAX_REQUEST_ATTEMPTS }) logger.info('Initialized S3 client %s with region %s.', getEndpoint(), OBJECT_STORAGE.REGION, lTags())