redis-cluster-client 0.3.4 → 0.3.5
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: a697c2bd33f615cb435ee48c11c301bba56cad4eac139f30db70a183d888d891
|
4
|
+
data.tar.gz: 52200e9400bd7bd7fde2019c52b6cf1e26c6c019cbf1ed12a25c2167cd7ac129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05dc86fd1aa3cbf3cd3f0fa43d9d1c8463fcbe9e0ce1bcfe094f6095fd92d878a4bb21e6d6fa62203e91f3dc642e5869552f0b83d579cfa158b791501e1cb600
|
7
|
+
data.tar.gz: 8f80c5072d4d1bdbeb3e2cb4c9f92493537a6d9002edd71426598844ba28a497171c055135bb19a1d89a325c194026195100f9a0aea89c0beac3d8e9424f7f58
|
@@ -40,12 +40,12 @@ class RedisClient
|
|
40
40
|
private
|
41
41
|
|
42
42
|
def measure_latencies(clients) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
43
|
-
latencies =
|
44
|
-
|
43
|
+
latencies = nil
|
45
44
|
clients.each_slice(::RedisClient::Cluster::Node::MAX_THREADS) do |chuncked_clients|
|
46
45
|
threads = chuncked_clients.map do |k, v|
|
47
46
|
Thread.new(k, v) do |node_key, client|
|
48
47
|
Thread.pass
|
48
|
+
Thread.current.thread_variable_set(:node_key, node_key)
|
49
49
|
|
50
50
|
min = DUMMY_LATENCY_NSEC
|
51
51
|
MEASURE_ATTEMPT_COUNT.times do
|
@@ -55,13 +55,17 @@ class RedisClient
|
|
55
55
|
min = duration if duration < min
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
Thread.current.thread_variable_set(:latency, min)
|
59
59
|
rescue StandardError
|
60
|
-
|
60
|
+
Thread.current.thread_variable_set(:latency, DUMMY_LATENCY_NSEC)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
threads.each
|
64
|
+
threads.each do |t|
|
65
|
+
t.join
|
66
|
+
latencies ||= {}
|
67
|
+
latencies[t.thread_variable_get(:node_key)] = t.thread_variable_get(:latency)
|
68
|
+
end
|
65
69
|
end
|
66
70
|
|
67
71
|
latencies
|
@@ -39,27 +39,36 @@ class RedisClient
|
|
39
39
|
class << self
|
40
40
|
def load_info(options, **kwargs) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
41
41
|
startup_size = options.size > MAX_STARTUP_SAMPLE ? MAX_STARTUP_SAMPLE : options.size
|
42
|
-
node_info_list =
|
43
|
-
errors = Array.new(startup_size)
|
42
|
+
node_info_list = errors = nil
|
44
43
|
startup_options = options.to_a.sample(MAX_STARTUP_SAMPLE).to_h
|
45
44
|
startup_nodes = ::RedisClient::Cluster::Node.new(startup_options, **kwargs)
|
46
45
|
startup_nodes.each_slice(MAX_THREADS).with_index do |chuncked_startup_nodes, chuncked_idx|
|
47
46
|
threads = chuncked_startup_nodes.each_with_index.map do |raw_client, idx|
|
48
47
|
Thread.new(raw_client, (MAX_THREADS * chuncked_idx) + idx) do |cli, i|
|
49
48
|
Thread.pass
|
49
|
+
Thread.current.thread_variable_set(:index, i)
|
50
50
|
reply = cli.call('CLUSTER', 'NODES')
|
51
|
-
|
51
|
+
Thread.current.thread_variable_set(:info, parse_node_info(reply))
|
52
52
|
rescue StandardError => e
|
53
|
-
|
53
|
+
Thread.current.thread_variable_set(:error, e)
|
54
54
|
ensure
|
55
55
|
cli&.close
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
threads.each
|
59
|
+
threads.each do |t|
|
60
|
+
t.join
|
61
|
+
if t.thread_variable?(:info)
|
62
|
+
node_info_list ||= Array.new(startup_size)
|
63
|
+
node_info_list[t.thread_variable_get(:index)] = t.thread_variable_get(:info)
|
64
|
+
elsif t.thread_variable?(:error)
|
65
|
+
errors ||= Array.new(startup_size)
|
66
|
+
errors[t.thread_variable_get(:index)] = t.thread_variable_get(:error)
|
67
|
+
end
|
68
|
+
end
|
60
69
|
end
|
61
70
|
|
62
|
-
raise ::RedisClient::Cluster::InitialSetupError, errors if node_info_list.
|
71
|
+
raise ::RedisClient::Cluster::InitialSetupError, errors if node_info_list.nil?
|
63
72
|
|
64
73
|
grouped = node_info_list.compact.group_by do |rows|
|
65
74
|
rows.sort_by { |row| row[:id] }
|
@@ -147,7 +156,7 @@ class RedisClient
|
|
147
156
|
|
148
157
|
def send_ping(method, command, args, &block)
|
149
158
|
result_values, errors = call_multiple_nodes(@topology.clients, method, command, args, &block)
|
150
|
-
return result_values if errors.empty?
|
159
|
+
return result_values if errors.nil? || errors.empty?
|
151
160
|
|
152
161
|
raise ReloadNeeded if errors.values.any?(::RedisClient::ConnectionError)
|
153
162
|
|
@@ -228,26 +237,35 @@ class RedisClient
|
|
228
237
|
|
229
238
|
def call_multiple_nodes!(clients, method, command, args, &block)
|
230
239
|
result_values, errors = call_multiple_nodes(clients, method, command, args, &block)
|
231
|
-
return result_values if errors.empty?
|
240
|
+
return result_values if errors.nil? || errors.empty?
|
232
241
|
|
233
242
|
raise ::RedisClient::Cluster::ErrorCollection, errors
|
234
243
|
end
|
235
244
|
|
236
|
-
def try_map(clients) # rubocop:disable Metrics/MethodLength
|
237
|
-
results =
|
238
|
-
errors = {}
|
245
|
+
def try_map(clients) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
246
|
+
results = errors = nil
|
239
247
|
clients.each_slice(MAX_THREADS) do |chuncked_clients|
|
240
248
|
threads = chuncked_clients.map do |k, v|
|
241
249
|
Thread.new(k, v) do |node_key, client|
|
242
250
|
Thread.pass
|
251
|
+
Thread.current.thread_variable_set(:node_key, node_key)
|
243
252
|
reply = yield(node_key, client)
|
244
|
-
|
253
|
+
Thread.current.thread_variable_set(:result, reply)
|
245
254
|
rescue StandardError => e
|
246
|
-
|
255
|
+
Thread.current.thread_variable_set(:error, e)
|
247
256
|
end
|
248
257
|
end
|
249
258
|
|
250
|
-
threads.each
|
259
|
+
threads.each do |t|
|
260
|
+
t.join
|
261
|
+
if t.thread_variable?(:result)
|
262
|
+
results ||= {}
|
263
|
+
results[t.thread_variable_get(:node_key)] = t.thread_variable_get(:result)
|
264
|
+
elsif t.thread_variable?(:error)
|
265
|
+
errors ||= {}
|
266
|
+
errors[t.thread_variable_get(:node_key)] = t.thread_variable_get(:error)
|
267
|
+
end
|
268
|
+
end
|
251
269
|
end
|
252
270
|
|
253
271
|
[results, errors]
|
@@ -20,37 +20,37 @@ class RedisClient
|
|
20
20
|
def call(*args, **kwargs, &block)
|
21
21
|
command = @command_builder.generate(args, kwargs)
|
22
22
|
node_key = @router.find_node_key(command, seed: @seed)
|
23
|
-
|
23
|
+
add_row(node_key, [@size, :call_v, command, block])
|
24
24
|
end
|
25
25
|
|
26
26
|
def call_v(args, &block)
|
27
27
|
command = @command_builder.generate(args)
|
28
28
|
node_key = @router.find_node_key(command, seed: @seed)
|
29
|
-
|
29
|
+
add_row(node_key, [@size, :call_v, command, block])
|
30
30
|
end
|
31
31
|
|
32
32
|
def call_once(*args, **kwargs, &block)
|
33
33
|
command = @command_builder.generate(args, kwargs)
|
34
34
|
node_key = @router.find_node_key(command, seed: @seed)
|
35
|
-
|
35
|
+
add_row(node_key, [@size, :call_once_v, command, block])
|
36
36
|
end
|
37
37
|
|
38
38
|
def call_once_v(args, &block)
|
39
39
|
command = @command_builder.generate(args)
|
40
40
|
node_key = @router.find_node_key(command, seed: @seed)
|
41
|
-
|
41
|
+
add_row(node_key, [@size, :call_once_v, command, block])
|
42
42
|
end
|
43
43
|
|
44
44
|
def blocking_call(timeout, *args, **kwargs, &block)
|
45
45
|
command = @command_builder.generate(args, kwargs)
|
46
46
|
node_key = @router.find_node_key(command, seed: @seed)
|
47
|
-
|
47
|
+
add_row(node_key, [@size, :blocking_call_v, timeout, command, block])
|
48
48
|
end
|
49
49
|
|
50
50
|
def blocking_call_v(timeout, args, &block)
|
51
51
|
command = @command_builder.generate(args)
|
52
52
|
node_key = @router.find_node_key(command, seed: @seed)
|
53
|
-
|
53
|
+
add_row(node_key, [@size, :blocking_call_v, timeout, command, block])
|
54
54
|
end
|
55
55
|
|
56
56
|
def empty?
|
@@ -59,44 +59,57 @@ class RedisClient
|
|
59
59
|
|
60
60
|
# TODO: https://github.com/redis-rb/redis-cluster-client/issues/37 handle redirections
|
61
61
|
def execute # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
62
|
-
all_replies =
|
63
|
-
errors = {}
|
62
|
+
all_replies = errors = nil
|
64
63
|
@grouped.each_slice(MAX_THREADS) do |chuncked_grouped|
|
65
64
|
threads = chuncked_grouped.map do |k, v|
|
66
65
|
Thread.new(@router, k, v) do |router, node_key, rows|
|
67
66
|
Thread.pass
|
68
|
-
replies = router.find_node(node_key)
|
69
|
-
rows.each do |row|
|
70
|
-
case row.size
|
71
|
-
when 4 then pipeline.send(row[1], row[2], &row[3])
|
72
|
-
when 5 then pipeline.send(row[1], row[2], row[3], &row[4])
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
67
|
+
replies = do_pipelining(router.find_node(node_key), rows)
|
77
68
|
raise ReplySizeError, "commands: #{rows.size}, replies: #{replies.size}" if rows.size != replies.size
|
78
69
|
|
79
|
-
rows
|
70
|
+
Thread.current.thread_variable_set(:rows, rows)
|
71
|
+
Thread.current.thread_variable_set(:replies, replies)
|
80
72
|
rescue StandardError => e
|
81
|
-
|
73
|
+
Thread.current.thread_variable_set(:node_key, node_key)
|
74
|
+
Thread.current.thread_variable_set(:error, e)
|
82
75
|
end
|
83
76
|
end
|
84
77
|
|
85
|
-
threads.each
|
78
|
+
threads.each do |t|
|
79
|
+
t.join
|
80
|
+
if t.thread_variable?(:replies)
|
81
|
+
all_replies ||= Array.new(@size)
|
82
|
+
t.thread_variable_get(:rows).each_with_index { |r, i| all_replies[r.first] = t.thread_variable_get(:replies)[i] }
|
83
|
+
elsif t.thread_variable?(:error)
|
84
|
+
errors ||= {}
|
85
|
+
errors[t.thread_variable_get(:node_key)] = t.thread_variable_get(:error)
|
86
|
+
end
|
87
|
+
end
|
86
88
|
end
|
87
89
|
|
88
|
-
return all_replies if errors.
|
90
|
+
return all_replies if errors.nil?
|
89
91
|
|
90
92
|
raise ::RedisClient::Cluster::ErrorCollection, errors
|
91
93
|
end
|
92
94
|
|
93
95
|
private
|
94
96
|
|
95
|
-
def
|
97
|
+
def add_row(node_key, row)
|
96
98
|
@grouped[node_key] = [] unless @grouped.key?(node_key)
|
97
|
-
@grouped[node_key] <<
|
99
|
+
@grouped[node_key] << row
|
98
100
|
@size += 1
|
99
101
|
end
|
102
|
+
|
103
|
+
def do_pipelining(node, rows)
|
104
|
+
node.pipelined do |pipeline|
|
105
|
+
rows.each do |row|
|
106
|
+
case row.size
|
107
|
+
when 4 then pipeline.send(row[1], row[2], &row[3])
|
108
|
+
when 5 then pipeline.send(row[1], row[2], row[3], &row[4])
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
100
113
|
end
|
101
114
|
end
|
102
115
|
end
|
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.5
|
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-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|