+++ This bug was initially created as a clone of Bug #1461190 +++ Description of problem: If IPv6 is configured via proto_dist and/or inetrc, inet:gethostbyname will still prefer IPv4 addresses. This breaks epmd lookups if epmd is forced to listen only on IPv6. Version-Release number of selected component (if applicable): erlang-erts-18.3.4.4-3.el7ost.x86_64 How reproducible: Always Steps to Reproduce: [root@rhel7 ~]# env | grep ERL ERL_INET_GETHOST_DEBUG=5 ERL_INETRC=/root/inetrc ERL_EPMD_ADDRESS=fd00::1 [root@rhel7 ~]# cat /root/inetrc {inet6, true}. [root@rhel7 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:13:f6:0e brd ff:ff:ff:ff:ff:ff inet 192.168.200.200/24 brd 192.168.200.255 scope global dynamic eth0 valid_lft 2881sec preferred_lft 2881sec inet6 fd00::1/128 scope global valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe13:f60e/64 scope link valid_lft forever preferred_lft forever [root@rhel7 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 fd00::1 rhel7 Actual results: [root@rhel7 ~]# erl -sname foo -proto_dist inet6_tcp Erlang/OTP 18 [erts-7.3.1.2] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Eshell V7.3.1.2 (abort with ^G) (foo@rhel7)1> inet:gethostbyname("rhel7"). inet_gethost[7615] (DEBUG):Saved domainname . inet_gethost[7615] (DEBUG):Saved domainname . inet_gethost[7616] (DEBUG):Worker got request, op = 1, proto = 1, data = rhel7. inet_gethost[7616] (DEBUG):Starting gethostbyname(rhel7) inet_gethost[7616] (DEBUG):gethostbyname OK {ok,{hostent,"rhel7.example.org",[],inet,4, [{192,168,200,200}]}} Expected results: [root@rhel7 ~]# erl -sname foo -proto_dist inet6_tcp Erlang/OTP 18 [erts-7.3.1.2] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Eshell V7.3.1.2 (abort with ^G) (foo@rhel7)1> inet:gethostbyname("rhel7"). inet_gethost[7694] (DEBUG):Saved domainname . inet_gethost[7694] (DEBUG):Created worker[7695] with fd 3 inet_gethost[7694] (DEBUG):Saved domainname . inet_gethost[7695] (DEBUG):Worker got request, op = 1, proto = 2, data = rhel7. inet_gethost[7695] (DEBUG):Starting getaddrinfo(rhel7, ...) inet_gethost[7695] (DEBUG):getaddrinfo returned 0 {ok,{hostent,"rhel7",[],inet6,16,[{64768,0,0,0,0,0,0,1}]}} Additional info: Upstream fix on OTP 19 - https://github.com/erlang/otp/commit/5d7dcfc2e0de7e93b29d01f07a2f970720d62f9d Backport for OTP 18.3.4.4 - https://github.com/jeckersb/otp/commit/5ceafb8276b2d920abb3724450e87d8724d21f8e
Different build (against RHEL 7.3) - erlang-18.3.4.5-3.el7ost.1
Verified : on Ver. :erlang-18.3.4.5-3.el7ost.1 Steps taken: erlang ver. check: [root@controller-0 ~]#yum list *erlang*|grep '18'|awk '{print $2}'|uniq 18.3.4.5-3.el7ost.1 prepare env. for erlang run: [root@controller-0 ~]#export ERL_INET_GETHOST_DEBUG=5 [root@controller-0 ~]#export ERL_INETRC=/root/inetrc [root@controller-0 ~]#export ERL_EPMD_ADDRESS=$(grep `hostname -s`\.localdomain /etc/hosts|awk '{print $1}') [root@controller-0 ~]#echo "{inet6, true}.">>/root/inetrc [root@controller-0 ~]#pcs cluster stop --all [root@controller-0 ~]#killall epmd Test execution: Expected results are validated - we get ipv6 output from "net:gethostbyname" [root@controller-0 ~]# erl -sname foo -proto_dist inet6_tcp inet_gethost[932209] (DEBUG):Saved domainname . inet_gethost[932209] (DEBUG):Created worker[932210] with fd 3 inet_gethost[932209] (DEBUG):Saved domainname . inet_gethost[932210] (DEBUG):Worker got request, op = 1, proto = 1, data = controller-0. inet_gethost[932210] (DEBUG):Starting gethostbyname(controller-0) inet_gethost[932210] (DEBUG):gethostbyname OK inet_gethost[932209] (DEBUG):End of file while reading from pipe. inet_gethost[932209] (DEBUG):Erlang has closed. Erlang/OTP 18 [erts-7.3.1.3] [source] [64-bit] [smp:12:12] [async-threads:10] [hipe] [kernel-poll:false] Eshell V7.3.1.3 (abort with ^G) (foo@controller-0)1> inet:gethostbyname("controller-0"). inet_gethost[932308] (DEBUG):Saved domainname . inet_gethost[932308] (DEBUG):Created worker[932309] with fd 3 inet_gethost[932308] (DEBUG):Saved domainname . inet_gethost[932309] (DEBUG):Worker got request, op = 1, proto = 2, data = controller-0. inet_gethost[932309] (DEBUG):Starting getaddrinfo(controller-0, ...) inet_gethost[932309] (DEBUG):getaddrinfo returned 0 {ok,{hostent,"controller-0.localdomain",[],inet6,16, [{9760,82,0,9134,0,0,0,25}]}}
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHBA-2017:2722