Skip to content

Commit d7128c1

Browse files
committed
PYTHON-2024 Skip publishing SDAM events for "equivalent" ServerDescriptions
1 parent e989be5 commit d7128c1

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

pymongo/server_description.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,5 +207,26 @@ def retryable_reads_supported(self):
207207
"""Checks if this server supports retryable writes."""
208208
return self._max_wire_version >= 6
209209

210+
def __eq__(self, other):
211+
if isinstance(other, ServerDescription):
212+
return ((self._address == other.address) and
213+
(self._server_type == other.server_type) and
214+
(self._min_wire_version == other.min_wire_version) and
215+
(self._max_wire_version == other.max_wire_version) and
216+
(self._me == other.me) and
217+
(self._all_hosts == other.all_hosts) and
218+
(self._tags == other.tags) and
219+
(self._replica_set_name == other.replica_set_name) and
220+
(self._set_version == other.set_version) and
221+
(self._election_id == other.election_id) and
222+
(self._primary == other.primary) and
223+
(self._ls_timeout_minutes ==
224+
other.logical_session_timeout_minutes))
225+
226+
return NotImplemented
227+
228+
def __ne__(self, other):
229+
return not self == other
230+
210231
# For unittesting only. Use under no circumstances!
211232
_host_to_round_trip_time = {}

pymongo/topology.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,11 @@ def _process_change(self, server_description):
264264
Hold the lock when calling this.
265265
"""
266266
td_old = self._description
267-
if self._publish_server:
268-
old_server_description = td_old._server_descriptions[
269-
server_description.address]
267+
old_server_description = td_old._server_descriptions[
268+
server_description.address]
269+
suppress_event = ((self._publish_server or self._publish_tp)
270+
and old_server_description == server_description)
271+
if self._publish_server and not suppress_event:
270272
self._events.put((
271273
self._listeners.publish_server_description_changed,
272274
(old_server_description, server_description,
@@ -278,7 +280,7 @@ def _process_change(self, server_description):
278280
self._update_servers()
279281
self._receive_cluster_time_no_lock(server_description.cluster_time)
280282

281-
if self._publish_tp:
283+
if self._publish_tp and not suppress_event:
282284
self._events.put((
283285
self._listeners.publish_topology_description_changed,
284286
(td_old, self._description, self._topology_id)))

test/test_sdam_monitoring_spec.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,15 +207,16 @@ def _run(self):
207207
lambda: len(self.all_listener.results) >= expected_len,
208208
"publish all events", timeout=15)
209209

210+
# Wait some time to catch possible lagging extra events.
211+
time.sleep(0.5)
212+
210213
i = 0
211214
while i < expected_len:
212215
result = self.all_listener.results[i] if len(
213216
self.all_listener.results) > i else None
214217
# The order of ServerOpening/ClosedEvents doesn't matter
215-
if (isinstance(result,
216-
monitoring.ServerOpeningEvent) or
217-
isinstance(result,
218-
monitoring.ServerClosedEvent)):
218+
if isinstance(result, (monitoring.ServerOpeningEvent,
219+
monitoring.ServerClosedEvent)):
219220
i, passed, message = compare_multiple_events(
220221
i, expected_results, self.all_listener.results)
221222
self.assertTrue(passed, message)
@@ -224,6 +225,11 @@ def _run(self):
224225
*compare_events(expected_results[i], result))
225226
i += 1
226227

228+
# Assert no extra events.
229+
extra_events = self.all_listener.results[expected_len:]
230+
if extra_events:
231+
self.fail('Extra events %r' % (extra_events,))
232+
227233
self.all_listener.reset()
228234
finally:
229235
m.close()

0 commit comments

Comments
 (0)