11# frozen_string_literal: true
22
33require "kafka/broker_pool"
4+ require "resolv"
45require "set"
56
67module Kafka
@@ -18,14 +19,16 @@ class Cluster
1819 # @param seed_brokers [Array<URI>]
1920 # @param broker_pool [Kafka::BrokerPool]
2021 # @param logger [Logger]
21- def initialize ( seed_brokers :, broker_pool :, logger :)
22+ # @param resolve_seed_brokers [Boolean] See {Kafka::Client#initialize}
23+ def initialize ( seed_brokers :, broker_pool :, logger :, resolve_seed_brokers : false )
2224 if seed_brokers . empty?
2325 raise ArgumentError , "At least one seed broker must be configured"
2426 end
2527
2628 @logger = TaggedLogger . new ( logger )
2729 @seed_brokers = seed_brokers
2830 @broker_pool = broker_pool
31+ @resolve_seed_brokers = resolve_seed_brokers
2932 @cluster_info = nil
3033 @stale = true
3134
@@ -418,32 +421,35 @@ def get_leader_id(topic, partition)
418421 # @return [Protocol::MetadataResponse] the cluster metadata.
419422 def fetch_cluster_info
420423 errors = [ ]
421-
422424 @seed_brokers . shuffle . each do |node |
423- @logger . info "Fetching cluster metadata from #{ node } "
424-
425- begin
426- broker = @broker_pool . connect ( node . hostname , node . port )
427- cluster_info = broker . fetch_metadata ( topics : @target_topics )
428-
429- if cluster_info . brokers . empty?
430- @logger . error "No brokers in cluster"
431- else
432- @logger . info "Discovered cluster metadata; nodes: #{ cluster_info . brokers . join ( ', ' ) } "
433-
434- @stale = false
435-
436- return cluster_info
425+ ( @resolve_seed_brokers ? Resolv . getaddresses ( node . hostname ) . shuffle : [ node . hostname ] ) . each do |hostname_or_ip |
426+ node_info = node . to_s
427+ node_info << " (#{ hostname_or_ip } )" if node . hostname != hostname_or_ip
428+ @logger . info "Fetching cluster metadata from #{ node_info } "
429+
430+ begin
431+ broker = @broker_pool . connect ( hostname_or_ip , node . port )
432+ cluster_info = broker . fetch_metadata ( topics : @target_topics )
433+
434+ if cluster_info . brokers . empty?
435+ @logger . error "No brokers in cluster"
436+ else
437+ @logger . info "Discovered cluster metadata; nodes: #{ cluster_info . brokers . join ( ', ' ) } "
438+
439+ @stale = false
440+
441+ return cluster_info
442+ end
443+ rescue Error => e
444+ @logger . error "Failed to fetch metadata from #{ node_info } : #{ e } "
445+ errors << [ node_info , e ]
446+ ensure
447+ broker . disconnect unless broker . nil?
437448 end
438- rescue Error => e
439- @logger . error "Failed to fetch metadata from #{ node } : #{ e } "
440- errors << [ node , e ]
441- ensure
442- broker . disconnect unless broker . nil?
443449 end
444450 end
445451
446- error_description = errors . map { |node , exception | "- #{ node } : #{ exception } " } . join ( "\n " )
452+ error_description = errors . map { |node_info , exception | "- #{ node_info } : #{ exception } " } . join ( "\n " )
447453
448454 raise ConnectionError , "Could not connect to any of the seed brokers:\n #{ error_description } "
449455 end
0 commit comments