redis-cluster 1.0.0.pre.rc.3 → 1.0.0.pre.rc.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: 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