You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Kamilla Aslami (Jira)" <ji...@apache.org> on 2021/05/19 19:17:00 UTC

[jira] [Created] (GEODE-9290) LocalHostUtil.getMyAddresses should not return IPv4-mapped IPv6 addresses

Kamilla Aslami created GEODE-9290:
-------------------------------------

             Summary: LocalHostUtil.getMyAddresses should not return IPv4-mapped IPv6 addresses
                 Key: GEODE-9290
                 URL: https://issues.apache.org/jira/browse/GEODE-9290
             Project: Geode
          Issue Type: Bug
          Components: membership
            Reporter: Kamilla Aslami


This issue was found on RedHat8. While running a test that creates a partitioned region with redundancy 1 and does various entry operations, we noticed this warning in the logs:

Configured redundancy level could not be satisfied. Advise you to start enough data store nodes to satisfy redundancy for the region. Partitioned Region name = /partitionedRegion Redundancy level set to 1 . Number of available data stores: 10 . Number successfully allocated = 1 .

Additional logging showed that Geode thinks all the hosts are equivalent, i.e. the values of {{equivalentHosts}} map in {{ClusterDistributionManager}} contain localhost addresses:

 
{noformat}
{/10.32.110.176=[/10.32.110.176, /127.0.0.1], /127.0.0.1=[/10.32.109.148, /127.0.0.1], /10.32.109.148=[/10.32.109.148, /127.0.0.1], /0:0:0:0:0:ffff:7f00:1%lo=[/10.32.109.148, /0:0:0:0:0:ffff:7f00:1%lo]}
{noformat}
Further analysis revealed that the issue is related to {{LocalHostUtil.getMyAddresses()}} method. Additional logging showed that this method always returns an IPv4 and this IPv6 address:{{0:0:0:0:0:ffff:7f00:1%lo}} . Looking closer at the IPv6 address, we realized that it is in fact an IPv4-mapped IPv6 address that represents {{127.0.0.1}}. The problem with {{0:0:0:0:0:ffff:7f00:1%lo}} is that isLoopbackAddress() method returns false for this address because the IPv6 loopback address is {{/0:0:0:0:0:0:0:1%lo}}. This part of the [Inet6Address documentation|https://docs.oracle.com/javase/8/docs/api/java/net/Inet6Address.html#format]:
{quote}{{IPv4-mapped address:
Of the form::ffff:w.x.y.z, this IPv6 address is used to represent an IPv4 address. It allows the native program to use the same address data structure and also the same socket when communicating with both IPv4 and IPv6 nodes.In InetAddress and Inet6Address, it is used for internal representation; it has no functional role. Java will never return an IPv4-mapped address. These classes can take an IPv4-mapped address as input, both in byte array and text representation. However, it will be converted into an IPv4 address.}}
{quote}
claims that {{Java will never return an IPv4-mapped address}}. And the implementation of {{InetAddress.getByAddress()}} and {{InetAddress.getByName()}} methods is consistent with this claim because both internally call {{IPAddressUtil.convertFromIPv4MappedAddress()}} that converts an IPv4-mapped IPv6 address to IPv4 address. However, {{NetworkInterface.getInetAddresses()}} method (which is used in {{LocalHostUtil.getMyAddresses()}}) should also not return an IPv4-mapped IPv6 address, but it does.

Although this looks like a bug in the jdk, we can avoid IPv4 mapped IPv6 addresses by manually converting them to IPv4 addresses in {{LocalHostUtil.getMyAddresses()}}.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)