Skip to content

Commit 5a1dd76

Browse files
committed
PYTHON-2462 Fix test_threads.TestThreads.test_client_disconnect
test_client_disconnect (test.test_threads.TestThreads) ... Exception in thread Thread-1: Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner self.run() File "/Users/shane/git/mongo-python-driver/test/test_threads.py", line 61, in run for document in self.collection.find(): File "/Users/shane/git/mongo-python-driver/pymongo/cursor.py", line 1207, in next if len(self.__data) or self._refresh(): File "/Users/shane/git/mongo-python-driver/pymongo/cursor.py", line 1144, in _refresh self.__send_message(g) File "/Users/shane/git/mongo-python-driver/pymongo/cursor.py", line 1001, in __send_message address=self.__address) File "/Users/shane/git/mongo-python-driver/pymongo/mongo_client.py", line 1372, in _run_operation_with_response exhaust=exhaust) File "/Users/shane/git/mongo-python-driver/pymongo/mongo_client.py", line 1465, in _retryable_read exhaust=exhaust) as (sock_info, File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 112, in __enter__ return next(self.gen) File "/Users/shane/git/mongo-python-driver/pymongo/mongo_client.py", line 1309, in _slaveok_for_server with self._get_socket(server, session, exhaust=exhaust) as sock_info: File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 112, in __enter__ return next(self.gen) File "/Users/shane/git/mongo-python-driver/pymongo/mongo_client.py", line 1247, in _get_socket self.__all_credentials, checkout=exhaust) as sock_info: File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 112, in __enter__ return next(self.gen) File "/Users/shane/git/mongo-python-driver/pymongo/pool.py", line 1320, in get_socket sock_info = self._get_socket(all_credentials) File "/Users/shane/git/mongo-python-driver/pymongo/pool.py", line 1370, in _get_socket self._raise_if_not_ready() File "/Users/shane/git/mongo-python-driver/pymongo/pool.py", line 1342, in _raise_if_not_ready self.address, AutoReconnect('connection pool paused')) File "/Users/shane/git/mongo-python-driver/pymongo/pool.py", line 288, in _raise_connection_failure raise AutoReconnect(msg) pymongo.errors.AutoReconnect: localhost:27017: connection pool paused FAIL ====================================================================== FAIL: test_client_disconnect (test.test_threads.TestThreads) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/shane/git/mongo-python-driver/test/test_threads.py", line 203, in test_client_disconnect self.assertTrue(t.passed) AssertionError: False is not true
1 parent 7db31ba commit 5a1dd76

File tree

5 files changed

+56
-4
lines changed

5 files changed

+56
-4
lines changed

pymongo/pool.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,12 +1146,12 @@ def ready(self):
11461146
def closed(self):
11471147
return self.state == CLOSED
11481148

1149-
def _reset(self, close):
1149+
def _reset(self, close, pause=True):
11501150
old_state = self.state
11511151
with self.size_cond:
11521152
if self.closed:
11531153
return
1154-
if self.opts.pause_enabled:
1154+
if self.opts.pause_enabled and pause:
11551155
old_state, self.state = self.state, PAUSED
11561156
self.generation += 1
11571157
newpid = os.getpid()
@@ -1193,6 +1193,9 @@ def update_is_writable(self, is_writable):
11931193
def reset(self):
11941194
self._reset(close=False)
11951195

1196+
def reset_without_pause(self):
1197+
self._reset(close=False, pause=False)
1198+
11961199
def close(self):
11971200
self._reset(close=True)
11981201

pymongo/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def close(self):
6161
self._events.put((self._listener.publish_server_closed,
6262
(self._description.address, self._topology_id)))
6363
self._monitor.close()
64-
self._pool.reset()
64+
self._pool.reset_without_pause()
6565

6666
def request_check(self):
6767
"""Check the server's state soon."""

test/cmap/pool-clear-paused.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"version": 1,
3+
"style": "unit",
4+
"description": "clearing a paused pool emits no events",
5+
"operations": [
6+
{
7+
"name": "clear"
8+
},
9+
{
10+
"name": "ready"
11+
},
12+
{
13+
"name": "clear"
14+
},
15+
{
16+
"name": "clear"
17+
}
18+
],
19+
"events": [
20+
{
21+
"type": "ConnectionPoolReady",
22+
"address": 42
23+
},
24+
{
25+
"type": "ConnectionPoolCleared",
26+
"address": 42
27+
}
28+
],
29+
"ignore": [
30+
"ConnectionPoolCreated"
31+
]
32+
}

test/test_cmap.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
PoolClearedEvent,
4040
PoolClosedEvent)
4141
from pymongo.read_preferences import ReadPreference
42-
from pymongo.pool import _PoolClosedError
42+
from pymongo.pool import _PoolClosedError, READY
4343

4444
from test import (client_knobs,
4545
IntegrationTest,
@@ -412,6 +412,20 @@ def test_events_repr(self):
412412
self.assertRepr(PoolClearedEvent(host))
413413
self.assertRepr(PoolClosedEvent(host))
414414

415+
def test_close_leaves_pool_unpaused(self):
416+
# Needed until we implement PYTHON-2463. This test is related to
417+
# test_threads.TestThreads.test_client_disconnect
418+
listener = CMAPListener()
419+
client = single_client(event_listeners=[listener])
420+
client.admin.command('ping')
421+
pool = get_pool(client)
422+
client.close()
423+
self.assertEqual(1, listener.event_count(PoolClearedEvent))
424+
self.assertEqual(READY, pool.state)
425+
# Checking out a connection should succeed
426+
with pool.get_socket({}):
427+
pass
428+
415429

416430
def create_test(scenario_def, test, name):
417431
def run_scenario(self):

test/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ def ready(self):
258258
def reset(self):
259259
self._reset()
260260

261+
def reset_without_pause(self):
262+
self._reset()
263+
261264
def close(self):
262265
self._reset()
263266

0 commit comments

Comments
 (0)