Skip to content

Commit 0a8a115

Browse files
nelhageTylerBrock
authored andcommitted
mongos expects read preferences to be strings, not symbols.
This should actually fix RUBY-542. Without this, using read preferences with a mongos cluster that's backed by replica sets will error with wrong type for field (mode) 14 != 2 This is raised by _extraReadPref in dbclient_rs.cpp, when it does: const string mode = prefDoc["mode"].String(); BSON type 14 (0xE) is the (deprecated) Symbol type, and type 2 is String, so this indicates that mongos is getting a symbol when it expects a string. The sharding tests passed either way because they don't actually construct replica sets for the shards, and _extractReadPref is only used by DBClientReplicaSet. Thus, the $readPreference field passed to mongos is completely ignored by the test mongoS, and not even parsed.
1 parent e295081 commit 0a8a115

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

lib/mongo/util/read_preference.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ module ReadPreference
99
]
1010

1111
MONGOS_MODES = {
12-
:primary => :primary,
13-
:primary_preferred => :primaryPreferred,
14-
:secondary => :secondary,
15-
:secondary_preferred => :secondaryPreferred,
16-
:nearest => :nearest
12+
:primary => 'primary',
13+
:primary_preferred => 'primaryPreferred',
14+
:secondary => 'secondary',
15+
:secondary_preferred => 'secondaryPreferred',
16+
:nearest => 'nearest'
1717
}
1818

1919
def self.mongos(mode, tag_sets)

test/sharded_cluster/basic_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_read_from_client
3636
@client = MongoClient.new(host, port, {:read => :secondary, :tag_sets => tags})
3737
assert @client.connected?
3838
cursor = Cursor.new(@client[MONGO_TEST_DB]['whatever'], {})
39-
assert_equal cursor.construct_query_spec['$readPreference'], {:mode => :secondary, :tags => tags}
39+
assert_equal cursor.construct_query_spec['$readPreference'], {:mode => 'secondary', :tags => tags}
4040
end
4141

4242
def test_find_one_with_read_secondary
@@ -68,7 +68,7 @@ def test_read_from_sharded_client
6868
@client = MongoShardedClient.new(@seeds, {:read => :secondary, :tag_sets => tags})
6969
assert @client.connected?
7070
cursor = Cursor.new(@client[MONGO_TEST_DB]['whatever'], {})
71-
assert_equal cursor.construct_query_spec['$readPreference'], {:mode => :secondary, :tags => tags}
71+
assert_equal cursor.construct_query_spec['$readPreference'], {:mode => 'secondary', :tags => tags}
7272
end
7373

7474
def test_hard_refresh

test/unit/cursor_test.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,47 +124,47 @@ class Mongo::Cursor
124124

125125
spec = cursor.construct_query_spec
126126
assert spec.has_key?('$readPreference')
127-
assert_equal :secondary, spec['$readPreference'][:mode]
127+
assert_equal 'secondary', spec['$readPreference'][:mode]
128128
assert !spec['$readPreference'].has_key?(:tags)
129129

130130
# secondary preferred with tags
131131
cursor = Cursor.new(@collection, { :read => :secondary_preferred, :tag_sets => @tag_sets })
132132

133133
spec = cursor.construct_query_spec
134134
assert spec.has_key?('$readPreference')
135-
assert_equal :secondaryPreferred, spec['$readPreference'][:mode]
135+
assert_equal 'secondaryPreferred', spec['$readPreference'][:mode]
136136
assert_equal @tag_sets, spec['$readPreference'][:tags]
137137

138138
# primary preferred
139139
cursor = Cursor.new(@collection, { :read => :primary_preferred })
140140

141141
spec = cursor.construct_query_spec
142142
assert spec.has_key?('$readPreference')
143-
assert_equal :primaryPreferred, spec['$readPreference'][:mode]
143+
assert_equal 'primaryPreferred', spec['$readPreference'][:mode]
144144
assert !spec['$readPreference'].has_key?(:tags)
145145

146146
# primary preferred with tags
147147
cursor = Cursor.new(@collection, { :read => :primary_preferred, :tag_sets => @tag_sets })
148148

149149
spec = cursor.construct_query_spec
150150
assert spec.has_key?('$readPreference')
151-
assert_equal :primaryPreferred, spec['$readPreference'][:mode]
151+
assert_equal 'primaryPreferred', spec['$readPreference'][:mode]
152152
assert_equal @tag_sets, spec['$readPreference'][:tags]
153153

154154
# nearest
155155
cursor = Cursor.new(@collection, { :read => :nearest })
156156

157157
spec = cursor.construct_query_spec
158158
assert spec.has_key?('$readPreference')
159-
assert_equal :nearest, spec['$readPreference'][:mode]
159+
assert_equal 'nearest', spec['$readPreference'][:mode]
160160
assert !spec['$readPreference'].has_key?(:tags)
161161

162162
# nearest with tags
163163
cursor = Cursor.new(@collection, { :read => :nearest, :tag_sets => @tag_sets })
164164

165165
spec = cursor.construct_query_spec
166166
assert spec.has_key?('$readPreference')
167-
assert_equal :nearest, spec['$readPreference'][:mode]
167+
assert_equal 'nearest', spec['$readPreference'][:mode]
168168
assert_equal @tag_sets, spec['$readPreference'][:tags]
169169
end
170170

0 commit comments

Comments
 (0)