@@ -265,7 +265,7 @@ def select_server_by_address(self, address,
265
265
server_selection_timeout ,
266
266
address )
267
267
268
- def _process_change (self , server_description ):
268
+ def _process_change (self , server_description , reset_pool = False ):
269
269
"""Process a new ServerDescription on an opened topology.
270
270
271
271
Hold the lock when calling this.
@@ -303,10 +303,16 @@ def _process_change(self, server_description):
303
303
SRV_POLLING_TOPOLOGIES ):
304
304
self ._srv_monitor .close ()
305
305
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
+
306
312
# Wake waiters in select_servers().
307
313
self ._condition .notify_all ()
308
314
309
- def on_change (self , server_description ):
315
+ def on_change (self , server_description , reset_pool = False ):
310
316
"""Process a new ServerDescription after an ismaster call completes."""
311
317
# We do no I/O holding the lock.
312
318
with self ._lock :
@@ -320,7 +326,7 @@ def on_change(self, server_description):
320
326
# that didn't include this server.
321
327
if (self ._opened and
322
328
self ._description .has_server (server_description .address )):
323
- self ._process_change (server_description )
329
+ self ._process_change (server_description , reset_pool )
324
330
325
331
def _process_srv_update (self , seedlist ):
326
332
"""Process a new seedlist on an opened topology.
@@ -414,20 +420,14 @@ def request_check_all(self, wait_time=5):
414
420
self ._request_check_all ()
415
421
self ._condition .wait (wait_time )
416
422
417
- def reset_pool (self , address ):
418
- with self ._lock :
419
- server = self ._servers .get (address )
420
- if server :
421
- server .pool .reset ()
422
-
423
423
def handle_getlasterror (self , address , error_msg ):
424
424
"""Clear our pool for a server, mark it Unknown, and check it soon."""
425
425
error = NotMasterError (error_msg , {'code' : 10107 , 'errmsg' : error_msg })
426
426
with self ._lock :
427
427
server = self ._servers .get (address )
428
428
if server :
429
- self ._process_change (ServerDescription ( address , error = error ))
430
- server . pool . reset ( )
429
+ self ._process_change (
430
+ ServerDescription ( address , error = error ), True )
431
431
server .request_check ()
432
432
433
433
def update_pool (self , all_credentials ):
0 commit comments