Skip to content

Commit 9f07ff3

Browse files
wronglinkShaneHarvey
authored andcommitted
PYTHON-1334 Don't change readpreference value at uri parsing (mongodb#325)
1 parent 9388281 commit 9f07ff3

File tree

5 files changed

+39
-19
lines changed

5 files changed

+39
-19
lines changed

pymongo/client_options.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
from pymongo.monitoring import _EventListeners
2323
from pymongo.pool import PoolOptions
2424
from pymongo.read_concern import ReadConcern
25-
from pymongo.read_preferences import make_read_preference
25+
from pymongo.read_preferences import (make_read_preference,
26+
read_pref_mode_from_name)
2627
from pymongo.ssl_support import get_ssl_context
2728
from pymongo.write_concern import WriteConcern
2829

@@ -42,7 +43,8 @@ def _parse_read_preference(options):
4243
if 'read_preference' in options:
4344
return options['read_preference']
4445

45-
mode = options.get('readpreference', 0)
46+
name = options.get('readpreference', 'primary')
47+
mode = read_pref_mode_from_name(name)
4648
tags = options.get('readpreferencetags')
4749
max_staleness = options.get('maxstalenessseconds', -1)
4850
return make_read_preference(mode, tags, max_staleness)

pymongo/common.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
from pymongo.errors import ConfigurationError
2929
from pymongo.monitoring import _validate_event_listeners
3030
from pymongo.read_concern import ReadConcern
31-
from pymongo.read_preferences import (read_pref_mode_from_name,
32-
_ServerMode)
31+
from pymongo.read_preferences import _MONGOS_MODES, _ServerMode
3332
from pymongo.ssl_support import validate_cert_reqs
3433
from pymongo.write_concern import WriteConcern
3534

@@ -302,13 +301,12 @@ def validate_read_preference(dummy, value):
302301
return value
303302

304303

305-
def validate_read_preference_mode(dummy, name):
304+
def validate_read_preference_mode(dummy, value):
306305
"""Validate read preference mode for a MongoReplicaSetClient.
307306
"""
308-
try:
309-
return read_pref_mode_from_name(name)
310-
except ValueError:
311-
raise ValueError("%s is not a valid read preference" % (name,))
307+
if value not in _MONGOS_MODES:
308+
raise ValueError("%s is not a valid read preference" % (value,))
309+
return value
312310

313311

314312
def validate_auth_mechanism(option, value):

pymongo/read_preferences.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ def name(self):
101101
"""
102102
return self.__class__.__name__
103103

104+
@property
105+
def mongos_mode(self):
106+
"""The mongos mode of this read preference.
107+
"""
108+
return self.__mongos_mode
109+
104110
@property
105111
def document(self):
106112
"""Read preference as a document.

test/test_client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ def test_primary_read_pref_with_tags(self):
203203
MongoClient('mongodb://host/?'
204204
'readpreference=primary&readpreferencetags=dc:east')
205205

206+
def test_read_preference(self):
207+
c = rs_or_single_client(
208+
"mongodb://host", connect=False,
209+
readpreference=ReadPreference.NEAREST.mongos_mode)
210+
self.assertEqual(c.read_preference, ReadPreference.NEAREST)
211+
206212
def test_metadata(self):
207213
metadata = _METADATA.copy()
208214
metadata['application'] = {'name': 'foobar'}

test/test_uri_parser.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,9 @@ def test_parse_uri(self):
338338
res, parse_uri("mongodb://localhost/test.name/with \"delimiters"))
339339

340340
res = copy.deepcopy(orig)
341-
res['options'] = {'readpreference': ReadPreference.SECONDARY.mode}
341+
res['options'] = {
342+
'readpreference': ReadPreference.SECONDARY.mongos_mode
343+
}
342344
self.assertEqual(res, parse_uri(
343345
"mongodb://localhost/?readPreference=secondary"))
344346

@@ -395,10 +397,13 @@ def test_parse_uri(self):
395397
"@localhost/foo?authMechanism=GSSAPI"))
396398

397399
res = copy.deepcopy(orig)
398-
res['options'] = {'readpreference': ReadPreference.SECONDARY.mode,
399-
'readpreferencetags': [
400-
{'dc': 'west', 'use': 'website'},
401-
{'dc': 'east', 'use': 'website'}]}
400+
res['options'] = {
401+
'readpreference': ReadPreference.SECONDARY.mongos_mode,
402+
'readpreferencetags': [
403+
{'dc': 'west', 'use': 'website'},
404+
{'dc': 'east', 'use': 'website'}
405+
]
406+
}
402407
res['username'] = 'user@domain.com'
403408
res['password'] = 'password'
404409
res['database'] = 'foo'
@@ -409,11 +414,14 @@ def test_parse_uri(self):
409414
"readpreferencetags=dc:east,use:website"))
410415

411416
res = copy.deepcopy(orig)
412-
res['options'] = {'readpreference': ReadPreference.SECONDARY.mode,
413-
'readpreferencetags': [
414-
{'dc': 'west', 'use': 'website'},
415-
{'dc': 'east', 'use': 'website'},
416-
{}]}
417+
res['options'] = {
418+
'readpreference': ReadPreference.SECONDARY.mongos_mode,
419+
'readpreferencetags': [
420+
{'dc': 'west', 'use': 'website'},
421+
{'dc': 'east', 'use': 'website'},
422+
{}
423+
]
424+
}
417425
res['username'] = 'user@domain.com'
418426
res['password'] = 'password'
419427
res['database'] = 'foo'

0 commit comments

Comments
 (0)