From 2de66584fd599121687f02aa084fb79ff089b586 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Tue, 3 Mar 2026 14:24:55 -0800 Subject: [PATCH 1/2] PYTHON-5741 - Transaction state is preserved across retries --- .../backpressure-retryable-writes.json | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/test/transactions/unified/backpressure-retryable-writes.json b/test/transactions/unified/backpressure-retryable-writes.json index 0817e03f2f..eea0e6b5da 100644 --- a/test/transactions/unified/backpressure-retryable-writes.json +++ b/test/transactions/unified/backpressure-retryable-writes.json @@ -412,17 +412,31 @@ "events": [ { "commandStartedEvent": { - "commandName": "insert" + "command": { + "startTransaction": true + }, + "commandName": "insert", + "databaseName": "transaction-tests" } }, { "commandStartedEvent": { - "commandName": "insert" + "command": { + "startTransaction": true + }, + "commandName": "insert", + "databaseName": "transaction-tests" } }, { "commandStartedEvent": { - "commandName": "abortTransaction" + "command": { + "startTransaction": { + "$$exists": false + } + }, + "commandName": "abortTransaction", + "databaseName": "admin" } } ] From 688d46c0f12ecdebeba4c727764d874d96e5e389 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Wed, 4 Mar 2026 08:02:36 -0800 Subject: [PATCH 2/2] Initialize _retry_policy before encryption init --- pymongo/asynchronous/mongo_client.py | 7 ++++--- pymongo/synchronous/mongo_client.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pymongo/asynchronous/mongo_client.py b/pymongo/asynchronous/mongo_client.py index a7ca7b0144..27d2544693 100644 --- a/pymongo/asynchronous/mongo_client.py +++ b/pymongo/asynchronous/mongo_client.py @@ -894,15 +894,16 @@ def __init__( self._options.read_concern, ) + self._retry_policy = _RetryPolicy( + _TokenBucket(), adaptive_retry=self._options.adaptive_retries + ) + self._init_based_on_options(self._seeds, srv_max_hosts, srv_service_name) self._opened = False self._closed = False self._loop: Optional[asyncio.AbstractEventLoop] = None - self._retry_policy = _RetryPolicy( - _TokenBucket(), adaptive_retry=self._options.adaptive_retries - ) if not is_srv: self._init_background() diff --git a/pymongo/synchronous/mongo_client.py b/pymongo/synchronous/mongo_client.py index 36f432c67d..12892e52ff 100644 --- a/pymongo/synchronous/mongo_client.py +++ b/pymongo/synchronous/mongo_client.py @@ -894,15 +894,16 @@ def __init__( self._options.read_concern, ) + self._retry_policy = _RetryPolicy( + _TokenBucket(), adaptive_retry=self._options.adaptive_retries + ) + self._init_based_on_options(self._seeds, srv_max_hosts, srv_service_name) self._opened = False self._closed = False self._loop: Optional[asyncio.AbstractEventLoop] = None - self._retry_policy = _RetryPolicy( - _TokenBucket(), adaptive_retry=self._options.adaptive_retries - ) if not is_srv: self._init_background()