From 47f8a126ca167cb8fe020e3cc5604b155dfcdebc Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Tue, 3 Sep 2019 14:36:06 +0300 Subject: [PATCH 1/2] Only set no_cursor_timeout when requested Previously this was always set for all requests. The parameter is only documented as supported for certain queries, so this was probably wrong. Mongo version 4.2 fails update queries that have this parameter set making mongoengine unusable there. Fixes #2148. --- mongoengine/queryset/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index ba3ac95a..ffa099ac 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1576,7 +1576,9 @@ class BaseQuerySet(object): if self._snapshot: msg = "The snapshot option is not anymore available with PyMongo 3+" warnings.warn(msg, DeprecationWarning) - cursor_args = {"no_cursor_timeout": not self._timeout} + cursor_args = {} + if not self._timeout: + cursor_args["no_cursor_timeout"] = True if self._loaded_fields: cursor_args[fields_name] = self._loaded_fields.as_dict() From 7d94af0e3181751894884cbfcd55fe9383db028b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastien=20G=C3=A9rard?= Date: Wed, 11 Sep 2019 21:53:30 +0200 Subject: [PATCH 2/2] add test coverage for no_cursor_timeout to support recent fix --- mongoengine/queryset/base.py | 1 + tests/queryset/test_queryset.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index ffa099ac..570ad37f 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1576,6 +1576,7 @@ class BaseQuerySet(object): if self._snapshot: msg = "The snapshot option is not anymore available with PyMongo 3+" warnings.warn(msg, DeprecationWarning) + cursor_args = {} if not self._timeout: cursor_args["no_cursor_timeout"] = True diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index a9ecaef5..e7e59905 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -5809,9 +5809,19 @@ class TestQueryset(unittest.TestCase): self.Person.objects.create(name="Baz") self.assertEqual(self.Person.objects.count(with_limit_and_skip=True), 3) - newPerson = self.Person.objects.create(name="Foo_1") + self.Person.objects.create(name="Foo_1") self.assertEqual(self.Person.objects.count(with_limit_and_skip=True), 4) + def test_no_cursor_timeout(self): + qs = self.Person.objects() + self.assertEqual(qs._cursor_args, {}) # ensure no regression of #2148 + + qs = self.Person.objects().timeout(True) + self.assertEqual(qs._cursor_args, {}) + + qs = self.Person.objects().timeout(False) + self.assertEqual(qs._cursor_args, {"no_cursor_timeout": True}) + if __name__ == "__main__": unittest.main()