@@ -1027,15 +1027,8 @@ 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"""
1031
- try :
1032
- connection = self ._available_connections .pop ()
1033
- except IndexError :
1034
- if len (self ._in_use_connections ) >= self .max_connections :
1035
- raise ConnectionError ("Too many connections" ) from None
1036
- connection = self .make_connection ()
1037
- self ._in_use_connections .add (connection )
1038
-
1030
+ """Get a connected connection from the pool"""
1031
+ connection = self .get_available_connection ()
1039
1032
try :
1040
1033
await self .ensure_connection (connection )
1041
1034
except BaseException :
@@ -1044,6 +1037,16 @@ async def get_connection(self, command_name, *keys, **options):
1044
1037
1045
1038
return connection
1046
1039
1040
+ def get_available_connection (self ):
1041
+ """Get a connection from the pool, without making sure it is connected"""
1042
+ try :
1043
+ connection = self ._available_connections .pop ()
1044
+ except IndexError :
1045
+ if len (self ._in_use_connections ) >= self .max_connections :
1046
+ raise ConnectionError ("Too many connections" ) from None
1047
+ connection = self .make_connection ()
1048
+ self ._in_use_connections .add (connection )
1049
+
1047
1050
def get_encoder (self ):
1048
1051
"""Return an encoder based on encoding settings"""
1049
1052
kwargs = self .connection_kwargs
@@ -1169,10 +1172,19 @@ async def get_connection(self, command_name, *keys, **options):
1169
1172
async with async_timeout (self .timeout ):
1170
1173
async with self ._condition :
1171
1174
await self ._condition .wait_for (self .can_get_connection )
1172
- return await super ().get_connection (command_name , * keys , ** options )
1175
+ connection = super ().get_available_connection ()
1176
+
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