redis-sentinel 1.4.3 → 1.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89f65c37fc86df6375c442c0f8aad24eb6d02b7e
4
- data.tar.gz: 77ed5c965346ca00f5ce1aec7d30e5a2109ebf7a
3
+ metadata.gz: 85e2d012825c2c5f740cd1f33ea4f1f6ac5e8c4a
4
+ data.tar.gz: 3d21614c18f64cf3e2912521f5390a1eee03fb01
5
5
  SHA512:
6
- metadata.gz: e486e2b913b004c0ed6fd09c6d80ca905e3f6026d27c523115f9b08895356e761a0def2ecc551a799b554e3a3fe558e3580246e3cc07f7aec0564ff9582ff2de
7
- data.tar.gz: 60f1261aff29cf43b2304efb67606e1d631e28a1a711f2b71683d86566845981bc2b86581d66cb528dcba170d4ccd8868ee9ada163dbeb257cab6a33d395a322
6
+ metadata.gz: b5a62c1d6196a9ae88ee0609af812c98345087ec287f0860f9c5f7da61d5cb420ac7d61849257048e49c2c540cfcd17d75440f6d786e29f121cbe83536747167
7
+ data.tar.gz: b2186c8627bea8d15615401648b78f15180ffbadf3fa4e25731bc6c54c263cd658b4685c4da3349583f3f7e19a8f80605b409782d0848fdea22c18b11cafd1f7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.4.4
4
+
5
+ * Allow client to return list of slaves
6
+ * Fix compatibility issues with ruby 1.8.7
7
+
3
8
  ## 1.4.3
4
9
 
5
10
  * Fix for pipelined requests and readonly calls
data/README.md CHANGED
@@ -46,6 +46,20 @@ There are two additional options:
46
46
  2. `:failover_reconnect_wait` (seconds) how long to sleep after each
47
47
  failed reconnect during a failover event. Defaults to 0.1s.
48
48
 
49
+ ## Slaves clients
50
+
51
+ If you need it, you can get an array of Redis clients, each pointing to one of the slaves:
52
+
53
+ client = Redis.new(master_name: "master1", sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}])
54
+ client.slaves
55
+ # => [#<Redis client v3.0.7 for redis://127.0.0.1:6380/0>, #<Redis client v3.0.7 for redis://127.0.0.1:6381/0>]
56
+
57
+ You can also get an array of all the clients (master + slaves):
58
+
59
+ client = Redis.new(master_name: "master1", sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}])
60
+ client.all_clients
61
+ # => [#<Redis client v3.0.7 for redis://127.0.0.1:6379/0>, #<Redis client v3.0.7 for redis://127.0.0.1:6380/0>, #<Redis client v3.0.7 for redis://127.0.0.1:6381/0>]
62
+
49
63
  ## Example
50
64
 
51
65
  Start redis master server, listen on port 16379
data/Rakefile CHANGED
@@ -16,4 +16,12 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
16
16
  spec.pattern = "spec/**/*_spec.rb"
17
17
  end
18
18
 
19
+ task :console do
20
+ require 'irb'
21
+ require 'irb/completion'
22
+ require 'redis-sentinel'
23
+ ARGV.clear
24
+ IRB.start
25
+ end
26
+
19
27
  task :default => :spec
@@ -1,2 +1,3 @@
1
1
  require "redis-sentinel/version"
2
2
  require "redis-sentinel/client"
3
+ require "redis-sentinel/redis"
@@ -87,6 +87,36 @@ class Redis::Client
87
87
  end
88
88
  end
89
89
 
90
+ def discover_slaves
91
+ while true
92
+ try_next_sentinel
93
+
94
+ begin
95
+ slaves_info = current_sentinel.sentinel("slaves", @master_name)
96
+ @slaves = slaves_info.map do |info|
97
+ info = Hash[*info]
98
+ ::Redis.new :host => info['ip'], :port => info['port'], :driver => info[:driver]
99
+ end
100
+
101
+ break
102
+ rescue Redis::CommandError => e
103
+ raise unless e.message.include?("IDONTKNOW")
104
+ rescue Redis::CannotConnectError
105
+ # failed to connect to current sentinel server
106
+ end
107
+ end
108
+ end
109
+
110
+ def slaves
111
+ discover_slaves
112
+ @slaves
113
+ end
114
+
115
+ def all_clients
116
+ clients = slaves
117
+ clients.unshift ::Redis.new @options
118
+ end
119
+
90
120
  def disconnect_with_sentinels
