Skip to content

Commit ba6d700

Browse files
committed
PYTHON-5488 append_metadata should not add duplicates
1 parent bbb6f88 commit ba6d700

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

pymongo/pool_options.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ def __init__(
386386

387387
def _update_metadata(self, driver: DriverInfo) -> None:
388388
"""Updates the client's metadata"""
389+
if driver.name in self.__metadata["driver"]["name"].split("|"):
390+
return
389391

390392
metadata = copy.deepcopy(self.__metadata)
391393
if driver.name:

test/asynchronous/test_client_metadata.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,46 @@ async def test_doesnt_update_established_connections(self):
210210
self.assertIsNone(self.handshake_req)
211211
self.assertEqual(listener.event_count(ConnectionClosedEvent), 0)
212212

213+
async def test_duplicate_driver_name_no_op(self):
214+
client = await self.async_rs_or_single_client(
215+
"mongodb://" + self.server.address_string,
216+
maxIdleTimeMS=1,
217+
)
218+
client.append_metadata(DriverInfo("library", "1.2", "Library Platform"))
219+
# send initial metadata
220+
name, version, platform, metadata = await self.send_ping_and_get_metadata(client, True)
221+
# wait for connection to become idle
222+
await asyncio.sleep(0.005)
223+
224+
# add new metadata
225+
client.append_metadata(DriverInfo("framework", None, None))
226+
new_name, new_version, new_platform, new_metadata = await self.send_ping_and_get_metadata(
227+
client, True
228+
)
229+
self.assertEqual(new_name, f"{name}|framework")
230+
self.assertEqual(new_version, version)
231+
self.assertEqual(new_platform, platform)
232+
233+
metadata.pop("driver")
234+
metadata.pop("platform")
235+
new_metadata.pop("driver")
236+
new_metadata.pop("platform")
237+
self.assertEqual(metadata, new_metadata)
238+
239+
# wait for connection to become idle
240+
await asyncio.sleep(0.005)
241+
# add same metadata again
242+
client.append_metadata(DriverInfo("framework", None, None))
243+
(
244+
same_name,
245+
same_version,
246+
same_platform,
247+
same_metadata,
248+
) = await self.send_ping_and_get_metadata(client, True)
249+
self.assertEqual(new_name, same_name)
250+
self.assertEqual(new_version, same_version)
251+
self.assertEqual(new_platform, same_platform)
252+
213253

214254
if __name__ == "__main__":
215255
unittest.main()

test/test_client_metadata.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,46 @@ def test_doesnt_update_established_connections(self):
210210
self.assertIsNone(self.handshake_req)
211211
self.assertEqual(listener.event_count(ConnectionClosedEvent), 0)
212212

213+
def test_duplicate_driver_name_no_op(self):
214+
client = self.rs_or_single_client(
215+
"mongodb://" + self.server.address_string,
216+
maxIdleTimeMS=1,
217+
)
218+
client.append_metadata(DriverInfo("library", "1.2", "Library Platform"))
219+
# send initial metadata
220+
name, version, platform, metadata = self.send_ping_and_get_metadata(client, True)
221+
# wait for connection to become idle
222+
time.sleep(0.005)
223+
224+
# add new metadata
225+
client.append_metadata(DriverInfo("framework", None, None))
226+
new_name, new_version, new_platform, new_metadata = self.send_ping_and_get_metadata(
227+
client, True
228+
)
229+
self.assertEqual(new_name, f"{name}|framework")
230+
self.assertEqual(new_version, version)
231+
self.assertEqual(new_platform, platform)
232+
233+
metadata.pop("driver")
234+
metadata.pop("platform")
235+
new_metadata.pop("driver")
236+
new_metadata.pop("platform")
237+
self.assertEqual(metadata, new_metadata)
238+
239+
# wait for connection to become idle
240+
time.sleep(0.005)
241+
# add same metadata again
242+
client.append_metadata(DriverInfo("framework", None, None))
243+
(
244+
same_name,
245+
same_version,
246+
same_platform,
247+
same_metadata,
248+
) = self.send_ping_and_get_metadata(client, True)
249+
self.assertEqual(new_name, same_name)
250+
self.assertEqual(new_version, same_version)
251+
self.assertEqual(new_platform, same_platform)
252+
213253

214254
if __name__ == "__main__":
215255
unittest.main()

0 commit comments

Comments
 (0)