From 5b4b7f93b668e381691425b03071ee2827de96ca Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Thu, 11 Jun 2026 12:07:36 -0400 Subject: [PATCH] PYTHON-5821 - Fix ordering issue between event publish and logging for connection creation and ready --- pymongo/asynchronous/pool.py | 14 ++++++++------ pymongo/synchronous/pool.py | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/pymongo/asynchronous/pool.py b/pymongo/asynchronous/pool.py index 475f4bfa99..309c78f043 100644 --- a/pymongo/asynchronous/pool.py +++ b/pymongo/asynchronous/pool.py @@ -509,9 +509,7 @@ async def authenticate(self, reauthenticate: bool = False) -> None: await auth.authenticate(creds, self, reauthenticate=reauthenticate) self.ready = True duration = time.monotonic() - self.creation_time - if self.enabled_for_cmap: - assert self.listeners is not None - self.listeners.publish_connection_ready(self.address, self.id, duration) + # Log before publishing event to prevent potential listener preemption in tests if self.enabled_for_logging and _CONNECTION_LOGGER.isEnabledFor(logging.DEBUG): _debug_log( _CONNECTION_LOGGER, @@ -522,6 +520,9 @@ async def authenticate(self, reauthenticate: bool = False) -> None: driverConnectionId=self.id, durationMS=duration, ) + if self.enabled_for_cmap: + assert self.listeners is not None + self.listeners.publish_connection_ready(self.address, self.id, duration) def validate_session( self, client: Optional[AsyncMongoClient[Any]], session: Optional[AsyncClientSession] @@ -1026,9 +1027,7 @@ async def connect(self, handler: Optional[_MongoClientErrorHandler] = None) -> A self.active_contexts.add(tmp_context) listeners = self.opts._event_listeners - if self.enabled_for_cmap: - assert listeners is not None - listeners.publish_connection_created(self.address, conn_id) + # Log before publishing event to prevent potential listener preemption in tests if self.enabled_for_logging and _CONNECTION_LOGGER.isEnabledFor(logging.DEBUG): _debug_log( _CONNECTION_LOGGER, @@ -1038,6 +1037,9 @@ async def connect(self, handler: Optional[_MongoClientErrorHandler] = None) -> A serverPort=self.address[1], driverConnectionId=conn_id, ) + if self.enabled_for_cmap: + assert listeners is not None + listeners.publish_connection_created(self.address, conn_id) try: networking_interface = await _configured_protocol_interface(self.address, self.opts) diff --git a/pymongo/synchronous/pool.py b/pymongo/synchronous/pool.py index 938eca42bd..1b16e35cbc 100644 --- a/pymongo/synchronous/pool.py +++ b/pymongo/synchronous/pool.py @@ -509,9 +509,7 @@ def authenticate(self, reauthenticate: bool = False) -> None: auth.authenticate(creds, self, reauthenticate=reauthenticate) self.ready = True duration = time.monotonic() - self.creation_time - if self.enabled_for_cmap: - assert self.listeners is not None - self.listeners.publish_connection_ready(self.address, self.id, duration) + # Log before publishing event to prevent potential listener preemption in tests if self.enabled_for_logging and _CONNECTION_LOGGER.isEnabledFor(logging.DEBUG): _debug_log( _CONNECTION_LOGGER, @@ -522,6 +520,9 @@ def authenticate(self, reauthenticate: bool = False) -> None: driverConnectionId=self.id, durationMS=duration, ) + if self.enabled_for_cmap: + assert self.listeners is not None + self.listeners.publish_connection_ready(self.address, self.id, duration) def validate_session( self, client: Optional[MongoClient[Any]], session: Optional[ClientSession] @@ -1022,9 +1023,7 @@ def connect(self, handler: Optional[_MongoClientErrorHandler] = None) -> Connect self.active_contexts.add(tmp_context) listeners = self.opts._event_listeners - if self.enabled_for_cmap: - assert listeners is not None - listeners.publish_connection_created(self.address, conn_id) + # Log before publishing event to prevent potential listener preemption in tests if self.enabled_for_logging and _CONNECTION_LOGGER.isEnabledFor(logging.DEBUG): _debug_log( _CONNECTION_LOGGER, @@ -1034,6 +1033,9 @@ def connect(self, handler: Optional[_MongoClientErrorHandler] = None) -> Connect serverPort=self.address[1], driverConnectionId=conn_id, ) + if self.enabled_for_cmap: + assert listeners is not None + listeners.publish_connection_created(self.address, conn_id) try: networking_interface = _configured_socket_interface(self.address, self.opts)