From 32600e7c165afca2bc33cfcf255735a5474769f4 Mon Sep 17 00:00:00 2001 From: Erwan Rouchet <rouchet@teklia.com> Date: Thu, 28 Nov 2024 10:00:00 +0100 Subject: [PATCH] Add an option for maximum retries on all S3 requests --- arkindex/project/aws.py | 4 ++++ arkindex/project/config.py | 1 + arkindex/project/settings.py | 1 + arkindex/project/tests/config_samples/defaults.yaml | 1 + arkindex/project/tests/config_samples/errors.yaml | 1 + arkindex/project/tests/config_samples/expected_errors.yaml | 2 ++ arkindex/project/tests/config_samples/override.yaml | 1 + 7 files changed, 11 insertions(+) diff --git a/arkindex/project/aws.py b/arkindex/project/aws.py index 1def44b850..3245ed056e 100644 --- a/arkindex/project/aws.py +++ b/arkindex/project/aws.py @@ -30,6 +30,10 @@ def get_s3_resource( signature_version="s3v4", s3={ "addressing_style": "auto" if endpoint else "virtual", + }, + retries={ + "mode": "standard", + "max_attempts": settings.AWS_MAX_RETRIES, } ) diff --git a/arkindex/project/config.py b/arkindex/project/config.py index 47a70f3801..edcb4e3a4f 100644 --- a/arkindex/project/config.py +++ b/arkindex/project/config.py @@ -209,6 +209,7 @@ def get_settings_parser(base_dir): parser.add_option("cache", default={}, type=cache_validator) s3_parser = add_s3_parser(parser, "s3") + s3_parser.add_option("max_retries", type=int, default=5) s3_parser.add_option("thumbnails_bucket", type=str, default="thumbnails") s3_parser.add_option("staging_bucket", type=str, default="staging") s3_parser.add_option("export_bucket", type=str, default="export") diff --git a/arkindex/project/settings.py b/arkindex/project/settings.py index 1b2d950cbc..d3173a6245 100644 --- a/arkindex/project/settings.py +++ b/arkindex/project/settings.py @@ -528,6 +528,7 @@ AWS_ACCESS_KEY = conf["s3"]["access_key_id"] AWS_SECRET_KEY = conf["s3"]["secret_access_key"] AWS_ENDPOINT = conf["s3"]["endpoint"] AWS_REGION = conf["s3"]["region"] +AWS_MAX_RETRIES = conf["s3"]["max_retries"] PONOS_S3_LOGS_BUCKET = conf["s3"]["ponos_logs_bucket"] PONOS_S3_ARTIFACTS_BUCKET = conf["s3"]["ponos_artifacts_bucket"] diff --git a/arkindex/project/tests/config_samples/defaults.yaml b/arkindex/project/tests/config_samples/defaults.yaml index d2e108d675..24aa0d51d4 100644 --- a/arkindex/project/tests/config_samples/defaults.yaml +++ b/arkindex/project/tests/config_samples/defaults.yaml @@ -81,6 +81,7 @@ s3: access_key_id: null endpoint: null export_bucket: export + max_retries: 5 ponos_artifacts_bucket: ponos-artifacts ponos_logs_bucket: ponos-logs region: null diff --git a/arkindex/project/tests/config_samples/errors.yaml b/arkindex/project/tests/config_samples/errors.yaml index 5925b919da..fd795eded5 100644 --- a/arkindex/project/tests/config_samples/errors.yaml +++ b/arkindex/project/tests/config_samples/errors.yaml @@ -62,6 +62,7 @@ redis: timeout: sauce s3: endpoint: null + max_retries: [1, 2] ponos_artifacts_bucket: {} ponos_logs_bucket: null region: null diff --git a/arkindex/project/tests/config_samples/expected_errors.yaml b/arkindex/project/tests/config_samples/expected_errors.yaml index b9ec8b030b..97cd216bd5 100644 --- a/arkindex/project/tests/config_samples/expected_errors.yaml +++ b/arkindex/project/tests/config_samples/expected_errors.yaml @@ -40,6 +40,8 @@ redis: port: "invalid literal for int() with base 10: 'over nine thousand'" db: "invalid literal for int() with base 10: 'idk'" timeout: "invalid literal for int() with base 10: 'sauce'" +s3: + max_retries: "int() argument must be a string, a bytes-like object or a real number, not 'list'" session: cookie_samesite: "'foo' is not a valid CookieSameSiteOption" signup_default_group: "badly formed hexadecimal UUID string" diff --git a/arkindex/project/tests/config_samples/override.yaml b/arkindex/project/tests/config_samples/override.yaml index 7a807a1fef..1de12bd3e8 100644 --- a/arkindex/project/tests/config_samples/override.yaml +++ b/arkindex/project/tests/config_samples/override.yaml @@ -98,6 +98,7 @@ s3: access_key_id: abcd endpoint: http://somewhere export_bucket: exbort + max_retries: 99 ponos_artifacts_bucket: zstandardland ponos_logs_bucket: plaintexttown region: middle-earth-1 -- GitLab