Skip to content

Commit dc3b2f7

Browse files
author
Mike Dirolf
committed
some more tests and a fix for issue where multiple connection instances were sharing a connection pool
1 parent de18648 commit dc3b2f7

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

pymongo/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ class Pool(threading.local):
6868

6969
# Non thread-locals
7070
__slots__ = ["sockets", "socket_factory"]
71-
sockets = []
72-
7371
sock = None
7472

7573
def __init__(self, socket_factory):
7674
self.socket_factory = socket_factory
75+
if not hasattr(self, "sockets"):
76+
self.sockets = []
7777

7878
def socket(self):
7979
# we store the pid here to avoid issues with fork /

test/test_pooling.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import sys
2222
sys.path[0:0] = [""]
2323

24+
from pymongo.connection import Pool
2425
from test_connection import get_connection
2526

2627
N = 50
@@ -93,6 +94,21 @@ def run_cases(ut, cases):
9394
for t in threads:
9495
t.join()
9596

97+
98+
class OneOp(threading.Thread):
99+
100+
def __init__(self, connection):
101+
threading.Thread.__init__(self)
102+
self.c = connection
103+
104+
def run(self):
105+
assert len(self.c._Connection__pool.sockets) == 1
106+
self.c.test.test.find_one()
107+
assert len(self.c._Connection__pool.sockets) == 0
108+
self.c.end_request()
109+
assert len(self.c._Connection__pool.sockets) == 1
110+
111+
96112
class TestPooling(unittest.TestCase):
97113

98114
def setUp(self):
@@ -109,6 +125,33 @@ def test_no_disconnect(self):
109125
def test_disconnect(self):
110126
run_cases(self, [SaveAndFind, Disconnect, Unique])
111127

128+
def test_independent_pools(self):
129+
p = Pool(None)
130+
self.assertEqual([], p.sockets)
131+
self.c.end_request()
132+
self.assertEqual([], p.sockets)
133+
134+
# Sensical values aren't really important here
135+
p1 = Pool(5)
136+
self.assertEqual(None, p.socket_factory)
137+
self.assertEqual(5, p1.socket_factory)
138+
139+
def test_dependent_pools(self):
140+
c = get_connection()
141+
self.assertEqual(0, len(c._Connection__pool.sockets))
142+
c.test.test.find_one()
143+
self.assertEqual(0, len(c._Connection__pool.sockets))
144+
c.end_request()
145+
self.assertEqual(1, len(c._Connection__pool.sockets))
146+
147+
t = OneOp(c)
148+
t.start()
149+
t.join()
150+
151+
self.assertEqual(1, len(c._Connection__pool.sockets))
152+
c.test.test.find_one()
153+
self.assertEqual(0, len(c._Connection__pool.sockets))
154+
112155

113156
if __name__ == "__main__":
114157
unittest.main()

0 commit comments

Comments
 (0)