Skip to content

Commit ca7c8c2

Browse files
committed
Merge branch 'master' of github.com:mongodb/mongo-python-driver
2 parents 5e3ebf1 + 1d8d3fe commit ca7c8c2

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

pymongo/asynchronous/pool.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,29 @@ def _truncate_metadata(metadata: MutableMapping[str, Any]) -> None:
394394
metadata["platform"] = plat
395395
else:
396396
metadata.pop("platform", None)
397+
encoded_size = len(bson.encode(metadata))
398+
if encoded_size <= _MAX_METADATA_SIZE:
399+
return
400+
# 5. Truncate driver info.
401+
overflow = encoded_size - _MAX_METADATA_SIZE
402+
driver = metadata.get("driver", {})
403+
if driver:
404+
# Truncate driver version.
405+
driver_version = driver.get("version")[:-overflow]
406+
if len(driver_version) >= len(_METADATA["driver"]["version"]):
407+
metadata["driver"]["version"] = driver_version
408+
else:
409+
metadata["driver"]["version"] = _METADATA["driver"]["version"]
410+
encoded_size = len(bson.encode(metadata))
411+
if encoded_size <= _MAX_METADATA_SIZE:
412+
return
413+
# Truncate driver name.
414+
overflow = encoded_size - _MAX_METADATA_SIZE
415+
driver_name = driver.get("name")[:-overflow]
416+
if len(driver_name) >= len(_METADATA["driver"]["name"]):
417+
metadata["driver"]["name"] = driver_name
418+
else:
419+
metadata["driver"]["name"] = _METADATA["driver"]["name"]
397420

398421

399422
# If the first getaddrinfo call of this interpreter's life is on a thread,

pymongo/synchronous/pool.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,29 @@ def _truncate_metadata(metadata: MutableMapping[str, Any]) -> None:
394394
metadata["platform"] = plat
395395
else:
396396
metadata.pop("platform", None)
397+
encoded_size = len(bson.encode(metadata))
398+
if encoded_size <= _MAX_METADATA_SIZE:
399+
return
400+
# 5. Truncate driver info.
401+
overflow = encoded_size - _MAX_METADATA_SIZE
402+
driver = metadata.get("driver", {})
403+
if driver:
404+
# Truncate driver version.
405+
driver_version = driver.get("version")[:-overflow]
406+
if len(driver_version) >= len(_METADATA["driver"]["version"]):
407+
metadata["driver"]["version"] = driver_version
408+
else:
409+
metadata["driver"]["version"] = _METADATA["driver"]["version"]
410+
encoded_size = len(bson.encode(metadata))
411+
if encoded_size <= _MAX_METADATA_SIZE:
412+
return
413+
# Truncate driver name.
414+
overflow = encoded_size - _MAX_METADATA_SIZE
415+
driver_name = driver.get("name")[:-overflow]
416+
if len(driver_name) >= len(_METADATA["driver"]["name"]):
417+
metadata["driver"]["name"] = driver_name
418+
else:
419+
metadata["driver"]["name"] = _METADATA["driver"]["name"]
397420

398421

399422
# If the first getaddrinfo call of this interpreter's life is on a thread,

test/test_client.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
wait_until,
7373
)
7474

75+
import bson
7576
import pymongo
7677
from bson import encode
7778
from bson.codec_options import (
@@ -106,6 +107,7 @@
106107
from pymongo.synchronous.mongo_client import MongoClient
107108
from pymongo.synchronous.monitoring import ServerHeartbeatListener, ServerHeartbeatStartedEvent
108109
from pymongo.synchronous.pool import (
110+
_MAX_METADATA_SIZE,
109111
_METADATA,
110112
ENV_VAR_K8S,
111113
Connection,
@@ -361,6 +363,25 @@ def test_metadata(self):
361363
)
362364
options = client.options
363365
self.assertEqual(options.pool_options.metadata, metadata)
366+
# Test truncating driver info metadata.
367+
client = MongoClient(
368+
driver=DriverInfo(name="s" * _MAX_METADATA_SIZE),
369+
connect=False,
370+
)
371+
options = client.options
372+
self.assertLessEqual(
373+
len(bson.encode(options.pool_options.metadata)),
374+
_MAX_METADATA_SIZE,
375+
)
376+
client = MongoClient(
377+
driver=DriverInfo(name="s" * _MAX_METADATA_SIZE, version="s" * _MAX_METADATA_SIZE),
378+
connect=False,
379+
)
380+
options = client.options
381+
self.assertLessEqual(
382+
len(bson.encode(options.pool_options.metadata)),
383+
_MAX_METADATA_SIZE,
384+
)
364385

365386
@mock.patch.dict("os.environ", {ENV_VAR_K8S: "1"})
366387
def test_container_metadata(self):

0 commit comments

Comments
 (0)