[erlang-questions] epmd regression bug in erlang-solutions.com esl-erlang 18.3?
Khitai Pang
khitai.pang@REDACTED
Mon Mar 21 10:57:45 CET 2016
On 2016/3/21 5:27, Michael Santos wrote:
> On Mon, Mar 21, 2016 at 02:23:05AM +0800, Khitai Pang wrote:
>> On 2016/3/20 6:53, Michael Santos wrote:
>>> On Sat, Mar 19, 2016 at 11:47:49PM +0800, Khitai Pang wrote:
>>>> On 2016/3/19 19:45, Michael Santos wrote:
>>>>> On Mar 18, 2016 10:46 PM, "Khitai Pang" <khitai.pang@REDACTED
>>>>> <mailto:khitai.pang@REDACTED>> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have been using the esl-erlang pacakge from
>>>>> https://packages.erlang-solutions.com/erlang/ Ubuntu PPA for
>>>>> Trusty.
>>>>>> I have these in my bashrc:
>>>>>>
>>>>>> export ERL_EPMD_ADDRESS="XXX.XXX.XXX.XXX" (LAN IP of my VM in
>>>>> the cloud)
>>>>>> export ERL_EPMD_PORT="5678"
>>>>> Just tested and it worked for me.
>>>>>
>>>>> Does the IP address in ERL_EPMD_ADDRESS exist in the VM?
>>>>>
>>>> Yes it does, it's the IP of the LAN in the clound, and it all works
>>>> fine with 18.2.
>>>>
>>>> I believe it's possible that the issue is caused by the
>>>> configuration in the operating system (Ubuntu 14.04.4 x86_64) but
>>>> currently I have no idea how to further debug this issue.
>>>>
>>>> With esl-erlang 18.2 and the following configs in bashrc:
>>>>
>>>> export ERL_EPMD_ADDRESS="XXX.XXX.XXX.XXX"
>>>> export ERL_EPMD_PORT="5678"
>>>>
>>>> epmd works fine:
>>>>
>>>> tcp 0 0 127.0.0.1:5678 0.0.0.0:* LISTEN 6754/epmd
>>>> tcp 0 0 10.131.70.80:5678 0.0.0.0:* LISTEN 6754/epmd
>>>>
>>>>
>>>> Thanks
>>>> Khitai
>>>>
>>>>>> Everything worked fine with the 18.2 package. After upgrading
>>>>> to esl-erlang 18.3, epmd stopped to work:
>>>>>>> epmd -debug
>>>>>> epmd: Sat Mar 19 16:16:51 2016: epmd running - daemon = 0
>>>>>> epmd: Sat Mar 19 16:16:51 2016: failed to bind socket: Cannot
>>>>> assign requested address
>>>>>> There is a workaround: if I remove the ERL_EPMD_ADDRESS
>>>>> environment variable, epms works:
>>>>>> tcp 0 0 0.0.0.0:5678 <http://0.0.0.0:5678> 0.0.0.0:*
>>>>> LISTEN 3328/epmd
>>>>>> tcp6 0 0 :::5678 :::* LISTEN 3328/epmd
>>>>>> After downgrading esl-erlang from 18.3 to 18.2, the issue is gone.
>>> Have you disabled IPv6?
>>>
>>> # disable IPv6 support on the loopback device
>>> $ sudo sysctl net.ipv6.conf.lo.disable_ipv6=1
>>>
>>> $ ERL_EPMD_ADDRESS="127.0.0.1" ERL_EPMD_PORT=5678 epmd
>>> epmd: Sat Mar 19 22:40:09 2016: failed to bind socket: Cannot assign requested address
>>>
>>> # enable IPv6 support on the loopback device
>>> $ sudo sysctl net.ipv6.conf.lo.disable_ipv6=0
>>>
>>> $ ERL_EPMD_ADDRESS="127.0.0.1" ERL_EPMD_PORT=5678 epmd
>>> <works>
>>>
>>> If we look at what is happening:
>>>
>>> $ ERL_EPMD_ADDRESS="127.0.0.1" ERL_EPMD_PORT=5678 strace epmd
>>> ...
>>> bind(4, {sa_family=AF_INET6, sin6_port=htons(5678), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EADDRNOTAVAIL (Cannot assign requested address)
>>> ...
>>>
>>> When you specify a specific address to bind, epmd will also bind to the
>>> IPv4 and IPv6 loopbacks. In this case, your OS supports IPv6 but has
>>> disabled it on the loopback device so the bind fails:
>>>
>>> $ ifconfig lo
>>> lo Link encap:Local Loopback
>>> inet addr:127.0.0.1 Mask:255.0.0.0
>>> UP LOOPBACK RUNNING MTU:65536 Metric:1
>>> RX packets:0 errors:0 dropped:0 overruns:0 frame:0
>>> TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
>>> collisions:0 txqueuelen:0
>>> RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
>>>
>>> So either enable IPv6 for the loopback or disable IPv6 completely by
>>> passing "ipv6.disable=1" at boot.
>> Michael,
>>
>> Thanks for the workaround. 2 questions:
>>
>> 1) I have these in my sysctl:
>>
>> net.ipv6.conf.all.disable_ipv6 = 1
>> net.ipv6.conf.default.disable_ipv6 = 1
>> net.ipv6.conf.eth0.disable_ipv6 = 1
>> net.ipv6.conf.eth1.disable_ipv6 = 1
>> net.ipv6.conf.lo.disable_ipv6 = 1
>>
>> Aren't these enough to tell epmd that ipv6 is not available on loopback?
> We can see from your first email that allocating an IPv6 socket and
> binding it to the IPv6 ANY address works:
>
> tcp 0 0 0.0.0.0:5678 0.0.0.0:* LISTEN 3328/epmd
> tcp6 0 0 :::5678 :::* LISTEN 3328/epmd
>
> A system with a working IPv6 implementation must have an IPv6 loopback.
> So I would say your system configuration is broken. If the intent was to
> disable IPv6, it didn't work: you have a half-working system.
Agreed.
> I do think epmd should require explicitly specifying all addresses to
> bind instead of implicitly binding the loopback. So in your case you
> would need to add the IPv4 loopback but it would otherwise work as
> before:
>
> $ ERL_EPMD_ADDRESS="10.131.70.80,127.0.0.1" ERL_EPMD_PORT=5678 epmd
So I should either disable IPv6 completely or enable IPv6 on loopback?
>> 2) Why does 18.2 work in the same environment?
> 18.3 supports node registration for distribution over IPv6 (OTP-13364):
>
> http://erlang.org/download/otp_src_18.3.readme
I see, thanks for the information.
Thanks
Khitai
More information about the erlang-questions
mailing list