From 134d1a6d9ed651348976e8b3d84f8f4b85ae7e65 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 15 Aug 2025 13:33:21 -0500 Subject: [PATCH 1/5] test against PYTHON-5498 branch --- .evergreen/scripts/configure-env.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.evergreen/scripts/configure-env.sh b/.evergreen/scripts/configure-env.sh index 8dc328aab3..4331fb8af4 100755 --- a/.evergreen/scripts/configure-env.sh +++ b/.evergreen/scripts/configure-env.sh @@ -76,6 +76,8 @@ EOT rm -rf $DRIVERS_TOOLS BRANCH=master ORG=mongodb-labs +BRANCH=PYTHON-5498 +ORG=blink1073 git clone --branch $BRANCH https://github.com/$ORG/drivers-evergreen-tools.git $DRIVERS_TOOLS cat < ${DRIVERS_TOOLS}/.env From 98779c0831d29b5187ab16533523f632911dc16c Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 15 Aug 2025 15:29:15 -0500 Subject: [PATCH 2/5] try disabling c ext --- .evergreen/scripts/configure-env.sh | 2 -- .evergreen/scripts/kms_tester.py | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.evergreen/scripts/configure-env.sh b/.evergreen/scripts/configure-env.sh index 4331fb8af4..8dc328aab3 100755 --- a/.evergreen/scripts/configure-env.sh +++ b/.evergreen/scripts/configure-env.sh @@ -76,8 +76,6 @@ EOT rm -rf $DRIVERS_TOOLS BRANCH=master ORG=mongodb-labs -BRANCH=PYTHON-5498 -ORG=blink1073 git clone --branch $BRANCH https://github.com/$ORG/drivers-evergreen-tools.git $DRIVERS_TOOLS cat < ${DRIVERS_TOOLS}/.env diff --git a/.evergreen/scripts/kms_tester.py b/.evergreen/scripts/kms_tester.py index 40fd65919d..b504d1a81f 100644 --- a/.evergreen/scripts/kms_tester.py +++ b/.evergreen/scripts/kms_tester.py @@ -80,8 +80,10 @@ def setup_kms(sub_test_name: str) -> None: write_env("SUCCESS", success) - # For remote tests, there is no further work required. + # For remote tests, there is no further work required, other than to disable C extensions + # because the VM doesn't necessarily have the ability to build them. if sub_test_type == "remote": + write_env("NO_EXT") return if sub_test_target == "azure": From 3ec69d3a1b6e67f86b08b7c36b5efa64529af048 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 15 Aug 2025 15:38:30 -0500 Subject: [PATCH 3/5] update kms tester --- .evergreen/scripts/kms_tester.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.evergreen/scripts/kms_tester.py b/.evergreen/scripts/kms_tester.py index b504d1a81f..f0438e4eef 100644 --- a/.evergreen/scripts/kms_tester.py +++ b/.evergreen/scripts/kms_tester.py @@ -30,7 +30,7 @@ def _setup_azure_vm(base_env: dict[str, str]) -> None: env["AZUREKMS_CMD"] = "tar xf mongo-python-driver.tgz" run_command(f"{azure_dir}/run-command.sh", env=env) - env["AZUREKMS_CMD"] = "bash .evergreen/just.sh setup-tests kms azure-remote" + env["AZUREKMS_CMD"] = "NO_EXT=1 bash .evergreen/just.sh setup-tests kms azure-remote" run_command(f"{azure_dir}/run-command.sh", env=env) LOGGER.info("Setting up Azure VM... done.") @@ -47,7 +47,7 @@ def _setup_gcp_vm(base_env: dict[str, str]) -> None: env["GCPKMS_CMD"] = "tar xf mongo-python-driver.tgz" run_command(f"{gcp_dir}/run-command.sh", env=env) - env["GCPKMS_CMD"] = "bash ./.evergreen/just.sh setup-tests kms gcp-remote" + env["GCPKMS_CMD"] = "NO_EXT=1 bash ./.evergreen/just.sh setup-tests kms gcp-remote" run_command(f"{gcp_dir}/run-command.sh", env=env) LOGGER.info("Setting up GCP VM...") @@ -80,10 +80,8 @@ def setup_kms(sub_test_name: str) -> None: write_env("SUCCESS", success) - # For remote tests, there is no further work required, other than to disable C extensions - # because the VM doesn't necessarily have the ability to build them. + # For remote tests, there is no further work required. if sub_test_type == "remote": - write_env("NO_EXT") return if sub_test_target == "azure": From 023c86135af2e2b36f99f5129e098e7c1520d410 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 15 Aug 2025 17:49:40 -0500 Subject: [PATCH 4/5] append details to MaxTimeMSExpired responses --- pymongo/asynchronous/server.py | 5 +++++ pymongo/synchronous/server.py | 5 +++++ test/asynchronous/test_pooling.py | 1 - test/test_pooling.py | 1 - 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pymongo/asynchronous/server.py b/pymongo/asynchronous/server.py index 0f8565f6cc..f21c86a9fd 100644 --- a/pymongo/asynchronous/server.py +++ b/pymongo/asynchronous/server.py @@ -38,6 +38,7 @@ _SDAMStatusMessage, ) from pymongo.message import _convert_exception, _GetMore, _OpMsg, _Query +from pymongo.pool_shared import _get_timeout_details, format_timeout_details from pymongo.response import PinnedResponse, Response if TYPE_CHECKING: @@ -224,6 +225,10 @@ async def run_operation( if use_cmd: first = docs[0] await operation.client._process_response(first, operation.session) # type: ignore[misc, arg-type] + # Append timeout details to MaxTimeMSExpired responses. + if first.get("code") == 50: + timeout_details = _get_timeout_details(conn.opts) + first["errmsg"] += format_timeout_details(timeout_details) _check_command_response(first, conn.max_wire_version) except Exception as exc: duration = datetime.now() - start diff --git a/pymongo/synchronous/server.py b/pymongo/synchronous/server.py index a85f1b0db7..bf02ea5c48 100644 --- a/pymongo/synchronous/server.py +++ b/pymongo/synchronous/server.py @@ -37,6 +37,7 @@ _SDAMStatusMessage, ) from pymongo.message import _convert_exception, _GetMore, _OpMsg, _Query +from pymongo.pool_shared import _get_timeout_details, format_timeout_details from pymongo.response import PinnedResponse, Response from pymongo.synchronous.helpers import _handle_reauth @@ -224,6 +225,10 @@ def run_operation( if use_cmd: first = docs[0] operation.client._process_response(first, operation.session) # type: ignore[misc, arg-type] + # Append timeout details to MaxTimeMSExpired responses. + if first.get("code") == 50: + timeout_details = _get_timeout_details(conn.opts) + first["errmsg"] += format_timeout_details(timeout_details) _check_command_response(first, conn.max_wire_version) except Exception as exc: duration = datetime.now() - start diff --git a/test/asynchronous/test_pooling.py b/test/asynchronous/test_pooling.py index cbf6d336bd..3193d9e3d5 100644 --- a/test/asynchronous/test_pooling.py +++ b/test/asynchronous/test_pooling.py @@ -429,7 +429,6 @@ async def find_one(): # maxConnecting = unbounded: 30+ connections in ~0.140+ seconds print(len(pool.conns)) - @flaky(reason="PYTHON-5492") @async_client_context.require_failCommand_appName async def test_csot_timeout_message(self): client = await self.async_rs_or_single_client(appName="connectionTimeoutApp") diff --git a/test/test_pooling.py b/test/test_pooling.py index 5ce4284e33..cb5b206996 100644 --- a/test/test_pooling.py +++ b/test/test_pooling.py @@ -429,7 +429,6 @@ def find_one(): # maxConnecting = unbounded: 30+ connections in ~0.140+ seconds print(len(pool.conns)) - @flaky(reason="PYTHON-5492") @client_context.require_failCommand_appName def test_csot_timeout_message(self): client = self.rs_or_single_client(appName="connectionTimeoutApp") From 18a5cecc6c279c2eeee021d63dc3c675b555fdf9 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 15 Aug 2025 17:51:27 -0500 Subject: [PATCH 5/5] Revert "append details to MaxTimeMSExpired responses" This reverts commit 023c86135af2e2b36f99f5129e098e7c1520d410. --- pymongo/asynchronous/server.py | 5 ----- pymongo/synchronous/server.py | 5 ----- test/asynchronous/test_pooling.py | 1 + test/test_pooling.py | 1 + 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/pymongo/asynchronous/server.py b/pymongo/asynchronous/server.py index f21c86a9fd..0f8565f6cc 100644 --- a/pymongo/asynchronous/server.py +++ b/pymongo/asynchronous/server.py @@ -38,7 +38,6 @@ _SDAMStatusMessage, ) from pymongo.message import _convert_exception, _GetMore, _OpMsg, _Query -from pymongo.pool_shared import _get_timeout_details, format_timeout_details from pymongo.response import PinnedResponse, Response if TYPE_CHECKING: @@ -225,10 +224,6 @@ async def run_operation( if use_cmd: first = docs[0] await operation.client._process_response(first, operation.session) # type: ignore[misc, arg-type] - # Append timeout details to MaxTimeMSExpired responses. - if first.get("code") == 50: - timeout_details = _get_timeout_details(conn.opts) - first["errmsg"] += format_timeout_details(timeout_details) _check_command_response(first, conn.max_wire_version) except Exception as exc: duration = datetime.now() - start diff --git a/pymongo/synchronous/server.py b/pymongo/synchronous/server.py index bf02ea5c48..a85f1b0db7 100644 --- a/pymongo/synchronous/server.py +++ b/pymongo/synchronous/server.py @@ -37,7 +37,6 @@ _SDAMStatusMessage, ) from pymongo.message import _convert_exception, _GetMore, _OpMsg, _Query -from pymongo.pool_shared import _get_timeout_details, format_timeout_details from pymongo.response import PinnedResponse, Response from pymongo.synchronous.helpers import _handle_reauth @@ -225,10 +224,6 @@ def run_operation( if use_cmd: first = docs[0] operation.client._process_response(first, operation.session) # type: ignore[misc, arg-type] - # Append timeout details to MaxTimeMSExpired responses. - if first.get("code") == 50: - timeout_details = _get_timeout_details(conn.opts) - first["errmsg"] += format_timeout_details(timeout_details) _check_command_response(first, conn.max_wire_version) except Exception as exc: duration = datetime.now() - start diff --git a/test/asynchronous/test_pooling.py b/test/asynchronous/test_pooling.py index 3193d9e3d5..cbf6d336bd 100644 --- a/test/asynchronous/test_pooling.py +++ b/test/asynchronous/test_pooling.py @@ -429,6 +429,7 @@ async def find_one(): # maxConnecting = unbounded: 30+ connections in ~0.140+ seconds print(len(pool.conns)) + @flaky(reason="PYTHON-5492") @async_client_context.require_failCommand_appName async def test_csot_timeout_message(self): client = await self.async_rs_or_single_client(appName="connectionTimeoutApp") diff --git a/test/test_pooling.py b/test/test_pooling.py index cb5b206996..5ce4284e33 100644 --- a/test/test_pooling.py +++ b/test/test_pooling.py @@ -429,6 +429,7 @@ def find_one(): # maxConnecting = unbounded: 30+ connections in ~0.140+ seconds print(len(pool.conns)) + @flaky(reason="PYTHON-5492") @client_context.require_failCommand_appName def test_csot_timeout_message(self): client = self.rs_or_single_client(appName="connectionTimeoutApp")