redis-sentinel 1.4.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/redis-sentinel/client.rb +15 -13
- data/lib/redis-sentinel/version.rb +1 -1
- data/spec/redis-sentinel/client_spec.rb +30 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a79a501844ac25c4bdde61c4801a75e65d22bd0d
|
4
|
+
data.tar.gz: f40c099446f5b31cc8558aaacb06f8e325381d5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83f3892eacb138abf90d169bb452dc59ff46d91cc25f2581c1278cbf48e026ccc16006db28d92b7041d8c8ce2d2331876619567e1287e713eb3910c27ec70596
|
7
|
+
data.tar.gz: 90c948ebe4d6bfa1a8a105d79d6e9569cd88cc63988f02c961c11a03f2c3450b63a02de33f6d38bfc1fef71e3b38ce14860f9219dc041bc6424a9a93d316d77e
|
data/CHANGELOG.md
CHANGED
@@ -36,7 +36,7 @@ class Redis::Client
|
|
36
36
|
alias connect connect_with_sentinel
|
37
37
|
|
38
38
|
def sentinel?
|
39
|
-
@master_name && @sentinels_options
|
39
|
+
!!(@master_name && @sentinels_options)
|
40
40
|
end
|
41
41
|
|
42
42
|
def auto_retry_with_timeout(&block)
|
@@ -59,10 +59,10 @@ class Redis::Client
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def refresh_sentinels_list
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
current_sentinel.sentinel("sentinels", @master_name).each do |response|
|
63
|
+
@sentinels_options << {:host => response[3], :port => response[5]}
|
64
|
+
end
|
65
|
+
@sentinels_options.uniq! {|h| h.values_at(:host, :port) }
|
66
66
|
end
|
67
67
|
|
68
68
|
def discover_master
|
@@ -79,8 +79,8 @@ class Redis::Client
|
|
79
79
|
else
|
80
80
|
# A null reply
|
81
81
|
end
|
82
|
-
rescue Redis::CommandError
|
83
|
-
|
82
|
+
rescue Redis::CommandError => e
|
83
|
+
raise unless e.message.include?("IDONTKNOW")
|
84
84
|
rescue Redis::CannotConnectError
|
85
85
|
# faile to connect to current sentinel server
|
86
86
|
end
|
@@ -120,14 +120,16 @@ class Redis::Client
|
|
120
120
|
return if options.nil?
|
121
121
|
|
122
122
|
sentinel_options = []
|
123
|
-
options.each do |
|
124
|
-
if
|
125
|
-
|
123
|
+
options.each do |opts|
|
124
|
+
opts = opts[:url] if opts.is_a?(Hash) && opts.key?(:url)
|
125
|
+
case opts
|
126
|
+
when Hash
|
127
|
+
sentinel_options << opts
|
126
128
|
else
|
127
|
-
uri = URI.parse(
|
129
|
+
uri = URI.parse(opts)
|
128
130
|
sentinel_options << {
|
129
|
-
|
130
|
-
|
131
|
+
host: uri.host,
|
132
|
+
port: uri.port
|
131
133
|
}
|
132
134
|
end
|
133
135
|
end
|
@@ -2,12 +2,13 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Redis::Client do
|
4
4
|
let(:client) { double("Client", :reconnect => true) }
|
5
|
-
let(:current_sentinel) { double("Redis", :client => client
|
5
|
+
let(:current_sentinel) { double("Redis", :client => client) }
|
6
6
|
|
7
7
|
let(:sentinels) do
|
8
8
|
[
|
9
9
|
{ :host => "localhost", :port => 26379 },
|
10
|
-
'sentinel://localhost:26380'
|
10
|
+
'sentinel://localhost:26380',
|
11
|
+
{ :url => 'sentinel://localhost:26381' },
|
11
12
|
]
|
12
13
|
end
|
13
14
|
|
@@ -16,6 +17,16 @@ describe Redis::Client do
|
|
16
17
|
|
17
18
|
before { allow(Redis).to receive(:new).and_return(current_sentinel) }
|
18
19
|
|
20
|
+
context "new instances" do
|
21
|
+
it "should parse sentinel options" do
|
22
|
+
expect(subject.instance_variable_get(:@sentinels_options)).to eq [
|
23
|
+
{:host=>"localhost", :port=>26379},
|
24
|
+
{:host=>"localhost", :port=>26380},
|
25
|
+
{:host=>"localhost", :port=>26381}
|
26
|
+
]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
19
30
|
context "#sentinel?" do
|
20
31
|
it "should be true if passing sentiels and master_name options" do
|
21
32
|
expect(subject).to be_sentinel
|
@@ -57,13 +68,15 @@ describe Redis::Client do
|
|
57
68
|
allow(subject).to receive(:current_sentinel).and_return(current_sentinel)
|
58
69
|
expect(current_sentinel).to receive(:sentinel).with("sentinels", "master").and_return([
|
59
70
|
["name", "localhost:26381", "ip", "localhost", "port", 26380],
|
60
|
-
["name", "localhost:26381", "ip", "localhost", "port", 26381]
|
71
|
+
["name", "localhost:26381", "ip", "localhost", "port", 26381],
|
72
|
+
["name", "localhost:26381", "ip", "localhost", "port", 26382],
|
61
73
|
])
|
62
74
|
subject.refresh_sentinels_list
|
63
75
|
expect(subject.instance_variable_get(:@sentinels_options)).to eq [
|
64
76
|
{:host => "localhost", :port => 26379},
|
65
77
|
{:host => "localhost", :port => 26380},
|
66
|
-
{:host => "localhost", :port => 26381}
|
78
|
+
{:host => "localhost", :port => 26381},
|
79
|
+
{:host => "localhost", :port => 26382},
|
67
80
|
]
|
68
81
|
end
|
69
82
|
end
|
@@ -90,6 +103,19 @@ describe Redis::Client do
|
|
90
103
|
expect(subject.port).to eq 8888
|
91
104
|
end
|
92
105
|
|
106
|
+
it "selects next sentinel if sentinel doesn't know" do
|
107
|
+
expect(current_sentinel).to receive(:sentinel).with("get-master-addr-by-name", "master").and_raise(Redis::CommandError.new("IDONTKNOW: No idea"))
|
108
|
+
expect(current_sentinel).to receive(:sentinel).with("get-master-addr-by-name", "master").and_return(["master", 8888])
|
109
|
+
subject.discover_master
|
110
|
+
expect(subject.host).to eq "master"
|
111
|
+
expect(subject.port).to eq 8888
|
112
|
+
end
|
113
|
+
|
114
|
+
it "raises error if try_next_sentinel raises error" do
|
115
|
+
expect(current_sentinel).to receive(:sentinel).with("get-master-addr-by-name", "master").and_raise(Redis::CommandError.new("ERR: No such command"))
|
116
|
+
expect { subject.discover_master }.to raise_error(Redis::CommandError)
|
117
|
+
end
|
118
|
+
|
93
119
|
it "raises error if try_next_sentinel raises error" do
|
94
120
|
expect(subject).to receive(:try_next_sentinel).and_raise(Redis::CannotConnectError)
|
95
121
|
expect { subject.discover_master }.to raise_error(Redis::CannotConnectError)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-sentinel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
148
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.2.1
|
150
150
|
signing_key:
|
151
151
|
specification_version: 4
|
152
152
|
summary: another redis automatic master/slave failover solution for ruby by using
|