Skip to content

Commit 627dc35

Browse files
committed
PYTHON-2554 Update for new 5.0 spec rules
1 parent c35081f commit 627dc35

File tree

5 files changed

+26
-23
lines changed

5 files changed

+26
-23
lines changed

pymongo/aggregation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from pymongo import common
2020
from pymongo.collation import validate_collation_or_none
2121
from pymongo.errors import ConfigurationError
22-
from pymongo.read_preferences import _AggWritePref
22+
from pymongo.read_preferences import _AggWritePref, ReadPreference
2323

2424

2525
class _AggregationCommand(object):
@@ -101,7 +101,7 @@ def get_read_preference(self, session):
101101
if self._write_preference:
102102
return self._write_preference
103103
pref = self._target._read_preference_for(session)
104-
if self._performs_write:
104+
if self._performs_write and pref != ReadPreference.PRIMARY:
105105
self._write_preference = pref = _AggWritePref(pref)
106106
return pref
107107

pymongo/mongo_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ def _secondaryok_for_server(self, read_preference, server, session):
11611161

11621162
with self._get_socket(server, session) as sock_info:
11631163
secondary_ok = (single and not sock_info.is_mongos) or (
1164-
read_preference != ReadPreference.PRIMARY)
1164+
read_preference.mode != ReadPreference.PRIMARY.mode)
11651165
yield sock_info, secondary_ok
11661166

11671167
@contextlib.contextmanager

pymongo/read_preferences.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -438,19 +438,20 @@ class _AggWritePref:
438438

439439
def __init__(self, pref):
440440
self.pref = pref
441-
self.effective_pref = None
441+
self.effective_pref = ReadPreference.PRIMARY
442+
443+
def selection_hook(self, topology_description):
444+
common_wv = topology_description.common_wire_version
445+
if (topology_description.has_readable_server(
446+
ReadPreference.PRIMARY_PREFERRED) and
447+
common_wv and common_wv < 13):
448+
self.effective_pref = ReadPreference.PRIMARY
449+
else:
450+
self.effective_pref = self.pref
442451

443452
def __call__(self, selection):
444453
"""Apply this read preference to a Selection."""
445-
has_50 = any(s for s in selection.server_descriptions
446-
if s.max_wire_version >= 13)
447-
if not has_50:
448-
# Fallback to using the primary:
449-
self.effective_pref = ReadPreference.PRIMARY
450-
return selection.primary_selection
451-
# Apply the original selection:
452-
self.effective_pref = self.pref
453-
return self.pref(selection)
454+
return self.effective_pref(selection)
454455

455456
def __repr__(self):
456457
return "_AggWritePref(pref=%r)" % (self.pref,)

pymongo/topology_description.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,24 +263,24 @@ def apply_selector(self, selector, address=None, custom_selector=None):
263263
selector.min_wire_version,
264264
common_wv))
265265

266+
if isinstance(selector, _AggWritePref):
267+
selector.selection_hook(self)
268+
266269
if self.topology_type == TOPOLOGY_TYPE.Unknown:
267270
return []
268271
elif self.topology_type in (TOPOLOGY_TYPE.Single,
269272
TOPOLOGY_TYPE.LoadBalanced):
270273
# Ignore selectors for standalone and load balancer mode.
271274
return self.known_servers
272-
elif address:
275+
if address:
273276
# Ignore selectors when explicit address is requested.
274277
description = self.server_descriptions().get(address)
275278
return [description] if description else []
276-
elif (self.topology_type == TOPOLOGY_TYPE.Sharded and
277-
not isinstance(selector, _AggWritePref)):
278-
# TODO: adjust _AggWritePref for sharded clusters once we select
279-
# a server.
280-
# Ignore read preference.
281-
selection = Selection.from_topology_description(self)
282-
else:
283-
selection = selector(Selection.from_topology_description(self))
279+
280+
selection = Selection.from_topology_description(self)
281+
# Ignore read preference for sharded clusters.
282+
if self.topology_type != TOPOLOGY_TYPE.Sharded:
283+
selection = selector(selection)
284284

285285
# Apply custom selector followed by localThresholdMS.
286286
if custom_selector is not None and selection:

test/test_read_preferences.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,9 @@ def test_aggregate(self):
433433
[{'$project': {'_id': 1}}])
434434

435435
def test_aggregate_write(self):
436-
self._test_coll_helper(False, self.c.pymongo_test.test,
436+
# 5.0 servers support $out on secondaries.
437+
secondary_ok = client_context.version.at_least(5, 0)
438+
self._test_coll_helper(secondary_ok, self.c.pymongo_test.test,
437439
'aggregate',
438440
[{'$project': {'_id': 1}}, {'$out': "agg_write_test"}])
439441

0 commit comments

Comments
 (0)