redis-sentinel 1.4.3 → 1.4.4

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 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