@@ -94,28 +94,19 @@ def load_info(options, **kwargs) # rubocop:disable Metrics/AbcSize, Metrics/Cycl
9494 startup_options = options . to_a . sample ( MAX_STARTUP_SAMPLE ) . to_h
9595 startup_nodes = ::RedisClient ::Cluster ::Node . new ( startup_options , **kwargs )
9696 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
106109 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
119110 end
120111
121112 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
132123
133124 private
134125
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+
135137 # @see https://redis.io/commands/cluster-nodes/
136138 # @see https://github.com/redis/redis/blob/78960ad57b8a5e6af743d789ed8fd767e37d42b8/src/cluster.c#L4660-L4683
137139 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)
331333 raise ::RedisClient ::Cluster ::ErrorCollection , errors
332334 end
333335
334- def try_map ( clients ) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
336+ def try_map ( clients , & block )
335337 results = errors = nil
336338 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
355350 end
356- end
357351 end
358352
359353 [ results , errors ]
360354 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
361363 end
362364 end
363365end
0 commit comments