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