Open
Description
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
ruby test.rb
- 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.