@@ -265,7 +265,7 @@ def select_server_by_address(self, address,
265265 server_selection_timeout ,
266266 address )
267267
268- def _process_change (self , server_description ):
268+ def _process_change (self , server_description , reset_pool = False ):
269269 """Process a new ServerDescription on an opened topology.
270270
271271 Hold the lock when calling this.
@@ -303,10 +303,16 @@ def _process_change(self, server_description):
303303 SRV_POLLING_TOPOLOGIES ):
304304 self ._srv_monitor .close ()
305305
306+ # Clear the pool from a failed heartbeat.
307+ if reset_pool :
308+ server = self ._servers .get (server_description .address )
309+ if server :
310+ server .pool .reset ()
311+
306312 # Wake waiters in select_servers().
307313 self ._condition .notify_all ()
308314
309- def on_change (self , server_description ):
315+ def on_change (self , server_description , reset_pool = False ):
310316 """Process a new ServerDescription after an ismaster call completes."""
311317 # We do no I/O holding the lock.
312318 with self ._lock :
@@ -320,7 +326,7 @@ def on_change(self, server_description):
320326 # that didn't include this server.
321327 if (self ._opened and
322328 self ._description .has_server (server_description .address )):
323- self ._process_change (server_description )
329+ self ._process_change (server_description , reset_pool )
324330
325331 def _process_srv_update (self , seedlist ):
326332 """Process a new seedlist on an opened topology.
@@ -414,20 +420,14 @@ def request_check_all(self, wait_time=5):
414420 self ._request_check_all ()
415421 self ._condition .wait (wait_time )
416422
417- def reset_pool (self , address ):
418- with self ._lock :
419- server = self ._servers .get (address )
420- if server :
421- server .pool .reset ()
422-
423423 def handle_getlasterror (self , address , error_msg ):
424424 """Clear our pool for a server, mark it Unknown, and check it soon."""
425425 error = NotMasterError (error_msg , {'code' : 10107 , 'errmsg' : error_msg })
426426 with self ._lock :
427427 server = self ._servers .get (address )
428428 if server :
429- self ._process_change (ServerDescription ( address , error = error ))
430- server . pool . reset ( )
429+ self ._process_change (
430+ ServerDescription ( address , error = error ), True )
431431 server .request_check ()
432432
433433 def update_pool (self , all_credentials ):
0 commit comments