Skip to content

Commit dc73514

Browse files
PYTHON-5202 WaitQueueTimeoutError should not clear the pool (#2192) [v4.11] (#2196)
Co-authored-by: Shane Harvey <[email protected]>
1 parent 112e29b commit dc73514

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

Diff for: pymongo/asynchronous/topology.py

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
OperationFailure,
4141
PyMongoError,
4242
ServerSelectionTimeoutError,
43+
WaitQueueTimeoutError,
4344
WriteError,
4445
)
4546
from pymongo.hello import Hello
@@ -877,6 +878,8 @@ async def _handle_error(self, address: _Address, err_ctx: _ErrorContext) -> None
877878
# Clear the pool.
878879
await server.reset(service_id)
879880
elif isinstance(error, ConnectionFailure):
881+
if isinstance(error, WaitQueueTimeoutError):
882+
return
880883
# "Client MUST replace the server's description with type Unknown
881884
# ... MUST NOT request an immediate check of the server."
882885
if not self._settings.load_balanced:

Diff for: pymongo/synchronous/topology.py

+3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
OperationFailure,
3737
PyMongoError,
3838
ServerSelectionTimeoutError,
39+
WaitQueueTimeoutError,
3940
WriteError,
4041
)
4142
from pymongo.hello import Hello
@@ -875,6 +876,8 @@ def _handle_error(self, address: _Address, err_ctx: _ErrorContext) -> None:
875876
# Clear the pool.
876877
server.reset(service_id)
877878
elif isinstance(error, ConnectionFailure):
879+
if isinstance(error, WaitQueueTimeoutError):
880+
return
878881
# "Client MUST replace the server's description with type Unknown
879882
# ... MUST NOT request an immediate check of the server."
880883
if not self._settings.load_balanced:

Diff for: test/asynchronous/test_client.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
NetworkTimeout,
112112
OperationFailure,
113113
ServerSelectionTimeoutError,
114+
WaitQueueTimeoutError,
114115
WriteConcernError,
115116
)
116117
from pymongo.monitoring import ServerHeartbeatListener, ServerHeartbeatStartedEvent
@@ -1311,8 +1312,16 @@ async def test_server_selection_timeout(self):
13111312
self.assertAlmostEqual(30, client.options.server_selection_timeout)
13121313

13131314
async def test_waitQueueTimeoutMS(self):
1314-
client = await self.async_rs_or_single_client(waitQueueTimeoutMS=2000)
1315-
self.assertEqual((await async_get_pool(client)).opts.wait_queue_timeout, 2)
1315+
listener = CMAPListener()
1316+
client = await self.async_rs_or_single_client(
1317+
waitQueueTimeoutMS=10, maxPoolSize=1, event_listeners=[listener]
1318+
)
1319+
pool = await async_get_pool(client)
1320+
self.assertEqual(pool.opts.wait_queue_timeout, 0.01)
1321+
async with pool.checkout():
1322+
with self.assertRaises(WaitQueueTimeoutError):
1323+
await client.test.command("ping")
1324+
self.assertFalse(listener.events_by_type(monitoring.PoolClearedEvent))
13161325

13171326
async def test_socketKeepAlive(self):
13181327
pool = await async_get_pool(self.client)

Diff for: test/test_client.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
NetworkTimeout,
101101
OperationFailure,
102102
ServerSelectionTimeoutError,
103+
WaitQueueTimeoutError,
103104
WriteConcernError,
104105
)
105106
from pymongo.monitoring import ServerHeartbeatListener, ServerHeartbeatStartedEvent
@@ -1270,8 +1271,16 @@ def test_server_selection_timeout(self):
12701271
self.assertAlmostEqual(30, client.options.server_selection_timeout)
12711272

12721273
def test_waitQueueTimeoutMS(self):
1273-
client = self.rs_or_single_client(waitQueueTimeoutMS=2000)
1274-
self.assertEqual((get_pool(client)).opts.wait_queue_timeout, 2)
1274+
listener = CMAPListener()
1275+
client = self.rs_or_single_client(
1276+
waitQueueTimeoutMS=10, maxPoolSize=1, event_listeners=[listener]
1277+
)
1278+
pool = get_pool(client)
1279+
self.assertEqual(pool.opts.wait_queue_timeout, 0.01)
1280+
with pool.checkout():
1281+
with self.assertRaises(WaitQueueTimeoutError):
1282+
client.test.command("ping")
1283+
self.assertFalse(listener.events_by_type(monitoring.PoolClearedEvent))
12751284

12761285
def test_socketKeepAlive(self):
12771286
pool = get_pool(self.client)

0 commit comments

Comments
 (0)