redis-cluster-client 0.3.8 → 0.3.10
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
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e617645bfcf37192c1c665ceaee819439ee26821688906d311dd3792fc6c7d5
|
4
|
+
data.tar.gz: c9a3125c8d012dfc937464aa37751c26e35fa8a7696a3b418a87f7019b263a06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2a815abb356acc39f0e842b5ecef6dd3d997b7554db351f7804289d386d8178221cab843e2144affceb55e849e52c672a99c49e51ef12d54000d0ee2b754f91
|
7
|
+
data.tar.gz: f19f384f8928b1487d45fb7171b4af70becc6b34a5da9a7e9dc15050d88035123f9b8e08c979c01a59fce6581337a9155d4ba1a221397a4948b1aeadceee5957
|
@@ -21,7 +21,7 @@ class RedisClient
|
|
21
21
|
@replications.each_value { |keys| keys.sort_by! { |k| latencies.fetch(k) } }
|
22
22
|
@replica_clients = select_replica_clients(@replications, @clients)
|
23
23
|
@clients_for_scanning = select_clients_for_scanning(@replications, @clients)
|
24
|
-
@existed_replicas = @replications.reject
|
24
|
+
@existed_replicas = @replications.values.reject(&:empty?)
|
25
25
|
end
|
26
26
|
|
27
27
|
def clients_for_scanning(seed: nil) # rubocop:disable Lint/UnusedMethodArgument
|
@@ -18,10 +18,12 @@ class RedisClient
|
|
18
18
|
MAX_STARTUP_SAMPLE = 37
|
19
19
|
MAX_THREADS = Integer(ENV.fetch('REDIS_CLIENT_MAX_THREADS', 5))
|
20
20
|
IGNORE_GENERIC_CONFIG_KEYS = %i[url host port path].freeze
|
21
|
+
SLOT_OPTIMIZATION_STRING = '0' * SLOT_SIZE
|
21
22
|
|
22
23
|
ReloadNeeded = Class.new(::RedisClient::Error)
|
24
|
+
|
23
25
|
Info = Struct.new(
|
24
|
-
'
|
26
|
+
'RedisClusterNode',
|
25
27
|
:id, :node_key, :role, :primary_id, :ping_sent,
|
26
28
|
:pong_recv, :config_epoch, :link_state, :slots,
|
27
29
|
keyword_init: true
|
@@ -35,23 +37,27 @@ class RedisClient
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
Slot = Struct.new('StringArray', :string, :elements, keyword_init: true) do
|
41
|
+
def [](index)
|
42
|
+
raise IndexError if index < 0
|
43
|
+
return if index >= string.bytesize
|
44
|
+
|
45
|
+
elements[string.getbyte(index)]
|
43
46
|
end
|
44
47
|
|
45
|
-
def []=(
|
46
|
-
index
|
47
|
-
if index.
|
48
|
-
|
48
|
+
def []=(index, element)
|
49
|
+
raise IndexError if index < 0
|
50
|
+
return if index >= string.bytesize
|
51
|
+
|
52
|
+
pos = elements.find_index(element) # O(N)
|
53
|
+
if pos.nil?
|
54
|
+
raise(RangeError, 'full of elements') if elements.size >= 256
|
49
55
|
|
50
|
-
|
51
|
-
|
56
|
+
pos = elements.size
|
57
|
+
elements << element
|
52
58
|
end
|
53
59
|
|
54
|
-
|
60
|
+
string.setbyte(index, pos)
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
@@ -229,7 +235,12 @@ class RedisClient
|
|
229
235
|
def update_slot(slot, node_key)
|
230
236
|
return if @mutex.locked?
|
231
237
|
|
232
|
-
@mutex.synchronize
|
238
|
+
@mutex.synchronize do
|
239
|
+
@slots[slot] = node_key
|
240
|
+
rescue RangeError
|
241
|
+
@slots = Array.new(SLOT_SIZE) { |i| @slots[i] }
|
242
|
+
@slots[slot] = node_key
|
243
|
+
end
|
233
244
|
end
|
234
245
|
|
235
246
|
private
|
@@ -256,11 +267,11 @@ class RedisClient
|
|
256
267
|
end
|
257
268
|
|
258
269
|
def make_array_for_slot_node_mappings(node_info_list)
|
259
|
-
return Array.new(SLOT_SIZE) if node_info_list.count(&:primary?) >
|
270
|
+
return Array.new(SLOT_SIZE) if node_info_list.count(&:primary?) > 256
|
260
271
|
|
261
272
|
::RedisClient::Cluster::Node::Slot.new(
|
262
|
-
|
263
|
-
|
273
|
+
string: String.new(SLOT_OPTIMIZATION_STRING, encoding: Encoding::BINARY, capacity: SLOT_SIZE),
|
274
|
+
elements: node_info_list.select(&:primary?).map(&:node_key)
|
264
275
|
)
|
265
276
|
end
|
266
277
|
|
@@ -57,11 +57,12 @@ class RedisClient
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def normalize(name)
|
60
|
-
return @cache[name] if @cache.key?(name)
|
60
|
+
return @cache[name] || name.to_s.downcase if @cache.key?(name)
|
61
61
|
return name.to_s.downcase if @mutex.locked?
|
62
62
|
|
63
|
-
|
64
|
-
@cache[name]
|
63
|
+
str = name.to_s.downcase
|
64
|
+
@mutex.synchronize { @cache[name] = str }
|
65
|
+
str
|
65
66
|
end
|
66
67
|
end
|
67
68
|
end
|
@@ -12,6 +12,7 @@ class RedisClient
|
|
12
12
|
class Cluster
|
13
13
|
class Router
|
14
14
|
ZERO_CURSOR_FOR_SCAN = '0'
|
15
|
+
METHODS_FOR_BLOCKING_CMD = %i[blocking_call_v blocking_call].freeze
|
15
16
|
|
16
17
|
attr_reader :node
|
17
18
|
|
@@ -91,7 +92,7 @@ class RedisClient
|
|
91
92
|
raise
|
92
93
|
end
|
93
94
|
rescue ::RedisClient::ConnectionError => e
|
94
|
-
raise if
|
95
|
+
raise if METHODS_FOR_BLOCKING_CMD.include?(method) && e.is_a?(RedisClient::ReadTimeoutError)
|
95
96
|
raise if retry_count <= 0
|
96
97
|
|
97
98
|
update_cluster_info!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-cluster-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taishi Kasuga
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|