From f5d9e36449443e8ecaeab9392cbbc2b1c419a173 Mon Sep 17 00:00:00 2001 From: Iris Date: Mon, 21 Sep 2026 10:34:30 -0700 Subject: [PATCH 1/2] PYTHON-6117 Remove cyclic object reference between _ClientReadCheckout and _PoolCheckout --- pymongo/asynchronous/mongo_client.py | 1 + pymongo/synchronous/mongo_client.py | 1 + 2 files changed, 2 insertions(+) diff --git a/pymongo/asynchronous/mongo_client.py b/pymongo/asynchronous/mongo_client.py index e347e1de56..f28b590fcf 100644 --- a/pymongo/asynchronous/mongo_client.py +++ b/pymongo/asynchronous/mongo_client.py @@ -2754,6 +2754,7 @@ async def __aexit__( finally: if self._pool_checkout is not None: await self._pool_checkout.__aexit__(exc_type, exc_val, exc_tb) + self._pool_checkout = None # to break the reference cycle @classmethod def for_existing_conn( diff --git a/pymongo/synchronous/mongo_client.py b/pymongo/synchronous/mongo_client.py index 71ba6dd181..7899999e97 100644 --- a/pymongo/synchronous/mongo_client.py +++ b/pymongo/synchronous/mongo_client.py @@ -2743,6 +2743,7 @@ def __exit__( finally: if self._pool_checkout is not None: self._pool_checkout.__exit__(exc_type, exc_val, exc_tb) + self._pool_checkout = None # to break the reference cycle @classmethod def for_existing_conn( From b609de251550b4d6e1c3639ee8edd24c49d855f9 Mon Sep 17 00:00:00 2001 From: Iris Date: Mon, 21 Sep 2026 13:21:05 -0700 Subject: [PATCH 2/2] copilot feedback --- 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 f28b590fcf..a0f1397a4d 100644 --- a/pymongo/asynchronous/mongo_client.py +++ b/pymongo/asynchronous/mongo_client.py @@ -2752,9 +2752,10 @@ async def __aexit__( try: await self.handle(exc_type, exc_val) finally: - if self._pool_checkout is not None: - await self._pool_checkout.__aexit__(exc_type, exc_val, exc_tb) - self._pool_checkout = None # to break the reference cycle + pool_checkout = self._pool_checkout + self._pool_checkout = None # to break the reference cycle before cleanup can raise + if pool_checkout is not None: + await pool_checkout.__aexit__(exc_type, exc_val, exc_tb) @classmethod def for_existing_conn( diff --git a/pymongo/synchronous/mongo_client.py b/pymongo/synchronous/mongo_client.py index 7899999e97..574fbc00de 100644 --- a/pymongo/synchronous/mongo_client.py +++ b/pymongo/synchronous/mongo_client.py @@ -2741,9 +2741,10 @@ def __exit__( try: self.handle(exc_type, exc_val) finally: - if self._pool_checkout is not None: - self._pool_checkout.__exit__(exc_type, exc_val, exc_tb) - self._pool_checkout = None # to break the reference cycle + pool_checkout = self._pool_checkout + self._pool_checkout = None # to break the reference cycle before cleanup can raise + if pool_checkout is not None: + pool_checkout.__exit__(exc_type, exc_val, exc_tb) @classmethod def for_existing_conn(