@@ -1027,21 +1027,25 @@ def can_get_connection(self) -> bool:
1027
1027
)
1028
1028
1029
1029
async def get_connection (self , command_name , * keys , ** options ):
1030
- """Get a connection from the pool"""
1030
+ """Get a connected connection from the pool"""
1031
+ connection = self .get_available_connection ()
1032
+ try :
1033
+ await self .ensure_connection (connection )
1034
+ except BaseException :
1035
+ await self .release (connection )
1036
+ raise
1037
+
1038
+ return connection
1039
+
1040
+ def get_available_connection (self ):
1041
+ """Get a connection from the pool, without making sure it is connected"""
1031
1042
try :
1032
1043
connection = self ._available_connections .pop ()
1033
1044
except IndexError :
1034
1045
if len (self ._in_use_connections ) >= self .max_connections :
1035
1046
raise ConnectionError ("Too many connections" ) from None
1036
1047
connection = self .make_connection ()
1037
1048
self ._in_use_connections .add (connection )
1038
-
1039
- try :
1040
- await self .ensure_connection (connection )
1041
- except BaseException :
1042
- await self .release (connection )
1043
- raise
1044
-
1045
1049
return connection
1046
1050
1047
1051
def get_encoder (self ):
@@ -1166,13 +1170,21 @@ def __init__(
1166
1170
async def get_connection (self , command_name , * keys , ** options ):
1167
1171
"""Gets a connection from the pool, blocking until one is available"""
1168
1172
try :
1169
- async with async_timeout ( self .timeout ) :
1170
- async with self ._condition :
1173
+ async with self ._condition :
1174
+ async with async_timeout ( self .timeout ) :
1171
1175
await self ._condition .wait_for (self .can_get_connection )
1172
- return await super ().get_connection ( command_name , * keys , ** options )
1176
+ connection = super ().get_available_connection ( )
1173
1177
except asyncio .TimeoutError as err :
1174
1178
raise ConnectionError ("No connection available." ) from err
1175
1179
1180
+ # We now perform the connection check outside of the lock.
1181
+ try :
1182
+ await self .ensure_connection (connection )
1183
+ return connection
1184
+ except BaseException :
1185
+ await self .release (connection )
1186
+ raise
1187
+
1176
1188
async def release (self , connection : AbstractConnection ):
1177
1189
"""Releases the connection back to the pool."""
1178
1190
async with self ._condition :
0 commit comments