Skip to content

Commit 3db63c4

Browse files
committed
Pool must release its semaphore on connection failure. PYTHON-580
1 parent a633a41 commit 3db63c4

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

pymongo/pool.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -324,28 +324,33 @@ def get_socket(self, pair=None, force=False):
324324
elif not self._socket_semaphore.acquire(True, self.wait_queue_timeout):
325325
self._raise_wait_queue_timeout()
326326

327-
sock_info, from_pool = None, None
327+
# We've now acquired the semaphore and must release it on error.
328328
try:
329+
sock_info, from_pool = None, None
329330
try:
330-
# set.pop() isn't atomic in Jython less than 2.7, see
331-
# http://bugs.jython.org/issue1854
332-
self.lock.acquire()
333-
sock_info, from_pool = self.sockets.pop(), True
334-
finally:
335-
self.lock.release()
336-
except KeyError:
337-
sock_info, from_pool = self.connect(pair), False
338-
339-
if from_pool:
340-
sock_info = self._check(sock_info, pair)
341-
342-
sock_info.forced = forced
343-
344-
if req_state == NO_SOCKET_YET:
345-
# start_request has been called but we haven't assigned a socket to
346-
# the request yet. Let's use this socket for this request until
347-
# end_request.
348-
self._set_request_state(sock_info)
331+
try:
332+
# set.pop() isn't atomic in Jython less than 2.7, see
333+
# http://bugs.jython.org/issue1854
334+
self.lock.acquire()
335+
sock_info, from_pool = self.sockets.pop(), True
336+
finally:
337+
self.lock.release()
338+
except KeyError:
339+
sock_info, from_pool = self.connect(pair), False
340+
341+
if from_pool:
342+
sock_info = self._check(sock_info, pair)
343+
344+
sock_info.forced = forced
345+
346+
if req_state == NO_SOCKET_YET:
347+
# start_request has been called but we haven't assigned a
348+
# socket to the request yet. Let's use this socket for this
349+
# request until end_request.
350+
self._set_request_state(sock_info)
351+
except:
352+
self._socket_semaphore.release()
353+
raise
349354

350355
sock_info.last_checkout = time.time()
351356
return sock_info

0 commit comments

Comments
 (0)