Skip to content

Commit a79e2ef

Browse files
committed
RUBY-800 More reliable query route test
1 parent f6280d8 commit a79e2ef

File tree

2 files changed

+65
-61
lines changed

2 files changed

+65
-61
lines changed

tasks/testing.rake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ TEST_SUITES = {
2525
:replica_set => {
2626
:pattern => 'test/replica_set/**/*_test.rb',
2727
:exclude => ['test/replica_set/count_test.rb',
28-
'test/replica_set/read_preference_test.rb',
2928
'test/replica_set/ssl_test.rb']
3029
},
3130
:sharded_cluster => { :pattern => 'test/sharded_cluster/**/*_test.rb' },

test/replica_set/read_preference_test.rb

Lines changed: 65 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
class 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
221226
end

0 commit comments

Comments
 (0)