Skip to content

Commit 553f887

Browse files
committed
PYTHON-1104 Change server-selector signature.
Preparation for maxStalenessMS implementation: selectors now take a TopologyDescription, not a list of ServerDescriptions.
1 parent 893f280 commit 553f887

File tree

3 files changed

+40
-54
lines changed

3 files changed

+40
-54
lines changed

pymongo/read_preferences.py

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ class Primary(_ServerMode):
151151
def __init__(self):
152152
super(Primary, self).__init__(_PRIMARY)
153153

154-
def __call__(self, server_descriptions):
155-
"""Return matching ServerDescriptions from a list."""
156-
return writable_server_selector(server_descriptions)
154+
def __call__(self, td):
155+
"""Return matching ServerDescriptions from a TopologyDescription."""
156+
return writable_server_selector(td)
157157

158158
def __repr__(self):
159159
return "Primary()"
@@ -182,15 +182,13 @@ class PrimaryPreferred(_ServerMode):
182182
def __init__(self, tag_sets=None):
183183
super(PrimaryPreferred, self).__init__(_PRIMARY_PREFERRED, tag_sets)
184184

185-
def __call__(self, server_descriptions):
186-
"""Return matching ServerDescriptions from a list."""
187-
writable_servers = writable_server_selector(server_descriptions)
185+
def __call__(self, td):
186+
"""Return matching ServerDescriptions from a TopologyDescription."""
187+
writable_servers = writable_server_selector(td)
188188
if writable_servers:
189189
return writable_servers
190190
else:
191-
return secondary_with_tags_server_selector(
192-
self.tag_sets,
193-
server_descriptions)
191+
return secondary_with_tags_server_selector(self.tag_sets, td)
194192

195193

196194
class Secondary(_ServerMode):
@@ -210,11 +208,9 @@ class Secondary(_ServerMode):
210208
def __init__(self, tag_sets=None):
211209
super(Secondary, self).__init__(_SECONDARY, tag_sets)
212210

213-
def __call__(self, server_descriptions):
214-
"""Return matching ServerDescriptions from a list."""
215-
return secondary_with_tags_server_selector(
216-
self.tag_sets,
217-
server_descriptions)
211+
def __call__(self, td):
212+
"""Return matching ServerDescriptions from a TopologyDescription."""
213+
return secondary_with_tags_server_selector(self.tag_sets, td)
218214

219215

220216
class SecondaryPreferred(_ServerMode):
@@ -234,16 +230,14 @@ class SecondaryPreferred(_ServerMode):
234230
def __init__(self, tag_sets=None):
235231
super(SecondaryPreferred, self).__init__(_SECONDARY_PREFERRED, tag_sets)
236232

237-
def __call__(self, server_descriptions):
238-
"""Return matching ServerDescriptions from a list."""
239-
secondaries = secondary_with_tags_server_selector(
240-
self.tag_sets,
241-
server_descriptions)
233+
def __call__(self, td):
234+
"""Return matching ServerDescriptions from a TopologyDescription."""
235+
secondaries = secondary_with_tags_server_selector(self.tag_sets, td)
242236

243237
if secondaries:
244238
return secondaries
245239
else:
246-
return writable_server_selector(server_descriptions)
240+
return writable_server_selector(td)
247241

248242

249243
class Nearest(_ServerMode):
@@ -263,11 +257,9 @@ class Nearest(_ServerMode):
263257
def __init__(self, tag_sets=None):
264258
super(Nearest, self).__init__(_NEAREST, tag_sets)
265259

266-
def __call__(self, server_descriptions):
267-
"""Return matching ServerDescriptions from a list."""
268-
return member_with_tags_server_selector(
269-
self.tag_sets or [{}],
270-
server_descriptions)
260+
def __call__(self, td):
261+
"""Return matching ServerDescriptions from a TopologyDescription."""
262+
return member_with_tags_server_selector(self.tag_sets or [{}], td)
271263

272264

