class Synapse::DnsWatcher
Public Instance Methods
discovery_servers()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 21 def discovery_servers @discovery['servers'] end
ping?()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 17 def ping? @watcher.alive? && !(resolver.getaddresses('airbnb.com').empty?) end
start()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 8 def start @check_interval = @discovery['check_interval'] || 30.0 @nameserver = @discovery['nameserver'] @watcher = Thread.new do watch end end
Private Instance Methods
configure_backends(servers)
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 81 def configure_backends(servers) new_backends = servers.flat_map do |(server, addresses)| addresses.map do |address| { 'host' => address, 'port' => server['port'], 'name' => server['name'], } end end if new_backends.empty? if @default_servers.empty? log.warn "synapse: no backends and no default servers for service #{@name};" \ " using previous backends: #{@backends.inspect}" else log.warn "synapse: no backends for service #{@name};" \ " using default servers: #{@default_servers.inspect}" @backends = @default_servers end else log.info "synapse: discovered #{new_backends.length} backends for service #{@name}" set_backends(new_backends) end reconfigure! end
resolve_servers()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 62 def resolve_servers resolver.tap do |dns| resolution = discovery_servers.map do |server| addresses = dns.getaddresses(server['host']).map(&:to_s) [server, addresses.sort] end return resolution end rescue => e log.warn "Error while resolving host names: #{e.inspect}" [] end
resolver()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 76 def resolver args = [{:nameserver => @nameserver}] if @nameserver Resolv::DNS.open(*args) end
sleep_until_next_check(start_time)
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 55 def sleep_until_next_check(start_time) sleep_time = @check_interval - (Time.now - start_time) if sleep_time > 0.0 sleep(sleep_time) end end
validate_discovery_opts()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 26 def validate_discovery_opts raise ArgumentError, "invalid discovery method #{@discovery['method']}" \ unless @discovery['method'] == 'dns' raise ArgumentError, "a non-empty list of servers is required" \ if discovery_servers.empty? end
watch()
click to toggle source
# File lib/synapse/service_watcher/dns.rb, line 33 def watch last_resolution = resolve_servers configure_backends(last_resolution) until @should_exit begin start = Time.now current_resolution = resolve_servers unless last_resolution == current_resolution last_resolution = current_resolution configure_backends(last_resolution) end sleep_until_next_check(start) rescue => e log.warn "Error in watcher thread: #{e.inspect}" log.warn e.backtrace end end log.info "synapse: dns watcher exited successfully" end