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