273265
_ALL_READ_PREFERENCES = (Primary, PrimaryPreferred,

pymongo/server_selectors.py

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,39 @@
1212
# implied. See the License for the specific language governing
1313
# permissions and limitations under the License.
1414

15-
"""Criteria to select some ServerDescriptions out of a list."""
15+
"""Criteria to select some ServerDescriptions from a TopologyDescription."""
1616

1717
from pymongo.server_type import SERVER_TYPE
1818

1919

20-
def any_server_selector(server_descriptions):
21-
return server_descriptions
20+
def any_server_selector(td):
21+
return td.known_servers
2222

2323

24-
def readable_server_selector(server_descriptions):
25-
return [s for s in server_descriptions if s.is_readable]
24+
def readable_server_selector(td):
25+
return [s for s in td.known_servers if s.is_readable]
2626

2727

28-
def writable_server_selector(server_descriptions):
29-
return [s for s in server_descriptions if s.is_writable]
28+
def writable_server_selector(td):
29+
return [s for s in td.known_servers if s.is_writable]
3030

3131

32-
def secondary_server_selector(server_descriptions):
33-
return [s for s in server_descriptions
32+
def secondary_server_selector(td):
33+
return [s for s in td.known_servers
3434
if s.server_type == SERVER_TYPE.RSSecondary]
3535

3636

37-
def arbiter_server_selector(server_descriptions):
38-
return [s for s in server_descriptions
37+
def arbiter_server_selector(td):
38+
return [s for s in td.known_servers
3939
if s.server_type == SERVER_TYPE.RSArbiter]
4040

4141

42-
def writable_preferred_server_selector(server_descriptions):
42+
def writable_preferred_server_selector(td):
4343
"""Like PrimaryPreferred but doesn't use tags or latency."""
44-
return (
45-
writable_server_selector(server_descriptions) or
46-
secondary_server_selector(server_descriptions))
44+
return writable_server_selector(td) or secondary_server_selector(td)
4745

4846

49-
def single_tag_set_server_selector(tag_set, server_descriptions):
47+
def apply_single_tag_set(tag_set, server_descriptions):
5048
"""All servers matching one tag set.
5149
5250
A tag set is a dict. A server matches if its tags are a superset:
@@ -69,7 +67,7 @@ def tags_match(server_tags):
6967
return [s for s in server_descriptions if tags_match(s.tags)]
7068

7169

72-
def tag_sets_server_selector(tag_sets, server_descriptions):
70+
def apply_tag_sets(tag_sets, server_descriptions):
7371
"""All servers match a list of tag sets.
7472
7573
tag_sets is a list of dicts. The empty tag set {} matches any server,
@@ -84,7 +82,7 @@ def tag_sets_server_selector(tag_sets, server_descriptions):
8482
first.
8583
"""
8684
for tag_set in tag_sets:
87-
selected = single_tag_set_server_selector(tag_set, server_descriptions)
85+
selected = apply_single_tag_set(tag_set, server_descriptions)
8886
if selected:
8987
return selected
9088

@@ -115,13 +113,11 @@ def apply_local_threshold(latency_ms, server_descriptions):
115113
if (s.round_trip_time - fastest) <= latency_ms / 1000.]
116114

117115

118-
def secondary_with_tags_server_selector(tag_sets, server_descriptions):
116+
def secondary_with_tags_server_selector(tag_sets, td):
119117
"""All near-enough secondaries matching the tag sets."""
120-
return tag_sets_server_selector(
121-
tag_sets, secondary_server_selector(server_descriptions))
118+
return apply_tag_sets(tag_sets, secondary_server_selector(td))
122119

123120

124-
def member_with_tags_server_selector(tag_sets, server_descriptions):
121+
def member_with_tags_server_selector(tag_sets, td):
125122
"""All near-enough members matching the tag sets."""
126-
return tag_sets_server_selector(
127-
tag_sets, readable_server_selector(server_descriptions))
123+
return apply_tag_sets(tag_sets, readable_server_selector(td))

pymongo/topology.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,7 @@ def get_primary(self):
284284
if topology_type != TOPOLOGY_TYPE.ReplicaSetWithPrimary:
285285
return None
286286

287-
description = writable_server_selector(
288-
self._description.known_servers)[0]
289-
287+
description = writable_server_selector(self._description)[0]
290288
return description.address
291289

292290
def _get_replica_set_members(self, selector):
@@ -298,7 +296,7 @@ def _get_replica_set_members(self, selector):
298296
TOPOLOGY_TYPE.ReplicaSetNoPrimary):
299297
return set()
300298

301-
descriptions = selector(self._description.known_servers)
299+
descriptions = selector(self._description)
302300
return set([d.address for d in descriptions])
303301

304302
def get_secondaries(self):
@@ -417,7 +415,7 @@ def _apply_selector(self, selector, address):
417415
return apply_local_threshold(self._settings.local_threshold_ms,
418416
self._description.known_servers)
419417
else:
420-
sds = selector(self._description.known_servers)
418+
sds = selector(self._description)
421419
return apply_local_threshold(
422420
self._settings.local_threshold_ms, sds)
423421

0 commit comments

Comments
 (0)