@@ -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