Skip to content

Commit 2a1523f

Browse files
authored
PYTHON-5488 append_metadata should not add duplicates (#2461)
1 parent de332c5 commit 2a1523f

File tree

3 files changed

+57
-18
lines changed

3 files changed

+57
-18
lines changed

pymongo/pool_options.py

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

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

390394
metadata = copy.deepcopy(self.__metadata)
395+
391396
if driver.name:
392397
metadata["driver"]["name"] = "{}|{}".format(
393398
metadata["driver"]["name"],

test/asynchronous/test_client_metadata.py

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,20 @@ async def check_metadata_added(
107107
new_name, new_version, new_platform, new_metadata = await self.send_ping_and_get_metadata(
108108
client, True
109109
)
110-
self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name)
111-
self.assertEqual(
112-
new_version,
113-
f"{version}|{add_version}" if add_version is not None else version,
114-
)
115-
self.assertEqual(
116-
new_platform,
117-
f"{platform}|{add_platform}" if add_platform is not None else platform,
118-
)
110+
if add_name is not None and add_name.lower() in name.lower().split("|"):
111+
self.assertEqual(name, new_name)
112+
self.assertEqual(version, new_version)
113+
self.assertEqual(platform, new_platform)
114+
else:
115+
self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name)
116+
self.assertEqual(
117+
new_version,
118+
f"{version}|{add_version}" if add_version is not None else version,
119+
)
120+
self.assertEqual(
121+
new_platform,
122+
f"{platform}|{add_platform}" if add_platform is not None else platform,
123+
)
119124

120125
metadata.pop("driver")
121126
metadata.pop("platform")
@@ -210,6 +215,18 @@ async def test_doesnt_update_established_connections(self):
210215
self.assertIsNone(self.handshake_req)
211216
self.assertEqual(listener.event_count(ConnectionClosedEvent), 0)
212217

218+
async def test_duplicate_driver_name_no_op(self):
219+
client = await self.async_rs_or_single_client(
220+
"mongodb://" + self.server.address_string,
221+
maxIdleTimeMS=1,
222+
)
223+
client.append_metadata(DriverInfo("library", "1.2", "Library Platform"))
224+
await self.check_metadata_added(client, "framework", None, None)
225+
# wait for connection to become idle
226+
await asyncio.sleep(0.005)
227+
# add same metadata again
228+
await self.check_metadata_added(client, "Framework", None, None)
229+
213230

214231
if __name__ == "__main__":
215232
unittest.main()

test/test_client_metadata.py

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,20 @@ def check_metadata_added(
107107
new_name, new_version, new_platform, new_metadata = self.send_ping_and_get_metadata(
108108
client, True
109109
)
110-
self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name)
111-
self.assertEqual(
112-
new_version,
113-
f"{version}|{add_version}" if add_version is not None else version,
114-
)
115-
self.assertEqual(
116-
new_platform,
117-
f"{platform}|{add_platform}" if add_platform is not None else platform,
118-
)
110+
if add_name is not None and add_name.lower() in name.lower().split("|"):
111+
self.assertEqual(name, new_name)
112+
self.assertEqual(version, new_version)
113+
self.assertEqual(platform, new_platform)
114+
else:
115+
self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name)
116+
self.assertEqual(
117+
new_version,
118+
f"{version}|{add_version}" if add_version is not None else version,
119+
)
120+
self.assertEqual(
121+
new_platform,
122+
f"{platform}|{add_platform}" if add_platform is not None else platform,
123+
)
119124

120125
metadata.pop("driver")
121126
metadata.pop("platform")
@@ -210,6 +215,18 @@ def test_doesnt_update_established_connections(self):
210215
self.assertIsNone(self.handshake_req)
211216
self.assertEqual(listener.event_count(ConnectionClosedEvent), 0)
212217

218+
def test_duplicate_driver_name_no_op(self):
219+
client = self.rs_or_single_client(
220+
"mongodb://" + self.server.address_string,
221+
maxIdleTimeMS=1,
222+
)
223+
client.append_metadata(DriverInfo("library", "1.2", "Library Platform"))
224+
self.check_metadata_added(client, "framework", None, None)
225+
# wait for connection to become idle
226+
time.sleep(0.005)
227+
# add same metadata again
228+
self.check_metadata_added(client, "Framework", None, None)
229+
213230

214231
if __name__ == "__main__":
215232
unittest.main()

0 commit comments

Comments
 (0)