1717class ReadPreferenceTest < Test ::Unit ::TestCase
1818
1919 def setup
20- ensure_cluster ( :rs , :replicas => 2 , :arbiters => 0 )
20+ ensure_cluster ( :rs )
2121 client = make_connection
2222 db = client . db ( TEST_DB )
2323 coll = db . collection ( 'test-sets' )
@@ -81,90 +81,85 @@ def test_read_routing
8181 prepare_routing_test
8282
8383 # Test that reads are going to the right members
84- assert_query_route ( @primary , @primary_direct )
85- assert_query_route ( @primary_preferred , @primary_direct )
86- assert_query_route ( @secondary , @secondary_direct )
87- assert_query_route ( @secondary_preferred , @secondary_direct )
84+ assert_query_route ( @primary , :primary )
85+ assert_query_route ( @primary_preferred , :primary )
86+ assert_query_route ( @secondary , :secondary )
87+ assert_query_route ( @secondary_preferred , :secondary )
8888 end
8989
9090 def test_read_routing_with_primary_down
9191 prepare_routing_test
9292
9393 # Test that reads are going to the right members
94- assert_query_route ( @primary , @primary_direct )
95- assert_query_route ( @primary_preferred , @primary_direct )
96- assert_query_route ( @secondary , @secondary_direct )
97- assert_query_route ( @secondary_preferred , @secondary_direct )
94+ assert_query_route ( @primary , :primary )
95+ assert_query_route ( @primary_preferred , :primary )
96+ assert_query_route ( @secondary , :secondary )
97+ assert_query_route ( @secondary_preferred , :secondary )
9898
99- # Kill the primary so only a single secondary exists
99+ # Kill the primary so the remaining two members are secondaries
100100 @rs . primary . kill
101101 sleep ( 2 )
102102 # Test that reads are going to the right members
103103 assert_raise_error ConnectionFailure do
104104 @primary [ TEST_DB ] [ 'test-sets' ] . find_one
105105 end
106- assert_query_route ( @primary_preferred , @secondary_direct )
107- assert_query_route ( @secondary , @secondary_direct )
108- assert_query_route ( @secondary_preferred , @secondary_direct )
106+ assert_query_route ( @primary_preferred , :secondary )
107+ assert_query_route ( @secondary , :secondary )
108+ assert_query_route ( @secondary_preferred , :secondary )
109109
110110 # Restore set
111111 @rs . restart
112112 sleep ( 1 )
113113 @repl_cons . each { |con | con . refresh }
114114 sleep ( 1 )
115- @primary_direct = Connection . new (
116- @rs . config [ 'host' ] ,
117- @primary . read_pool . port
118- )
119115
120116 # Test that reads are going to the right members
121- assert_query_route ( @primary , @primary_direct )
122- assert_query_route ( @primary_preferred , @secondary_direct ) # secondary pool is pinned
123- assert_query_route ( @secondary , @secondary_direct )
124- assert_query_route ( @secondary_preferred , @secondary_direct )
117+ assert_query_route ( @primary , :primary )
118+ assert_query_route ( @primary_preferred , :primary )
119+ assert_query_route ( @secondary , :secondary )
120+ assert_query_route ( @secondary_preferred , :secondary )
125121 end
126122
127123 def test_read_routing_with_secondary_down
128124 prepare_routing_test
129125
130126 # Test that reads are going to the right members
131- assert_query_route ( @primary , @primary_direct )
132- assert_query_route ( @primary_preferred , @primary_direct )
133- assert_query_route ( @secondary , @secondary_direct )
134- assert_query_route ( @secondary_preferred , @secondary_direct )
135- @rs . secondaries . first . kill
136-
137- assert_query_route ( @primary_preferred , @primary_direct )
138-
139- primary_read_only = false
140- until primary_read_only
141- config = @primary_direct [ 'admin' ] . command ( :isMaster => 1 )
142- primary_read_only = config [ "secondary" ]
143- sleep ( 1 )
127+ assert_query_route ( @primary , :primary )
128+ assert_query_route ( @primary_preferred , :primary )
129+ assert_query_route ( @secondary , :secondary )
130+ assert_query_route ( @secondary_preferred , :secondary )
131+
132+ secondaries = @rs . secondaries
133+ secondaries [ 0 ] . kill
134+ sleep ( 2 )
135+ assert_query_route ( @secondary_preferred , :secondary )
136+
137+ secondaries [ 1 ] . kill
138+ sleep ( 2 )
139+
140+ recovered = false
141+ until recovered
142+ begin
143+ @secondary_preferred [ TEST_DB ] [ 'test-sets' ] . find_one
144+ recovered = true
145+ rescue ConnectionFailure
146+ end
144147 end
145- assert_query_route ( @secondary_preferred , @primary_direct )
148+
149+ assert_query_route ( @secondary_preferred , :secondary )
150+ assert_query_route ( @primary_preferred , :secondary )
146151
147152 # Restore set
148153 @rs . restart
149154 sleep ( 1 )
150155 @repl_cons . each { |con | con . refresh }
151156 sleep ( 1 )
152157
153- true_secondary = [ @primary_direct , @secondary_direct ] . find do |client |
154- client [ 'admin' ] . command ( :isMaster => 1 ) [ 'secondary' ]
155- end
156-
157- true_primary = [ @primary_direct , @secondary_direct ] . find do |client |
158- client [ 'admin' ] . command ( :isMaster => 1 ) [ 'primary' ]
159- end
160-
161- @secondary_direct , @primary_direct = true_secondary , true_primary
162-
163158 # Test that reads are going to the right members
164- assert_query_route ( @primary , @primary_direct )
165- assert_query_route ( @primary_preferred , @primary_direct )
166- assert_query_route ( @secondary , @secondary_direct )
167- assert_query_route ( @secondary_preferred , @primary_direct ) # primary pool is pinned
159+ assert_query_route ( @primary , :primary )
160+ assert_query_route ( @primary_preferred , :primary )
161+ assert_query_route ( @secondary , :secondary )
162+ assert_query_route ( @secondary_preferred , :secondary )
168163 end
169164
170165 def test_write_lots_of_data
@@ -191,11 +186,17 @@ def prepare_routing_test
191186 @secondary_preferred = make_connection ( :secondary_preferred )
192187 @repl_cons = [ @primary , @primary_preferred , @secondary , @secondary_preferred ]
193188
194- # Setup direct connections
195- @primary_direct = MongoClient . new ( @rs . config [ 'host' ] , @primary . read_pool . port , :slave_ok => true )
196- authenticate_client ( @primary_direct )
197- @secondary_direct = MongoClient . new ( @rs . config [ 'host' ] , @secondary . read_pool . port , :slave_ok => true )
198- authenticate_client ( @secondary_direct )
189+ @repl_cons . each do |client |
190+ client . stubs ( :pinned_pool ) . returns ( nil )
191+ end
192+
193+ @secondaries = [ ]
194+ @rs . repl_set_seeds . each do |host_port |
195+ host , port = host_port . split ( ':' )
196+ client = MongoClient . new ( host , port , :slave_ok => true )
197+ authenticate_client ( client )
198+ secondary? ( client ) ? @secondaries << client : @primary_direct = client
199+ end
199200 end
200201
201202 def make_connection ( mode = :primary , opts = { } )
@@ -208,14 +209,18 @@ def query_count(connection)
208209 connection [ 'admin' ] . command ( { :serverStatus => 1 } ) [ 'opcounters' ] [ 'query' ]
209210 end
210211
211- def assert_query_route ( test_connection , expected_target )
212+ def assert_query_route ( test_connection , type )
213+ secondary = type == :secondary
212214 authenticate_client ( test_connection )
213- authenticate_client ( expected_target )
214- queries_before = query_count ( expected_target )
215+ cursor = test_connection [ TEST_DB ] [ 'test-sets' ] . find
215216 assert_nothing_raised do
216- test_connection [ TEST_DB ] [ 'test-sets' ] . find_one
217+ cursor . next
217218 end
218- queries_after = query_count ( expected_target )
219- assert_equal 1 , queries_after - queries_before
219+ pool = cursor . instance_variable_get ( "@pool" )
220+ assert_equal secondary , secondary? ( MongoClient . new ( pool . host , pool . port ) )
221+ end
222+
223+ def secondary? ( client )
224+ client [ 'admin' ] . command ( :isMaster => 1 ) [ 'secondary' ]
220225 end
221226end
0 commit comments