91
121
  current_sentinel.client.disconnect if current_sentinel
92
122
  disconnect_without_sentinels
@@ -140,8 +170,8 @@ class Redis::Client
140
170
  else
141
171
  uri = URI.parse(opts)
142
172
  sentinel_options << {
143
- host: uri.host,
144
- port: uri.port
173
+ :host => uri.host,
174
+ :port => uri.port
145
175
  }
146
176
  end
147
177
  end
@@ -0,0 +1,13 @@
1
+ require "redis"
2
+
3
+ class Redis
4
+ class_eval do
5
+ def slaves
6
+ client.slaves
7
+ end
8
+
9
+ def all_clients
10
+ client.all_clients
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  class Redis
2
2
  module Sentinel
3
- VERSION = "1.4.3"
3
+ VERSION = "1.4.4"
4
4
  end
5
5
  end
@@ -12,11 +12,17 @@ describe Redis::Client do
12
12
  ]
13
13
  end
14
14
 
15
+ let(:slaves_reply) do
16
+ [
17
+ ["ip", "slave-0", "port", "6379"],
18
+ ["ip", "slave-1", "port", "6380"],
19
+ ["ip", "slave-2", "port", "6381"]
20
+ ]
21
+ end
22
+
15
23
  subject { Redis::Client.new(:master_name => "master", :master_password => "foobar",
16
24
  :sentinels => sentinels) }
17
25
 
18
- before { allow(Redis).to receive(:new).and_return(current_sentinel) }
19
-
20
26
  context "new instances" do
21
27
  it "should parse sentinel options" do
22
28
  expect(subject.instance_variable_get(:@sentinels_options)).to eq [
@@ -58,6 +64,8 @@ describe Redis::Client do
58
64
  end
59
65
 
60
66
  context "#try_next_sentinel" do
67
+ before { allow(Redis).to receive(:new).and_return(current_sentinel) }
68
+
61
69
  it "returns next sentinel server" do
62
70
  expect(subject.try_next_sentinel).to eq current_sentinel
63
71
  end
@@ -122,6 +130,32 @@ describe Redis::Client do
122
130
  end
123
131
  end
124
132
 
133
+ context "#discover_slaves" do
134
+ before do
135
+ allow(subject).to receive(:try_next_sentinel)
136
+ allow(subject).to receive(:refresh_sentinels_list)
137
+ allow(subject).to receive(:current_sentinel).and_return(current_sentinel)
138
+ expect(current_sentinel).to receive(:sentinel).with("slaves", "master").and_return(slaves_reply)
139
+
140
+ slaves = slaves_reply.map do |info|
141
+ info = Hash[*info]
142
+ double("Redis", :host => info['ip'], :port => info['port'])
143
+ end
144
+
145
+ allow(Redis).to receive(:new).and_return(*slaves)
146
+ end
147
+
148
+ it "discovers slaves correctly" do
149
+ slaves = subject.slaves
150
+
151
+ expect(slaves.size).to eq 3
152
+ 3.times do |i|
153
+ expect(slaves[i].host).to eq "slave-#{i.to_s}"
154
+ expect(slaves[i].port.to_i).to eq (6379 + i)
155
+ end
156
+ end
157
+ end
158
+
125
159
  context "#auto_retry_with_timeout" do
126
160
  context "no failover reconnect timeout set" do
127
161
  subject { Redis::Client.new }
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.3
4
+ version: 1.4.4
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-03-04 00:00:00.000000000 Z
11
+ date: 2014-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -122,6 +122,7 @@ files:
122
122
  - lib/em-synchrony/redis-sentinel.rb
123
123
  - lib/redis-sentinel.rb
124
124
  - lib/redis-sentinel/client.rb
125
+ - lib/redis-sentinel/redis.rb
125
126
  - lib/redis-sentinel/version.rb
126
127
  - redis-sentinel.gemspec
127
128
  - spec/redis-sentinel/client_spec.rb