@@ -13,11 +13,18 @@ class Cluster
13
13
class Node
14
14
include Enumerable
15
15
16
+ # It affects to strike a balance between load and stability in initialization or changed states.
17
+ MAX_STARTUP_SAMPLE = Integer ( ENV . fetch ( 'REDIS_CLIENT_MAX_STARTUP_SAMPLE' , 3 ) )
18
+
19
+ # It's used with slow queries of fetching meta data like CLUSTER NODES, COMMAND and so on.
20
+ SLOW_COMMAND_TIMEOUT = Float ( ENV . fetch ( 'REDIS_CLIENT_SLOW_COMMAND_TIMEOUT' , -1 ) )
21
+
22
+ # less memory consumption, but slow
23
+ USE_CHAR_ARRAY_SLOT = Integer ( ENV . fetch ( 'REDIS_CLIENT_USE_CHAR_ARRAY_SLOT' , 1 ) ) == 1
24
+
16
25
SLOT_SIZE = 16_384
17
26
MIN_SLOT = 0
18
27
MAX_SLOT = SLOT_SIZE - 1
19
- MAX_STARTUP_SAMPLE = Integer ( ENV . fetch ( 'REDIS_CLIENT_MAX_STARTUP_SAMPLE' , 3 ) )
20
- USE_CHAR_ARRAY_SLOT = Integer ( ENV . fetch ( 'REDIS_CLIENT_USE_CHAR_ARRAY_SLOT' , 1 ) ) == 1 # less memory consumption, but slow
21
28
IGNORE_GENERIC_CONFIG_KEYS = %i[ url host port path ] . freeze
22
29
DEAD_FLAGS = %w[ fail? fail handshake noaddr noflags ] . freeze
23
30
ROLE_FLAGS = %w[ master slave ] . freeze
@@ -99,7 +106,10 @@ def load_info(options, concurrent_worker, **kwargs) # rubocop:disable Metrics/Ab
99
106
100
107
startup_nodes . each_with_index do |raw_client , i |
101
108
work_group . push ( i , raw_client ) do |client |
109
+ regular_timeout = client . read_timeout
110
+ client . read_timeout = SLOW_COMMAND_TIMEOUT > 0.0 ? SLOW_COMMAND_TIMEOUT : regular_timeout
102
111
reply = client . call ( 'CLUSTER' , 'NODES' )
112
+ client . read_timeout = regular_timeout
103
113
parse_cluster_node_reply ( reply )
104
114
rescue StandardError => e
105
115
e
@@ -209,10 +219,6 @@ def each(&block)
209
219
@topology . clients . each_value ( &block )
210
220
end
211
221
212
- def shuffled_nodes
213
- @topology . clients . values . shuffle
214
- end
215
-
216
222
def sample
217
223
@topology . clients . values . sample
218
224
end
@@ -252,6 +258,10 @@ def clients_for_scanning(seed: nil)
252
258
@topology . clients_for_scanning ( seed : seed ) . values . sort_by { |c | "#{ c . config . host } -#{ c . config . port } " }
253
259
end
254
260
261
+ def replica_clients
262
+ @topology . replica_clients . values
263
+ end
264
+
255
265
def find_node_key_of_primary ( slot )
256
266
return if slot . nil?
257
267
0 commit comments