redis-cluster 1.0.0.pre.rc.3 → 1.0.0.pre.rc.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: c4fb30f11cb1d74b3572c8e0c9ea64ff534da5c4
4
- data.tar.gz: 08f644a16dc2155ea730e16170b40d72f2019511
3
+ metadata.gz: ae1424cf66cf0843a3300a70bf4dd23ce9699c56
4
+ data.tar.gz: 898602e4c11a4267da6d7d427d57da29ae161eba
5
5
  SHA512:
6
- metadata.gz: 105c1a258630a397d8f51a259a356751efcf6d67cb68484b73e4f0fa230d05d896c5970298840961bbe472232a2d2f986e71f28841d2fbaa21628ccdc07b9149
7
- data.tar.gz: ae7fa4048759d265ba68c6c21ba18acba1918a407f4c7879a4b18494a0595293a64ea84967add9d19b7a1f57ad7d3999bd4b407ec33ae1b6a249d2d60289d70c
6
+ metadata.gz: f2748d2afac09200212d8141f4c8ad8568e3038a8da78bc0d0128be05c99280c24e7ba7336daea7daf80a49cf2f942353c5432c0986c091b2f266e226d6a02ff
7
+ data.tar.gz: fa34f1114adc201170ee71c54f77c19624dc1bad37ad82cb83eed2500ed86bc0f42a6c086fd2b2281482dab94ac27656f886a29e6fced351d2215b0b68e784cb
@@ -91,8 +91,8 @@ class RedisCluster
91
91
 
92
92
  @pipeline = []
93
93
  mapped_future.each do |url, futures|
94
- leftover, move = do_pipelined(url, futures)
95
- moved ||= move
94
+ leftover, error = do_pipelined(url, futures)
95
+ moved ||= (error == :moved || error == :down)
96
96
 
97
97
  @pipeline.concat(leftover)
98
98
  end
@@ -134,9 +134,11 @@ class RedisCluster
134
134
  cluster.reset if err == :moved
135
135
  asking = err == :ask
136
136
  client = cluster[url]
137
- rescue Redis::CannotConnectError => e
138
- asking = false
139
- cluster.reset
137
+ rescue LoadingStateError, Redis::CannotConnectError => e
138
+ if e.is_a?(Redis::CannotConnectError)
139
+ asking = false
140
+ cluster.reset
141
+ end
140
142
  client = cluster.client_for(mode, slot)
141
143
  reply = e
142
144
  end
@@ -162,7 +164,7 @@ class RedisCluster
162
164
  end
163
165
 
164
166
  def do_pipelined(url, futures)
165
- moved = false
167
+ error = nil
166
168
  leftover = []
167
169
 
168
170
  rev_index = {}
@@ -189,18 +191,18 @@ class RedisCluster
189
191
  err, url = scan_reply(reply)
190
192
  next unless err
191
193
 
192
- moved ||= err == :moved
194
+ error ||= :moved if err == :moved
193
195
  future.asking = err == :ask
194
196
  future.url = url
195
197
  leftover << future
196
198
  end
197
199
 
198
- [leftover, moved]
199
- rescue Redis::CannotConnectError
200
+ [leftover, error]
201
+ rescue LoadingStateError, Redis::CannotConnectError => e
200
202
  # reset url and asking when connection refused
201
203
  futures.each{ |f| f.url = nil; f.asking = false }
202
204
 
203
- [futures, true]
205
+ [futures, e.is_a?(LoadingStateError) ? :loading : :down]
204
206
  end
205
207
 
206
208
  def scan_reply(reply)
@@ -6,6 +6,8 @@ require_relative 'version'
6
6
 
7
7
  class RedisCluster
8
8
 
9
+ class LoadingStateError < StandardError; end
10
+
9
11
  # Client is a decorator object for Redis::Client. It add queue to support pipelining and another
10
12
  # useful addition
11
13
  class Client
@@ -17,7 +19,7 @@ class RedisCluster
17
19
  @queue = []
18
20
  @url = "#{client.host}:#{client.port}"
19
21
 
20
- @loading = false
22
+ @healthy = true
21
23
  @ban_from = nil
22
24
  end
23
25
 
@@ -51,15 +53,15 @@ class RedisCluster
51
53
  end
52
54
 
53
55
  def healthy
54
- return true unless @loading
56
+ return true if @healthy
55
57
 
56
- # ban for 60 seconds for loading state
58
+ # ban for 60 seconds for unhealthy state
57
59
  if Time.now - @ban_from > 60
58
- @loading = false
60
+ @healthy = true
59
61
  @ban_from = nil
60
62
  end
61
63
 
62
- !@loading
64
+ @healthy
63
65
  end
64
66
 
65
67
  private
@@ -71,16 +73,20 @@ class RedisCluster
71
73
  client.process(queue) do
72
74
  queue.size.times do |i|
73
75
  result[i] = client.read
74
- end
75
- end
76
- @queue = []
77
76
 
78
- if result.last.is_a?(Redis::CommandError) && result.last.message['LOADING']
79
- @loading = true
80
- @ban_from = Time.now
77
+ unhealthy! if result[i].is_a?(Redis::CommandError) && result[i].message['LOADING']
78
+ end
81
79
  end
82
80
 
83
81
  result
82
+ ensure
83
+ @queue = []
84
+ end
85
+
86
+ def unhealthy!
87
+ @healthy = false
88
+ @ban_from = Time.now
89
+ raise LoadingStateError
84
90
  end
85
91
  end
86
92
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RedisCluster
4
- VERSION = '1.0.0-rc.3'
4
+ VERSION = '1.0.0-rc.4'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-cluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.rc.3
4
+ version: 1.0.0.pre.rc.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bukalapak