diff --git a/src/operations/execute_operation.ts b/src/operations/execute_operation.ts index a3e9f3d139a..687f7998eb6 100644 --- a/src/operations/execute_operation.ts +++ b/src/operations/execute_operation.ts @@ -226,25 +226,23 @@ function executeWithServerSelection( } // select a new server, and attempt to retry the operation - setTimeout(() => { - topology.selectServer(selector, serverSelectionOptions, (error?: Error, server?: Server) => { - if (!error && isWriteOperation && !supportsRetryableWrites(server)) { - return callback( - new MongoUnexpectedServerResponseError( - 'Selected server does not support retryable writes' - ) - ); - } + topology.selectServer(selector, serverSelectionOptions, (error?: Error, server?: Server) => { + if (!error && isWriteOperation && !supportsRetryableWrites(server)) { + return callback( + new MongoUnexpectedServerResponseError( + 'Selected server does not support retryable writes' + ) + ); + } - if (error || !server) { - return callback( - error ?? new MongoUnexpectedServerResponseError('Server selection failed without error') - ); - } + if (error || !server) { + return callback( + error ?? new MongoUnexpectedServerResponseError('Server selection failed without error') + ); + } - operation.execute(server, session, callback); - }); - }, 1); + operation.execute(server, session, callback); + }); } if ( diff --git a/src/sdam/server.ts b/src/sdam/server.ts index dd8767bc700..0d4cd90be30 100644 --- a/src/sdam/server.ts +++ b/src/sdam/server.ts @@ -499,9 +499,10 @@ function makeOperationHandler( // In load balanced mode we never mark the server as unknown and always // clear for the specific service id. - server.s.pool.clear(connection.serviceId); if (!server.loadBalanced) { markServerUnknown(server, error); + } else { + server.s.pool.clear(connection.serviceId); } } } else { @@ -516,7 +517,9 @@ function makeOperationHandler( if (isSDAMUnrecoverableError(error)) { if (shouldHandleStateChangeError(server, error)) { if (maxWireVersion(server) <= 7 || isNodeShuttingDownError(error)) { - server.s.pool.clear(connection.serviceId); + if (server.loadBalanced) { + server.s.pool.clear(connection.serviceId); + } } if (!server.loadBalanced) { diff --git a/src/sdam/topology.ts b/src/sdam/topology.ts index 97c56530ddb..82c87eff32b 100644 --- a/src/sdam/topology.ts +++ b/src/sdam/topology.ts @@ -813,12 +813,17 @@ function updateServers(topology: Topology, incomingServerDescription?: ServerDes if (incomingServerDescription && topology.s.servers.has(incomingServerDescription.address)) { const server = topology.s.servers.get(incomingServerDescription.address); if (server) { + server.s.description = incomingServerDescription; + if (incomingServerDescription.error) { + server.s.pool.clear(); + return; + } + const newTopologyType = topology.s.description.type; const shouldMarkPoolReady = incomingServerDescription.isDataBearing || (incomingServerDescription.type !== ServerType.Unknown && newTopologyType === TopologyType.Single); - server.s.description = incomingServerDescription; if (shouldMarkPoolReady) { server.s.pool.ready(); }