Skip to content

DNS queries over TCP create a new socket per query, exhausting the available file descriptors #20

Open
@postmodern

Description

@postmodern

I noticed when performing many queries over TCP (ex: [:tcp, '8.8.8.8', 53]) that the ruby process would create a new TCP socket per-query. These TCP sockets would not be closed fast enough (ex; waiting in TIME_WAIT), and would eventually cause the process to hit it's maximum number of open file descriptors (ex: Errno::EADDRNOTAVAIL).

Steps To Reproduce

  1. ruby test.rb
  2. In another terminal run watch "netstat -n" to observe connections

Gemfile

source 'https://rubygems.org/'

gem 'async-dns'

test.rb

require 'bundler/setup'
require 'async/dns'

nameservers = [[:tcp, '8.8.8.8', 53]]
resolver = Async::DNS::Resolver.new(nameservers)
hostname = 'google.com'

Async do
  loop do
    begin
      addresses = resolver.addresses_for(hostname)
    rescue Async::DNS::ResolutionFailure
    end
  end
end

Note: if :tcp is changed to :udp, then only one socket is created and reused.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions