Perform metadata truncation.
(metadata: MutableMapping[str, Any])
| 200 | |
| 201 | # See: https://github.com/mongodb/specifications/blob/master/source/mongodb-handshake/handshake.md#limitations |
| 202 | def _truncate_metadata(metadata: MutableMapping[str, Any]) -> None: |
| 203 | """Perform metadata truncation.""" |
| 204 | if len(bson.encode(metadata)) <= _MAX_METADATA_SIZE: |
| 205 | return |
| 206 | # 1. Omit fields from env except env.name. |
| 207 | env_name = metadata.get("env", {}).get("name") |
| 208 | if env_name: |
| 209 | metadata["env"] = {"name": env_name} |
| 210 | if len(bson.encode(metadata)) <= _MAX_METADATA_SIZE: |
| 211 | return |
| 212 | # 2. Omit fields from os except os.type. |
| 213 | os_type = metadata.get("os", {}).get("type") |
| 214 | if os_type: |
| 215 | metadata["os"] = {"type": os_type} |
| 216 | if len(bson.encode(metadata)) <= _MAX_METADATA_SIZE: |
| 217 | return |
| 218 | # 3. Omit the env document entirely. |
| 219 | metadata.pop("env", None) |
| 220 | encoded_size = len(bson.encode(metadata)) |
| 221 | if encoded_size <= _MAX_METADATA_SIZE: |
| 222 | return |
| 223 | # 4. Truncate platform. |
| 224 | overflow = encoded_size - _MAX_METADATA_SIZE |
| 225 | plat = metadata.get("platform", "") |
| 226 | if plat: |
| 227 | plat = plat[:-overflow] |
| 228 | if plat: |
| 229 | metadata["platform"] = plat |
| 230 | else: |
| 231 | metadata.pop("platform", None) |
| 232 | encoded_size = len(bson.encode(metadata)) |
| 233 | if encoded_size <= _MAX_METADATA_SIZE: |
| 234 | return |
| 235 | # 5. Truncate driver info. |
| 236 | overflow = encoded_size - _MAX_METADATA_SIZE |
| 237 | driver = metadata.get("driver", {}) |
| 238 | if driver: |
| 239 | # Truncate driver version. |
| 240 | driver_version = driver.get("version")[:-overflow] |
| 241 | if len(driver_version) >= len(_METADATA["driver"]["version"]): |
| 242 | metadata["driver"]["version"] = driver_version |
| 243 | else: |
| 244 | metadata["driver"]["version"] = _METADATA["driver"]["version"] |
| 245 | encoded_size = len(bson.encode(metadata)) |
| 246 | if encoded_size <= _MAX_METADATA_SIZE: |
| 247 | return |
| 248 | # Truncate driver name. |
| 249 | overflow = encoded_size - _MAX_METADATA_SIZE |
| 250 | driver_name = driver.get("name")[:-overflow] |
| 251 | if len(driver_name) >= len(_METADATA["driver"]["name"]): |
| 252 | metadata["driver"]["name"] = driver_name |
| 253 | else: |
| 254 | metadata["driver"]["name"] = _METADATA["driver"]["name"] |
| 255 | |
| 256 | |
| 257 | # If the first getaddrinfo call of this interpreter's life is on a thread, |