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 +4 -4
- data/lib/redis-cluster.rb +12 -10
- data/lib/redis_cluster/client.rb +17 -11
- data/lib/redis_cluster/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae1424cf66cf0843a3300a70bf4dd23ce9699c56
|
4
|
+
data.tar.gz: 898602e4c11a4267da6d7d427d57da29ae161eba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2748d2afac09200212d8141f4c8ad8568e3038a8da78bc0d0128be05c99280c24e7ba7336daea7daf80a49cf2f942353c5432c0986c091b2f266e226d6a02ff
|
7
|
+
data.tar.gz: fa34f1114adc201170ee71c54f77c19624dc1bad37ad82cb83eed2500ed86bc0f42a6c086fd2b2281482dab94ac27656f886a29e6fced351d2215b0b68e784cb
|
data/lib/redis-cluster.rb
CHANGED
@@ -91,8 +91,8 @@ class RedisCluster
|
|
91
91
|
|
92
92
|
@pipeline = []
|
93
93
|
mapped_future.each do |url, futures|
|
94
|
-
leftover,
|
95
|
-
moved ||=
|
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
|
-
|
139
|
-
|
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
|
-
|
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
|
-
|
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,
|
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,
|
205
|
+
[futures, e.is_a?(LoadingStateError) ? :loading : :down]
|
204
206
|
end
|
205
207
|
|
206
208
|
def scan_reply(reply)
|
data/lib/redis_cluster/client.rb
CHANGED
@@ -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
|
-
@
|
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
|
56
|
+
return true if @healthy
|
55
57
|
|
56
|
-
# ban for 60 seconds for
|
58
|
+
# ban for 60 seconds for unhealthy state
|
57
59
|
if Time.now - @ban_from > 60
|
58
|
-
@
|
60
|
+
@healthy = true
|
59
61
|
@ban_from = nil
|
60
62
|
end
|
61
63
|
|
62
|
-
|
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
|
-
|
79
|
-
|
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
|