Bug #9477
closedAddress family not supported by protocol - socket(2) - udp
Added by bjoern (Bjoern Rennhak) almost 12 years ago. Updated over 10 years ago.
Description
On a fresh Debian GNU/Linux VServer guest running the latest RVM HEAD I experienced the following error:
Exception `LoadError' at /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:169 - LoadError Exception `Errno::EAFNOSUPPORT' at /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744 - Address family not supported by protocol - socket(2) - udp ERROR: While executing gem ... (Errno::EAFNOSUPPORT) Address family not supported by protocol - socket(2) - udp (Please see gist below for entire stacktrace).
After discussion on irc.freenode.org #rvm with mpapis (rvm maintainer) it turns out
rvm rubygems latest-2.0 fixes the issue. rvm rubygems head did not work.
Not quite sure what went wrong here and if this affects anyone who isn't running vserver.
Reference:
https://gist.github.com/anonymous/483c42ce132495271fc2
https://github.com/rubygems/rubygems/issues/803#issuecomment-33835128
Updated by drbrain (Eric Hodel) almost 12 years ago Actions #1 [ruby-core:60447]
- Tracker changed from Backport to Bug
- Project changed from 17 to Ruby
What is the output of:
ruby -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target' This is the code in the backtrace listed above.
Updated by akr (Akira Tanaka) almost 12 years ago Actions #2 [ruby-core:60486]
Does the host supports IPv6?
(I guess it doesn't because vserver needs a patch to use IPv6: http://linux-vserver.org/IPv6 )
Would you please show us /etc/resolv.conf.
(I guess it contains IPv6 address for some reason.)
Updated by bjoern (Bjoern Rennhak) almost 12 years ago Actions #3 [ruby-core:60537]
~% ruby -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target'
Output is
/usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `initialize': Address family not supported by protocol - socket(2) - udp (Errno::EAFNOSUPPORT) from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `new' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `block in initialize' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:735:in `each' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:735:in `initialize' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:561:in `new' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:561:in `make_udp_requester' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:517:in `fetch_resource' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:510:in `each_resource' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:491:in `getresource' With -rdebug and stepping though it, I additionally get this.
% ruby -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target' N::SRV).target' Debug.rb Emacs support available. /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:57: RUBYGEMS_ACTIVATION_MONITOR.enter (rdb:1) c /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `initialize': Address family not supported by protocol - socket(2) - udp (Errno::EAFNOSUPPORT) from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `new' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:744:in `block in initialize' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:735:in `each' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:735:in `initialize' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:561:in `new' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:561:in `make_udp_requester' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:517:in `fetch_resource' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:510:in `each_resource' from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/resolv.rb:491:in `getresource' from -e:1:in `<main>'
Updated by bjoern (Bjoern Rennhak) almost 12 years ago Actions #4 [ruby-core:60538]
No, vserver doesn't have the ipv6 patch enabled. Hosts is
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters Even after removing all ipv6 entries and restarting vserver guest, error still persists.
127.0.0.1 localhost (current /etc/hosts)
Updated by akr (Akira Tanaka) almost 12 years ago Actions #5 [ruby-core:60545]
Please show us /etc/resolv.conf, not /etc/hosts.
Updated by bjoern (Bjoern Rennhak) almost 12 years ago Actions #6 [ruby-core:60560]
Sorry for that, misread it.
% cat /etc/resolv.conf nameserver 213.133.99.99 nameserver 213.133.100.100 nameserver 213.133.98.98 nameserver 2a01:4f8:0:a111::add:9898 nameserver 2a01:4f8:0:a102::add:9999 nameserver 2a01:4f8:0:a0a1::add:1010 After commenting the ipv6 lines, and re-running ruby -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target' I get correct output api.rubygems.org without any errors.
So it seems, due to automatic resolv.conf getting ipv6 entries from datacenter provider but vserver missing ipv6 patch, this error occurs. Hence its a configuration issue and not a Ruby bug.
Apologies for the hassle and thank you for the help.
Updated by akr (Akira Tanaka) almost 12 years ago Actions #7 [ruby-core:60561]
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r44880.
- lib/resolv.rb: Ignore name servers which cause EAFNOSUPPORT on
socket creation.
Reported by Bjoern Rennhak. [ruby-core:60442] [Bug #9477]
Updated by akr (Akira Tanaka) almost 12 years ago Actions #8 [ruby-core:60562]
Thank you.
resolv.conf contains IPv6 address.
So resolv.rb try to create an IPv6 socket but vserver linux kernel return the error.
I committed r44880 on trunk to ignore name servers which is impossible to create a socket.
I hope it solves this issue.
I didn't test the patch because I can't reproduce the problem, though.
Updated by drbrain (Eric Hodel) almost 12 years ago Actions #9 [ruby-core:60568]
- Backport set to 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by usa (Usaku NAKAMURA) over 11 years ago Actions #10 [ruby-core:60694]
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by usa (Usaku NAKAMURA) over 11 years ago Actions #11 [ruby-core:60715]
- Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONE, 2.0.0: REQUIRED, 2.1: REQUIRED
backported into ruby_1_9_3 at r44949.
Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago Actions #12 [ruby-core:60764]
- Backport changed from 1.9.3: DONE, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONE, 2.0.0: DONE, 2.1: REQUIRED
r44880 was backported to ruby_2_0_0 at r44977.
Updated by naruse (Yui NARUSE) over 11 years ago Actions #13 [ruby-core:60975]
- Backport changed from 1.9.3: DONE, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: DONE, 2.0.0: DONE, 2.1: DONE
r45110
Updated by l33tname (Sir l33tname) over 10 years ago Actions #14
I guess it's not really fixed I can reproduce a bug which looks for me very similar (I guess it's the same problem)
Ruby 2.2
root@l33t:~ # ruby22 --version ruby 2.2.2p95 (2015-04-13 revision 50295) [amd64-freebsd10] root@l33t:~ # ruby22 -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target' /usr/local/lib/ruby/2.2/resolv.rb:747:in `initialize': Protocol not supported - socket(2) - udp (Errno::EPROTONOSUPPORT) from /usr/local/lib/ruby/2.2/resolv.rb:747:in `new' from /usr/local/lib/ruby/2.2/resolv.rb:747:in `block in initialize' from /usr/local/lib/ruby/2.2/resolv.rb:737:in `each' from /usr/local/lib/ruby/2.2/resolv.rb:737:in `initialize' from /usr/local/lib/ruby/2.2/resolv.rb:561:in `new' from /usr/local/lib/ruby/2.2/resolv.rb:561:in `make_udp_requester' from /usr/local/lib/ruby/2.2/resolv.rb:516:in `fetch_resource' from /usr/local/lib/ruby/2.2/resolv.rb:509:in `each_resource' from /usr/local/lib/ruby/2.2/resolv.rb:490:in `getresource' from -e:1:in `<main>' Ruby 2.1
root@l33t:~ # ruby --version ruby 2.1.6p336 (2015-04-13 revision 50298) [amd64-freebsd10] root@l33t:~ # ruby -rresolv -e 'puts Resolv::DNS.new.getresource("_rubygems._tcp.rubygems.org", Resolv::DNS::Resource::IN::SRV).target' /usr/local/lib/ruby/2.1/resolv.rb:748:in `initialize': Protocol not supported - socket(2) - udp (Errno::EPROTONOSUPPORT) from /usr/local/lib/ruby/2.1/resolv.rb:748:in `new' from /usr/local/lib/ruby/2.1/resolv.rb:748:in `block in initialize' from /usr/local/lib/ruby/2.1/resolv.rb:738:in `each' from /usr/local/lib/ruby/2.1/resolv.rb:738:in `initialize' from /usr/local/lib/ruby/2.1/resolv.rb:562:in `new' from /usr/local/lib/ruby/2.1/resolv.rb:562:in `make_udp_requester' from /usr/local/lib/ruby/2.1/resolv.rb:517:in `fetch_resource' from /usr/local/lib/ruby/2.1/resolv.rb:510:in `each_resource' from /usr/local/lib/ruby/2.1/resolv.rb:491:in `getresource' from -e:1:in `<main>' As you can see I run it on FreeBSD, inside a jail.