Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-awscrt for openSUSE:Factory checked in at 2026-10-14 18:34:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-awscrt (Old) and /work/SRC/openSUSE:Factory/.python-awscrt.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-awscrt" Wed Oct 14 18:34:32 2026 rev:12 rq:1384277 version:0.37.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-awscrt/python-awscrt.changes 2026-09-04 12:42:39.806332485 +0200 +++ /work/SRC/openSUSE:Factory/.python-awscrt.new.3698736/python-awscrt.changes 2026-10-14 18:34:59.041524534 +0200 @@ -1,0 +2,12 @@ +Wed Oct 7 13:40:44 UTC 2026 - John Paul Adrian Glaubitz <[email protected]> + +- Update to version 0.37.0 + * Submodule update -- S3 out of order write to file in parallel + by @TingDaoK in (#769) +- from version 0.36.4 + * submodule update by @TingDaoK in (#766) +- from version 0.36.3 + * S3 Retry Option Bindings by @sbSteveK in (#764) + * latest submodules by @sbSteveK in (#765) + +------------------------------------------------------------------- Old: ---- awscrt-0.36.2.tar.gz New: ---- awscrt-0.37.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-awscrt.spec ++++++ --- /var/tmp/diff_new_pack.z8PwbH/_old 2026-10-14 18:34:59.818557061 +0200 +++ /var/tmp/diff_new_pack.z8PwbH/_new 2026-10-14 18:34:59.819557103 +0200 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-awscrt -Version: 0.36.2 +Version: 0.37.0 Release: 0 Summary: A common runtime for AWS Python projects License: Apache-2.0 ++++++ awscrt-0.36.2.tar.gz -> awscrt-0.37.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-python-0.36.2/awscrt/aws_iot_metrics.py new/aws-crt-python-0.37.0/awscrt/aws_iot_metrics.py --- old/aws-crt-python-0.36.2/awscrt/aws_iot_metrics.py 2026-08-11 19:16:40.000000000 +0200 +++ new/aws-crt-python-0.37.0/awscrt/aws_iot_metrics.py 2026-09-23 09:04:30.000000000 +0200 @@ -4,6 +4,7 @@ from dataclasses import dataclass from typing import List, Optional from enum import Enum +from awscrt.io import ExponentialBackoffJitterMode import sys @@ -118,7 +119,6 @@ Mapping: NONE->A, FULL->B, DECORRELATED->C. Returns None for DEFAULT. """ - from awscrt.mqtt5 import ExponentialBackoffJitterMode mapping = { ExponentialBackoffJitterMode.NONE: "A", ExponentialBackoffJitterMode.FULL: "B", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-python-0.36.2/awscrt/io.py new/aws-crt-python-0.37.0/awscrt/io.py --- old/aws-crt-python-0.36.2/awscrt/io.py 2026-08-11 19:16:40.000000000 +0200 +++ new/aws-crt-python-0.37.0/awscrt/io.py 2026-09-23 09:04:30.000000000 +0200 @@ -854,3 +854,32 @@ behavior = Pkcs11Lib.InitializeFinalizeBehavior.DEFAULT self._binding = _awscrt.pkcs11_lib_new(file, behavior) + + +class ExponentialBackoffJitterMode(IntEnum): + """Controls how the retry/reconnect delay is modified in order to smooth out the distribution + of retry attempt timepoints for a large set of clients. + + See `Exponential Backoff and Jitter <https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/>`_ + """ + + DEFAULT = 0 + """ + Maps to Full + """ + + NONE = 1 + """ + Do not perform any randomization on the backoff delay + """ + + FULL = 2 + """ + Fully random between no delay and the current exponential backoff value. + """ + + DECORRELATED = 3 + """ + Backoff is taken randomly from the interval between the base backoff + interval and a scaling (greater than 1) of the current backoff value + """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-python-0.36.2/awscrt/mqtt5.py new/aws-crt-python-0.37.0/awscrt/mqtt5.py --- old/aws-crt-python-0.36.2/awscrt/mqtt5.py 2026-08-11 19:16:40.000000000 +0200 +++ new/aws-crt-python-0.37.0/awscrt/mqtt5.py 2026-09-23 09:04:30.000000000 +0200 @@ -11,7 +11,7 @@ from enum import IntEnum from awscrt import NativeResource, exceptions from awscrt.http import HttpProxyOptions, HttpRequest -from awscrt.io import ClientBootstrap, SocketOptions, ClientTlsContext +from awscrt.io import ClientBootstrap, SocketOptions, ClientTlsContext, ExponentialBackoffJitterMode from dataclasses import dataclass from collections.abc import Sequence from inspect import signature @@ -798,35 +798,6 @@ """ -class ExponentialBackoffJitterMode(IntEnum): - """Controls how the reconnect delay is modified in order to smooth out the distribution of reconnection attempt - timepoints for a large set of reconnecting clients. - - See `Exponential Backoff and Jitter <https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/>`_ - """ - - DEFAULT = 0 - """ - Maps to Full - """ - - NONE = 1 - """ - Do not perform any randomization on the reconnect delay - """ - - FULL = 2 - """ - Fully random between no delay and the current exponential backoff value. - """ - - DECORRELATED = 3 - """ - Backoff is taken randomly from the interval between the base backoff - interval and a scaling (greater than 1) of the current backoff value - """ - - @dataclass class UserProperty: """MQTT5 User Property diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-python-0.36.2/awscrt/s3.py new/aws-crt-python-0.37.0/awscrt/s3.py --- old/aws-crt-python-0.36.2/awscrt/s3.py 2026-08-11 19:16:40.000000000 +0200 +++ new/aws-crt-python-0.37.0/awscrt/s3.py 2026-09-23 09:04:30.000000000 +0200 @@ -9,7 +9,7 @@ from concurrent.futures import Future from awscrt import NativeResource from awscrt.http import HttpRequest -from awscrt.io import ClientBootstrap, TlsConnectionOptions +from awscrt.io import ClientBootstrap, TlsConnectionOptions, ExponentialBackoffJitterMode from awscrt.auth import AwsCredentialsProvider, AwsSignatureType, AwsSignedBodyHeaderType, AwsSignedBodyValue, \ AwsSigningAlgorithm, AwsSigningConfig import awscrt.exceptions @@ -197,6 +197,43 @@ """ +@dataclass +class S3RetryConfig: + """Configuration for the S3 client's retry strategy. + + All fields default to 0, which means "use S3 client default." + + S3 client defaults: + max_retries = 5, backoff_scale_factor_ms = 500, max_backoff_secs = 20, + jitter_mode = FULL, initial_bucket_capacity = 500 + + If the S3Client is constructed with a custom retry_strategy object, + this configuration is ignored entirely. + + Args: + max_retries (int): Maximum number of retries per request. + 0 means use S3 client default (5). + + backoff_scale_factor_ms (int): Base delay in milliseconds, + multiplied by 2^attempt for exponential backoff. 0 means use default (500). + + max_backoff_secs (int): Maximum backoff delay in seconds + (ceiling on any single retry delay). 0 means use default (20). + + jitter_mode (int): Jitter mode for retry backoff. + 0 means use default (FULL). See :class:`~awscrt.io.ExponentialBackoffJitterMode`. + + initial_bucket_capacity (int): Token bucket capacity per + host partition (circuit breaker). Controls how many concurrent + failures are tolerated before retries are rejected. 0 means use default (500). + """ + max_retries: int = 0 + backoff_scale_factor_ms: int = 0 + max_backoff_secs: int = 0 + jitter_mode: int = 0 + initial_bucket_capacity: int = 0 + + class S3Client(NativeResource): """S3 client @@ -283,6 +320,9 @@ max_active_connections_override (Optional[int]): When set, this will cap the number of active connections for the meta request. When not set, the client will determine this value based on `throughput_target_gbps`. (Recommended) + + retry_config (Optional[S3RetryConfig]): Configuration for the retry strategy. + See :class:`S3RetryConfig` for details. If not set, S3 client defaults are used. """ __slots__ = ('shutdown_event', '_region') @@ -303,7 +343,8 @@ memory_limit=None, network_interface_names: Optional[Sequence[str]] = None, fio_options: Optional['S3FileIoOptions'] = None, - max_active_connections_override: Optional[int] = None): + max_active_connections_override: Optional[int] = None, + retry_config: Optional[S3RetryConfig] = None): assert isinstance(bootstrap, ClientBootstrap) or bootstrap is None assert isinstance(region, str) assert isinstance(signing_config, AwsSigningConfig) or signing_config is None @@ -360,6 +401,11 @@ network_interface_names = list(network_interface_names) if max_active_connections_override is None: max_active_connections_override = 0 + + # Retry config: 0 means "use S3 client defaults" + if retry_config is None: + retry_config = S3RetryConfig() + fio_options_set = False should_stream = False disk_throughput_gbps = 0.0 @@ -389,7 +435,12 @@ disk_throughput_gbps, direct_io, max_active_connections_override, - s3_client_core) + s3_client_core, + retry_config.max_retries, + retry_config.backoff_scale_factor_ms, + retry_config.max_backoff_secs, + int(retry_config.jitter_mode), + retry_config.initial_bucket_capacity) def make_request( self, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-python-0.36.2/source/s3_client.c new/aws-crt-python-0.37.0/source/s3_client.c --- old/aws-crt-python-0.36.2/source/s3_client.c 2026-08-11 19:16:40.000000000 +0200 +++ new/aws-crt-python-0.37.0/source/s3_client.c 2026-09-23 09:04:30.000000000 +0200 @@ -265,9 +265,15 @@ uint64_t max_active_connections_override; /* K */ PyObject *py_core; /* O */ + uint64_t retry_max_retries; /* K */ + uint64_t retry_backoff_scale_factor_ms; /* K */ + uint64_t retry_max_backoff_secs; /* K */ + int retry_jitter_mode; /* i */ + uint64_t retry_initial_bucket_capacity; /* K */ + if (!PyArg_ParseTuple( args, - "OOOOOs#iKKdpKOppdpKO", + "OOOOOs#iKKdpKOppdpKOKKKiK", &bootstrap_py, &signing_config_py, &credential_provider_py, @@ -287,7 +293,12 @@ &disk_throughput_gbps, &direct_io, &max_active_connections_override, - &py_core)) { + &py_core, + &retry_max_retries, + &retry_backoff_scale_factor_ms, + &retry_max_backoff_secs, + &retry_jitter_mode, + &retry_initial_bucket_capacity)) { return NULL; } @@ -414,6 +425,12 @@ .max_active_connections_override = max_active_connections_override, }; + s3_config.retry_config.max_retries = (size_t)retry_max_retries; + s3_config.retry_config.backoff_scale_factor_ms = (uint32_t)retry_backoff_scale_factor_ms; + s3_config.retry_config.max_backoff_secs = (uint32_t)retry_max_backoff_secs; + s3_config.retry_config.jitter_mode = (enum aws_exponential_backoff_jitter_mode)retry_jitter_mode; + s3_config.retry_config.initial_bucket_capacity = (size_t)retry_initial_bucket_capacity; + s3_client->native = aws_s3_client_new(allocator, &s3_config); if (s3_client->native == NULL) { PyErr_SetAwsLastError();
