@@ -324,28 +324,33 @@ def get_socket(self, pair=None, force=False):
324
324
elif not self ._socket_semaphore .acquire (True , self .wait_queue_timeout ):
325
325
self ._raise_wait_queue_timeout ()
326
326
327
- sock_info , from_pool = None , None
327
+ # We've now acquired the semaphore and must release it on error.
328
328
try :
329
+ sock_info , from_pool = None , None
329
330
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
349
354
350
355
sock_info .last_checkout = time .time ()
351
356
return sock_info
0 commit comments