@@ -94,28 +94,19 @@ def load_info(options, **kwargs) # rubocop:disable Metrics/AbcSize, Metrics/Cycl
94
94
startup_options = options . to_a . sample ( MAX_STARTUP_SAMPLE ) . to_h
95
95
startup_nodes = ::RedisClient ::Cluster ::Node . new ( startup_options , **kwargs )
96
96
startup_nodes . each_slice ( MAX_THREADS ) . with_index do |chuncked_startup_nodes , chuncked_idx |
97
- threads = chuncked_startup_nodes . each_with_index . map do |raw_client , idx |
98
- Thread . new ( raw_client , ( MAX_THREADS * chuncked_idx ) + idx ) do |cli , i |
99
- Thread . current [ :index ] = i
100
- reply = cli . call ( 'CLUSTER' , 'NODES' )
101
- Thread . current [ :info ] = parse_cluster_node_reply ( reply )
102
- rescue StandardError => e
103
- Thread . current [ :error ] = e
104
- ensure
105
- cli &.close
97
+ chuncked_startup_nodes
98
+ . each_with_index
99
+ . map { |raw_client , idx | [ ( MAX_THREADS * chuncked_idx ) + idx , build_thread_for_cluster_node ( raw_client ) ] }
100
+ . each do |i , t |
101
+ case v = t . value
102
+ when StandardError
103
+ errors ||= Array . new ( startup_size )
104
+ errors [ i ] = v
105
+ else
106
+ node_info_list ||= Array . new ( startup_size )
107
+ node_info_list [ i ] = v
108
+ end
106
109
end
107
- end
108
-
109
- threads . each do |t |
110
- t . join
111
- if t . key? ( :info )
112
- node_info_list ||= Array . new ( startup_size )
113
- node_info_list [ t [ :index ] ] = t [ :info ]
114
- elsif t . key? ( :error )
115
- errors ||= Array . new ( startup_size )
116
- errors [ t [ :index ] ] = t [ :error ]
117
- end
118
- end
119
110
end
120
111
121
112
raise ::RedisClient ::Cluster ::InitialSetupError , errors if node_info_list . nil?
@@ -132,6 +123,17 @@ def load_info(options, **kwargs) # rubocop:disable Metrics/AbcSize, Metrics/Cycl
132
123
133
124
private
134
125
126
+ def build_thread_for_cluster_node ( raw_client )
127
+ Thread . new ( raw_client ) do |client |
128
+ reply = client . call ( 'CLUSTER' , 'NODES' )
129
+ parse_cluster_node_reply ( reply )
130
+ rescue StandardError => e
131
+ e
132
+ ensure
133
+ client &.close
134
+ end
135
+ end
136
+
135
137
# @see https://redis.io/commands/cluster-nodes/
136
138
# @see https://github.com/redis/redis/blob/78960ad57b8a5e6af743d789ed8fd767e37d42b8/src/cluster.c#L4660-L4683
137
139
def parse_cluster_node_reply ( reply ) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -331,33 +333,33 @@ def call_multiple_nodes!(clients, method, command, args, &block)
331
333
raise ::RedisClient ::Cluster ::ErrorCollection , errors
332
334
end
333
335
334
- def try_map ( clients ) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
336
+ def try_map ( clients , & block )
335
337
results = errors = nil
336
338
clients . each_slice ( MAX_THREADS ) do |chuncked_clients |
337
- threads = chuncked_clients . map do |k , v |
338
- Thread . new ( k , v ) do |node_key , client |
339
- Thread . current [ :node_key ] = node_key
340
- reply = yield ( node_key , client )
341
- Thread . current [ :result ] = reply
342
- rescue StandardError => e
343
- Thread . current [ :error ] = e
344
- end
345
- end
346
-
347
- threads . each do |t |
348
- t . join
349
- if t . key? ( :result )
350
- results ||= { }
351
- results [ t [ :node_key ] ] = t [ :result ]
352
- elsif t . key? ( :error )
353
- errors ||= { }
354
- errors [ t [ :node_key ] ] = t [ :error ]
339
+ chuncked_clients
340
+ . map { |node_key , client | [ node_key , build_thread_for_command ( node_key , client , &block ) ] }
341
+ . each do |node_key , thread |
342
+ case v = thread . value
343
+ when StandardError
344
+ errors ||= { }
345
+ errors [ node_key ] = v
346
+ else
347
+ results ||= { }
348
+ results [ node_key ] = v
349
+ end
355
350
end
356
- end
357
351
end
358
352
359
353
[ results , errors ]
360
354
end
355
+
356
+ def build_thread_for_command ( node_key , client )
357
+ Thread . new ( node_key , client ) do |nk , cli |
358
+ yield ( nk , cli )
359
+ rescue StandardError => e
360
+ e
361
+ end
362
+ end
361
363
end
362
364
end
363
365
end
0 commit comments