PYTHON-4703 MongoClient should default to connect=False on FaaS environments (#1844)

This commit is contained in:
Steven Silvester 2024-09-06 15:38:58 -05:00 committed by GitHub
parent f2cd655d04
commit c883012b56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 31 additions and 4 deletions

View File

@ -42,6 +42,12 @@ PyMongo 4.9 brings a number of improvements including:
- Fixed a bug where PyMongo would raise ``InvalidBSON: date value out of range``
when using :attr:`~bson.codec_options.DatetimeConversion.DATETIME_CLAMP` or
:attr:`~bson.codec_options.DatetimeConversion.DATETIME_AUTO` with a non-UTC timezone.
- The default value for ``connect`` in ``MongoClient`` is changed to ``False`` when running on
unction-as-a-service (FaaS) like AWS Lambda, Google Cloud Functions, and Microsoft Azure Functions.
On some FaaS systems, there is a ``fork()`` operation at function
startup. By delaying the connection to the first operation, we avoid a deadlock. See
`Is PyMongo Fork-Safe`_ for more information.
Issues Resolved
...............
@ -49,6 +55,7 @@ Issues Resolved
See the `PyMongo 4.9 release notes in JIRA`_ for the list of resolved issues
in this release.
.. _Is PyMongo Fork-Safe : https://www.mongodb.com/docs/languages/python/pymongo-driver/current/faq/#is-pymongo-fork-safe-
.. _PyMongo 4.9 release notes in JIRA: https://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004&version=39940

View File

@ -720,6 +720,10 @@ class AsyncMongoClient(common.BaseObject, Generic[_DocumentType]):
.. versionchanged:: 4.7
Deprecated parameter ``wTimeoutMS``, use :meth:`~pymongo.timeout`.
.. versionchanged:: 4.9
The default value of ``connect`` is changed to ``False`` when running in a
Function-as-a-service environment.
"""
doc_class = document_class or dict
self._init_kwargs: dict[str, Any] = {
@ -803,7 +807,10 @@ class AsyncMongoClient(common.BaseObject, Generic[_DocumentType]):
if tz_aware is None:
tz_aware = opts.get("tz_aware", False)
if connect is None:
connect = opts.get("connect", True)
# Default to connect=True unless on a FaaS system, which might use fork.
from pymongo.pool_options import _is_faas
connect = opts.get("connect", not _is_faas())
keyword_opts["tz_aware"] = tz_aware
keyword_opts["connect"] = connect

View File

@ -263,7 +263,8 @@ class MongoClient(common.BaseObject, Generic[_DocumentType]):
aware (otherwise they will be naive)
:param connect: If ``True`` (the default), immediately
begin connecting to MongoDB in the background. Otherwise connect
on the first operation.
on the first operation. The default value is ``False`` when
running in a Function-as-a-service environment.
:param type_registry: instance of
:class:`~bson.codec_options.TypeRegistry` to enable encoding
and decoding of custom types.
@ -719,6 +720,10 @@ class MongoClient(common.BaseObject, Generic[_DocumentType]):
.. versionchanged:: 4.7
Deprecated parameter ``wTimeoutMS``, use :meth:`~pymongo.timeout`.
.. versionchanged:: 4.9
The default value of ``connect`` is changed to ``False`` when running in a
Function-as-a-service environment.
"""
doc_class = document_class or dict
self._init_kwargs: dict[str, Any] = {
@ -802,7 +807,10 @@ class MongoClient(common.BaseObject, Generic[_DocumentType]):
if tz_aware is None:
tz_aware = opts.get("tz_aware", False)
if connect is None:
connect = opts.get("connect", True)
# Default to connect=True unless on a FaaS system, which might use fork.
from pymongo.pool_options import _is_faas
connect = opts.get("connect", not _is_faas())
keyword_opts["tz_aware"] = tz_aware
keyword_opts["connect"] = connect

View File

@ -8,6 +8,7 @@ from __future__ import annotations
import json
import os
import warnings
from bson import has_c as has_bson_c
from pymongo import MongoClient
@ -18,6 +19,9 @@ from pymongo.monitoring import (
ServerHeartbeatListener,
)
# Ensure there are no warnings raised in normal operation.
warnings.simplefilter("error")
open_connections = 0
heartbeat_count = 0
streaming_heartbeat_count = 0

View File

@ -108,7 +108,8 @@ replacements = {
docstring_replacements: dict[tuple[str, str], str] = {
("MongoClient", "connect"): """If ``True`` (the default), immediately
begin connecting to MongoDB in the background. Otherwise connect
on the first operation.""",
on the first operation. The default value is ``False`` when
running in a Function-as-a-service environment.""",
("Collection", "create"): """If ``True``, force collection
creation even without options being set.""",
("Collection", "session"): """A