File tree Expand file tree Collapse file tree 3 files changed +67
-0
lines changed Expand file tree Collapse file tree 3 files changed +67
-0
lines changed Original file line number Diff line number Diff line change @@ -394,6 +394,29 @@ def _truncate_metadata(metadata: MutableMapping[str, Any]) -> None:
394
394
metadata ["platform" ] = plat
395
395
else :
396
396
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" ]
397
420
398
421
399
422
# If the first getaddrinfo call of this interpreter's life is on a thread,
Original file line number Diff line number Diff line change @@ -394,6 +394,29 @@ def _truncate_metadata(metadata: MutableMapping[str, Any]) -> None:
394
394
metadata ["platform" ] = plat
395
395
else :
396
396
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" ]
397
420
398
421
399
422
# If the first getaddrinfo call of this interpreter's life is on a thread,
Original file line number Diff line number Diff line change 72
72
wait_until ,
73
73
)
74
74
75
+ import bson
75
76
import pymongo
76
77
from bson import encode
77
78
from bson .codec_options import (
106
107
from pymongo .synchronous .mongo_client import MongoClient
107
108
from pymongo .synchronous .monitoring import ServerHeartbeatListener , ServerHeartbeatStartedEvent
108
109
from pymongo .synchronous .pool import (
110
+ _MAX_METADATA_SIZE ,
109
111
_METADATA ,
110
112
ENV_VAR_K8S ,
111
113
Connection ,
@@ -361,6 +363,25 @@ def test_metadata(self):
361
363
)
362
364
options = client .options
363
365
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
+ )
364
385
365
386
@mock .patch .dict ("os.environ" , {ENV_VAR_K8S : "1" })
366
387
def test_container_metadata (self ):
You can’t perform that action at this time.
0 commit comments