@@ -268,6 +268,7 @@ async def select_servers(
268268 server_selection_timeout : Optional [float ] = None ,
269269 address : Optional [_Address ] = None ,
270270 operation_id : Optional [int ] = None ,
271+ deprioritized_servers : Optional [list [Server ]] = None ,
271272 ) -> list [Server ]:
272273 """Return a list of Servers matching selector, or time out.
273274
@@ -295,7 +296,12 @@ async def select_servers(
295296
296297 async with self ._lock :
297298 server_descriptions = await self ._select_servers_loop (
298- selector , server_timeout , operation , operation_id , address
299+ selector ,
300+ server_timeout ,
301+ operation ,
302+ operation_id ,
303+ address ,
304+ deprioritized_servers = deprioritized_servers ,
299305 )
300306
301307 return [
@@ -309,6 +315,7 @@ async def _select_servers_loop(
309315 operation : str ,
310316 operation_id : Optional [int ],
311317 address : Optional [_Address ],
318+ deprioritized_servers : Optional [list [Server ]] = None ,
312319 ) -> list [ServerDescription ]:
313320 """select_servers() guts. Hold the lock when calling this."""
314321 now = time .monotonic ()
@@ -327,7 +334,12 @@ async def _select_servers_loop(
327334 )
328335
329336 server_descriptions = self ._description .apply_selector (
330- selector , address , custom_selector = self ._settings .server_selector
337+ selector ,
338+ address ,
339+ custom_selector = self ._settings .server_selector ,
340+ deprioritized_servers = [server .description for server in deprioritized_servers ]
341+ if deprioritized_servers
342+ else None ,
331343 )
332344
333345 while not server_descriptions :
@@ -388,9 +400,13 @@ async def _select_server(
388400 operation_id : Optional [int ] = None ,
389401 ) -> Server :
390402 servers = await self .select_servers (
391- selector , operation , server_selection_timeout , address , operation_id
403+ selector ,
404+ operation ,
405+ server_selection_timeout ,
406+ address ,
407+ operation_id ,
408+ deprioritized_servers ,
392409 )
393- servers = _filter_servers (servers , deprioritized_servers )
394410 if len (servers ) == 1 :
395411 return servers [0 ]
396412 server1 , server2 = random .sample (servers , 2 )
@@ -1119,16 +1135,3 @@ def _is_stale_server_description(current_sd: ServerDescription, new_sd: ServerDe
11191135 if current_tv ["processId" ] != new_tv ["processId" ]:
11201136 return False
11211137 return current_tv ["counter" ] > new_tv ["counter" ]
1122-
1123-
1124- def _filter_servers (
1125- candidates : list [Server ], deprioritized_servers : Optional [list [Server ]] = None
1126- ) -> list [Server ]:
1127- """Filter out deprioritized servers from a list of server candidates."""
1128- if not deprioritized_servers :
1129- return candidates
1130-
1131- filtered = [server for server in candidates if server not in deprioritized_servers ]
1132-
1133- # If not possible to pick a prioritized server, return the original list
1134- return filtered or candidates
0 commit comments