@@ -183,4 +183,59 @@ def test_sentinel_role_mismatch
183183
184184 assert_match /Instance role mismatch/ , ex . message
185185 end
186+
187+ def test_sentinel_retries
188+ sentinels = [ { :host => "127.0.0.1" , :port => 26381 } ,
189+ { :host => "127.0.0.1" , :port => 26382 } ]
190+
191+ connections = [ ]
192+
193+ handler = lambda do |id |
194+ {
195+ :sentinel => lambda do |command , *args |
196+ connections << id
197+
198+ if connections . count ( id ) < 2
199+ :close
200+ else
201+ [ "127.0.0.1" , "6382" ]
202+ end
203+ end
204+ }
205+ end
206+
207+ master = {
208+ :role => lambda do
209+ [ "master" ]
210+ end
211+ }
212+
213+ RedisMock . start ( master , { } , 6382 ) do
214+ RedisMock . start ( handler . call ( :s1 ) , { } , 26381 ) do
215+ RedisMock . start ( handler . call ( :s2 ) , { } , 26382 ) do
216+ redis = Redis . new ( :url => "redis://master1" , :sentinels => sentinels , :role => :master , :reconnect_attempts => 1 )
217+
218+ assert redis . ping
219+ end
220+ end
221+ end
222+
223+ assert_equal [ :s1 , :s2 , :s1 ] , connections
224+
225+ connections . clear
226+
227+ ex = assert_raise ( Redis ::CannotConnectError ) do
228+ RedisMock . start ( master , { } , 6382 ) do
229+ RedisMock . start ( handler . call ( :s1 ) , { } , 26381 ) do
230+ RedisMock . start ( handler . call ( :s2 ) , { } , 26382 ) do
231+ redis = Redis . new ( :url => "redis://master1" , :sentinels => sentinels , :role => :master , :reconnect_attempts => 0 )
232+
233+ assert redis . ping
234+ end
235+ end
236+ end
237+ end
238+
239+ assert_match /No sentinels available/ , ex . message
240+ end
186241end
0 commit comments