PYTHON-4755 - Stop supporting and testing against Eventlet (#2557)
This commit is contained in:
parent
0049dc8896
commit
9e64ed1bd8
@ -319,14 +319,6 @@ buildvariants:
|
||||
tags: []
|
||||
|
||||
# Green framework tests
|
||||
- name: green-eventlet-rhel8
|
||||
tasks:
|
||||
- name: .test-standard .python-3.9 .sync
|
||||
display_name: Green Eventlet RHEL8
|
||||
run_on:
|
||||
- rhel87-small
|
||||
expansions:
|
||||
GREEN_FRAMEWORK: eventlet
|
||||
- name: green-gevent-rhel8
|
||||
tasks:
|
||||
- name: .test-standard .sync
|
||||
|
||||
@ -300,12 +300,8 @@ def create_stable_api_variants():
|
||||
def create_green_framework_variants():
|
||||
variants = []
|
||||
host = DEFAULT_HOST
|
||||
for framework in ["eventlet", "gevent"]:
|
||||
for framework in ["gevent"]:
|
||||
tasks = [".test-standard .sync"]
|
||||
if framework == "eventlet":
|
||||
# Eventlet has issues with dnspython > 2.0 and newer versions of CPython
|
||||
# https://jira.mongodb.org/browse/PYTHON-5284
|
||||
tasks = [".test-standard .python-3.9 .sync"]
|
||||
expansions = dict(GREEN_FRAMEWORK=framework)
|
||||
display_name = get_variant_name(f"Green {framework.capitalize()}", host)
|
||||
variant = create_variant(tasks, display_name, host=host, expansions=expansions)
|
||||
|
||||
@ -67,13 +67,7 @@ def handle_perf(start_time: datetime):
|
||||
|
||||
|
||||
def handle_green_framework() -> None:
|
||||
if GREEN_FRAMEWORK == "eventlet":
|
||||
import eventlet
|
||||
|
||||
# https://github.com/eventlet/eventlet/issues/401
|
||||
eventlet.sleep()
|
||||
eventlet.monkey_patch()
|
||||
elif GREEN_FRAMEWORK == "gevent":
|
||||
if GREEN_FRAMEWORK == "gevent":
|
||||
from gevent import monkey
|
||||
|
||||
monkey.patch_all()
|
||||
|
||||
@ -104,7 +104,7 @@ def get_test_options(
|
||||
parser.add_argument(
|
||||
"--green-framework",
|
||||
nargs=1,
|
||||
choices=["eventlet", "gevent"],
|
||||
choices=["gevent"],
|
||||
help="Optional green framework to test against.",
|
||||
)
|
||||
parser.add_argument(
|
||||
|
||||
@ -9,6 +9,8 @@ PyMongo 4.16 brings a number of changes including:
|
||||
- Removed invalid documents from :class:`bson.errors.InvalidDocument` error messages as
|
||||
doing so may leak sensitive user data.
|
||||
Instead, invalid documents are stored in :attr:`bson.errors.InvalidDocument.document`.
|
||||
- Removed support for Eventlet.
|
||||
Eventlet is actively being sunset by its maintainers and has compatibility issues with PyMongo's dnspython dependency.
|
||||
|
||||
Changes in Version 4.15.1 (2025/09/16)
|
||||
--------------------------------------
|
||||
|
||||
@ -628,7 +628,7 @@ class AsyncConnection:
|
||||
# signals and throws KeyboardInterrupt into the current frame on the
|
||||
# main thread.
|
||||
#
|
||||
# But in Gevent and Eventlet, the polling mechanism (epoll, kqueue,
|
||||
# But in Gevent, the polling mechanism (epoll, kqueue,
|
||||
# ..) is called in Python code, which experiences the signal as a
|
||||
# KeyboardInterrupt from the start, rather than as an initial
|
||||
# socket.error, so we catch that, close the socket, and reraise it.
|
||||
|
||||
@ -138,13 +138,11 @@ def _raise_connection_failure(
|
||||
msg = msg_prefix + msg
|
||||
if "configured timeouts" not in msg:
|
||||
msg += format_timeout_details(timeout_details)
|
||||
if isinstance(error, socket.timeout):
|
||||
raise NetworkTimeout(msg) from error
|
||||
elif isinstance(error, SSLErrors) and "timed out" in str(error):
|
||||
# Eventlet does not distinguish TLS network timeouts from other
|
||||
# SSLErrors (https://github.com/eventlet/eventlet/issues/692).
|
||||
# Luckily, we can work around this limitation because the phrase
|
||||
# 'timed out' appears in all the timeout related SSLErrors raised.
|
||||
if (
|
||||
isinstance(error, socket.timeout)
|
||||
or isinstance(error, SSLErrors)
|
||||
and "timed out" in str(error)
|
||||
):
|
||||
raise NetworkTimeout(msg) from error
|
||||
else:
|
||||
raise AutoReconnect(msg) from error
|
||||
|
||||
@ -626,7 +626,7 @@ class Connection:
|
||||
# signals and throws KeyboardInterrupt into the current frame on the
|
||||
# main thread.
|
||||
#
|
||||
# But in Gevent and Eventlet, the polling mechanism (epoll, kqueue,
|
||||
# But in Gevent, the polling mechanism (epoll, kqueue,
|
||||
# ..) is called in Python code, which experiences the signal as a
|
||||
# KeyboardInterrupt from the start, rather than as an initial
|
||||
# socket.error, so we catch that, close the socket, and reraise it.
|
||||
|
||||
@ -52,7 +52,6 @@ dev = [
|
||||
pip = ["pip"]
|
||||
# TODO: PYTHON-5464
|
||||
gevent = ["gevent", "cffi>=2.0.0b1;python_version=='3.14'"]
|
||||
eventlet = ["eventlet"]
|
||||
coverage = [
|
||||
"pytest-cov",
|
||||
"coverage>=5,<=7.10.6"
|
||||
@ -113,15 +112,12 @@ filterwarnings = [
|
||||
"module:.*WindowsSelectorEventLoopPolicy:DeprecationWarning",
|
||||
"module:.*et_event_loop_policy:DeprecationWarning",
|
||||
# TODO: Remove as part of PYTHON-3923.
|
||||
"module:unclosed <eventlet.green.ssl.GreenSSLSocket:ResourceWarning",
|
||||
"module:unclosed <socket.socket:ResourceWarning",
|
||||
"module:unclosed <ssl.SSLSocket:ResourceWarning",
|
||||
"module:unclosed <socket object:ResourceWarning",
|
||||
"module:unclosed transport:ResourceWarning",
|
||||
# pytest-asyncio known issue: https://github.com/pytest-dev/pytest-asyncio/issues/724
|
||||
"module:unclosed event loop:ResourceWarning",
|
||||
# https://github.com/eventlet/eventlet/issues/818
|
||||
"module:please use dns.resolver.Resolver.resolve:DeprecationWarning",
|
||||
# https://github.com/dateutil/dateutil/issues/1314
|
||||
"module:datetime.datetime.utc:DeprecationWarning",
|
||||
]
|
||||
|
||||
@ -399,7 +399,7 @@ class TestClientSimple(AsyncEncryptionIntegrationTest):
|
||||
)
|
||||
@unittest.skipIf(
|
||||
is_greenthread_patched(),
|
||||
"gevent and eventlet do not support POSIX-style forking.",
|
||||
"gevent does not support POSIX-style forking.",
|
||||
)
|
||||
@async_client_context.require_sync
|
||||
async def test_fork(self):
|
||||
|
||||
@ -399,7 +399,7 @@ class TestClientSimple(EncryptionIntegrationTest):
|
||||
)
|
||||
@unittest.skipIf(
|
||||
is_greenthread_patched(),
|
||||
"gevent and eventlet do not support POSIX-style forking.",
|
||||
"gevent does not support POSIX-style forking.",
|
||||
)
|
||||
@client_context.require_sync
|
||||
def test_fork(self):
|
||||
|
||||
@ -34,7 +34,7 @@ from bson.objectid import ObjectId
|
||||
)
|
||||
@unittest.skipIf(
|
||||
is_greenthread_patched(),
|
||||
"gevent and eventlet do not support POSIX-style forking.",
|
||||
"gevent does not support POSIX-style forking.",
|
||||
)
|
||||
class TestFork(IntegrationTest):
|
||||
def test_lock_client(self):
|
||||
|
||||
@ -528,15 +528,8 @@ def gevent_monkey_patched():
|
||||
return False
|
||||
|
||||
|
||||
def eventlet_monkey_patched():
|
||||
"""Check if eventlet's monkey patching is active."""
|
||||
import threading
|
||||
|
||||
return threading.current_thread.__module__ == "eventlet.green.threading"
|
||||
|
||||
|
||||
def is_greenthread_patched():
|
||||
return gevent_monkey_patched() or eventlet_monkey_patched()
|
||||
return gevent_monkey_patched()
|
||||
|
||||
|
||||
def parse_read_preference(pref):
|
||||
|
||||
19
uv.lock
generated
19
uv.lock
generated
@ -697,19 +697,6 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "eventlet"
|
||||
version = "0.40.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "dnspython" },
|
||||
{ name = "greenlet" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/bf/a3/500893510ad316fc571d116d407ea17d6007a8ecdb0a456badb66eee42ae/eventlet-0.40.2.tar.gz", hash = "sha256:42636c277f761d026905cd0ba0a11edec7600001be401d6ae7e9546559c8d8b0", size = 565548, upload-time = "2025-07-22T14:49:54.317Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/41/2e2d46f31ed22c1c147936145badb86e0e28ba7fe7d7a54aa69849a93a52/eventlet-0.40.2-py3-none-any.whl", hash = "sha256:590c67b982015bc6b753a5303f3ec7356bc7890a39efd65176179f0113f5d35e", size = 364228, upload-time = "2025-07-22T14:49:52.082Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "exceptiongroup"
|
||||
version = "1.3.0"
|
||||
@ -1277,9 +1264,6 @@ coverage = [
|
||||
dev = [
|
||||
{ name = "pre-commit" },
|
||||
]
|
||||
eventlet = [
|
||||
{ name = "eventlet" },
|
||||
]
|
||||
gevent = [
|
||||
{ name = "cffi", version = "2.0.0b1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.14.*'" },
|
||||
{ name = "gevent" },
|
||||
@ -1309,7 +1293,7 @@ requires-dist = [
|
||||
{ name = "furo", marker = "extra == 'docs'", specifier = "==2025.7.19" },
|
||||
{ name = "importlib-metadata", marker = "python_full_version < '3.13' and extra == 'test'", specifier = ">=7.0" },
|
||||
{ name = "pykerberos", marker = "os_name != 'nt' and extra == 'gssapi'" },
|
||||
{ name = "pymongo-auth-aws", marker = "extra == 'aws'", specifier = ">=1.1.1,<2.0.0" },
|
||||
{ name = "pymongo-auth-aws", marker = "extra == 'aws'", specifier = ">=1.1.0,<2.0.0" },
|
||||
{ name = "pymongo-auth-aws", marker = "extra == 'encryption'", specifier = ">=1.1.0,<2.0.0" },
|
||||
{ name = "pymongocrypt", marker = "extra == 'encryption'", specifier = ">=1.13.0,<2.0.0" },
|
||||
{ name = "pyopenssl", marker = "extra == 'ocsp'", specifier = ">=17.2.0" },
|
||||
@ -1334,7 +1318,6 @@ coverage = [
|
||||
{ name = "pytest-cov" },
|
||||
]
|
||||
dev = [{ name = "pre-commit", specifier = ">=4.0" }]
|
||||
eventlet = [{ name = "eventlet" }]
|
||||
gevent = [
|
||||
{ name = "cffi", marker = "python_full_version == '3.14.*'", specifier = ">=2.0.0b1" },
|
||||
{ name = "gevent" },
|
||||
|
||||
Loading…
Reference in New Issue
Block a user