[ 
https://issues.apache.org/jira/browse/GEODE-8623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17230279#comment-17230279
 ] 

ASF GitHub Bot commented on GEODE-8623:
---------------------------------------

jinmeiliao commented on a change in pull request #5680:
URL: https://github.com/apache/geode/pull/5680#discussion_r521690818



##########
File path: 
geode-common/src/main/java/org/apache/geode/internal/inet/LocalHostUtil.java
##########
@@ -54,70 +59,80 @@
   private static final boolean useLinkLocalAddresses =
       Boolean.getBoolean(USE_LINK_LOCAL_ADDRESSES_PROPERTY);
 
-  /**
-   * we cache localHost to avoid bug #40619, access-violation in native code
-   */
-  private static final InetAddress localHost;
-
   /**
    * all classes should use this variable to determine whether to use IPv4 or 
IPv6 addresses
    */
   @MakeNotStatic
   private static boolean useIPv6Addresses = 
!Boolean.getBoolean("java.net.preferIPv4Stack")
       && Boolean.getBoolean("java.net.preferIPv6Addresses");
 
-  static {
-    InetAddress inetAddress = null;
+  /**
+   * Resolves local host. Will retry if resolution fails.
+   *
+   * @return local host if resolved otherwise null.
+   */
+  private static InetAddress resolveLocalHost() {
     try {
-      inetAddress = 
InetAddress.getByAddress(InetAddress.getLocalHost().getAddress());
-      if (inetAddress.isLoopbackAddress()) {
-        InetAddress ipv4Fallback = null;
-        InetAddress ipv6Fallback = null;
-        // try to find a non-loopback address
-        Set<InetAddress> myInterfaces = getMyAddresses();
-        boolean preferIPv6 = useIPv6Addresses;
-        String lhName = null;
-        for (InetAddress addr : myInterfaces) {
-          if (addr.isLoopbackAddress() || addr.isAnyLocalAddress() || lhName 
!= null) {
-            break;
-          }
-          boolean ipv6 = addr instanceof Inet6Address;
-          boolean ipv4 = addr instanceof Inet4Address;
-          if ((preferIPv6 && ipv6) || (!preferIPv6 && ipv4)) {
-            String addrName = reverseDNS(addr);
-            if (inetAddress.isLoopbackAddress()) {
-              inetAddress = addr;
-              lhName = addrName;
-            } else if (addrName != null) {
-              inetAddress = addr;
-              lhName = addrName;
+      return tryFor(() -> {
+        InetAddress inetAddress = null;
+        try {
+          inetAddress = 
InetAddress.getByAddress(InetAddress.getLocalHost().getAddress());
+          if (inetAddress.isLoopbackAddress()) {
+            InetAddress ipv4Fallback = null;
+            InetAddress ipv6Fallback = null;
+            // try to find a non-loopback address
+            Set<InetAddress> myInterfaces = getMyAddresses();
+            boolean preferIPv6 = useIPv6Addresses;
+            String lhName = null;
+            for (InetAddress addr : myInterfaces) {
+              if (addr.isLoopbackAddress() || addr.isAnyLocalAddress() || 
lhName != null) {
+                break;
+              }
+              boolean ipv6 = addr instanceof Inet6Address;
+              boolean ipv4 = addr instanceof Inet4Address;
+              if ((preferIPv6 && ipv6) || (!preferIPv6 && ipv4)) {
+                String addrName = reverseDNS(addr);
+                if (inetAddress.isLoopbackAddress()) {
+                  inetAddress = addr;
+                  lhName = addrName;
+                } else if (addrName != null) {
+                  inetAddress = addr;
+                  lhName = addrName;
+                }
+              } else {
+                if (preferIPv6 && ipv4 && ipv4Fallback == null) {
+                  ipv4Fallback = addr;
+                } else if (!preferIPv6 && ipv6 && ipv6Fallback == null) {
+                  ipv6Fallback = addr;
+                }
+              }
             }
-          } else {
-            if (preferIPv6 && ipv4 && ipv4Fallback == null) {
-              ipv4Fallback = addr;
-            } else if (!preferIPv6 && ipv6 && ipv6Fallback == null) {
-              ipv6Fallback = addr;
+            // vanilla Ubuntu installations will have a usable IPv6 address 
when
+            // running as a guest OS on an IPv6-enabled machine. We also look 
for
+            // the alternative IPv4 configuration.
+            if (inetAddress.isLoopbackAddress()) {
+              if (ipv4Fallback != null) {
+                inetAddress = ipv4Fallback;
+                useIPv6Addresses = false;
+              } else if (ipv6Fallback != null) {
+                inetAddress = ipv6Fallback;
+                useIPv6Addresses = true;
+              }
             }
           }
+        } catch (UnknownHostException ignored) {
         }
-        // vanilla Ubuntu installations will have a usable IPv6 address when
-        // running as a guest OS on an IPv6-enabled machine. We also look for
-        // the alternative IPv4 configuration.
-        if (inetAddress.isLoopbackAddress()) {
-          if (ipv4Fallback != null) {
-            inetAddress = ipv4Fallback;
-            useIPv6Addresses = false;
-          } else if (ipv6Fallback != null) {
-            inetAddress = ipv6Fallback;
-            useIPv6Addresses = true;
-          }
-        }
-      }
-    } catch (UnknownHostException ignored) {
+        return inetAddress;
+      }, Objects::nonNull, 1, MINUTES);

Review comment:
       you mean we should have some interval between retires?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> Timing between DNS and Geode startup can result in permanent unknown host 
> exceptions.
> -------------------------------------------------------------------------------------
>
>                 Key: GEODE-8623
>                 URL: https://issues.apache.org/jira/browse/GEODE-8623
>             Project: Geode
>          Issue Type: Bug
>    Affects Versions: 1.9.0, 1.9.1, 1.10.0, 1.9.2, 1.11.0, 1.12.0, 1.13.0, 
> 1.14.0, 1.13.1
>            Reporter: Jacob Barrett
>            Priority: Minor
>              Labels: pull-request-available
>
> In a managed environment were local host name DNS entries and the startup of 
> Geode happen concurrently it is possible for Geode to fail name resolution in 
> the local hostname caching. If it fails to resolve the local hostname when 
> loading the caching utility class then any service dependent on this name 
> will fail without chance for recovery.
> {code}
> [error 2020/09/30 19:50:21.644 UTC <main> tid=0x1] Jmx manager could not be 
> started because java.net.UnknownHostException
> org.apache.geode.management.ManagementException: java.net.UnknownHostException
>       at 
> org.apache.geode.management.internal.ManagementAgent.startAgent(ManagementAgent.java:133)
>       at 
> org.apache.geode.management.internal.SystemManagementService.startManager(SystemManagementService.java:432)
>       at 
> org.apache.geode.management.internal.beans.ManagementAdapter.handleCacheCreation(ManagementAdapter.java:181)
>       at 
> org.apache.geode.management.internal.beans.ManagementListener.handleEvent(ManagementListener.java:127)
>       at 
> org.apache.geode.distributed.internal.InternalDistributedSystem.notifyResourceEventListeners(InternalDistributedSystem.java:2063)
>       at 
> org.apache.geode.distributed.internal.InternalDistributedSystem.handleResourceEvent(InternalDistributedSystem.java:606)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1239)
>       at 
> org.apache.geode.internal.cache.InternalCacheBuilder.create(InternalCacheBuilder.java:219)
>       at 
> org.apache.geode.internal.cache.InternalCacheBuilder.create(InternalCacheBuilder.java:171)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:142)
>       at 
> org.apache.geode.distributed.internal.DefaultServerLauncherCacheProvider.createCache(DefaultServerLauncherCacheProvider.java:52)
>       at 
> org.apache.geode.distributed.ServerLauncher.createCache(ServerLauncher.java:887)
>       at 
> org.apache.geode.distributed.ServerLauncher.start(ServerLauncher.java:803)
>       at 
> org.apache.geode.distributed.ServerLauncher.run(ServerLauncher.java:732)
>       at 
> org.apache.geode.distributed.ServerLauncher.main(ServerLauncher.java:251)
> Caused by: java.net.UnknownHostException
>       at 
> org.apache.geode.internal.net.SocketCreator.getLocalHost(SocketCreator.java:285)
>       at 
> org.apache.geode.management.internal.ManagementAgent.configureAndStart(ManagementAgent.java:310)
>       at 
> org.apache.geode.management.internal.ManagementAgent.startAgent(ManagementAgent.java:131)
>       ... 14 more
> [error 2020/09/30 19:50:21.724 UTC <main> tid=0x1] 
> org.apache.geode.management.ManagementException: java.net.UnknownHostException
> Exception in thread "main" org.apache.geode.management.ManagementException: 
> java.net.UnknownHostException
>       at 
> org.apache.geode.management.internal.ManagementAgent.startAgent(ManagementAgent.java:133)
>       at 
> org.apache.geode.management.internal.SystemManagementService.startManager(SystemManagementService.java:432)
>       at 
> org.apache.geode.management.internal.beans.ManagementAdapter.handleCacheCreation(ManagementAdapter.java:181)
>       at 
> org.apache.geode.management.internal.beans.ManagementListener.handleEvent(ManagementListener.java:127)
>       at 
> org.apache.geode.distributed.internal.InternalDistributedSystem.notifyResourceEventListeners(InternalDistributedSystem.java:2063)
>       at 
> org.apache.geode.distributed.internal.InternalDistributedSystem.handleResourceEvent(InternalDistributedSystem.java:606)
>       at 
> org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1239)
>       at 
> org.apache.geode.internal.cache.InternalCacheBuilder.create(InternalCacheBuilder.java:219)
>       at 
> org.apache.geode.internal.cache.InternalCacheBuilder.create(InternalCacheBuilder.java:171)
>       at org.apache.geode.cache.CacheFactory.create(CacheFactory.java:142)
>       at 
> org.apache.geode.distributed.internal.DefaultServerLauncherCacheProvider.createCache(DefaultServerLauncherCacheProvider.java:52)
>       at 
> org.apache.geode.distributed.ServerLauncher.createCache(ServerLauncher.java:887)
>       at 
> org.apache.geode.distributed.ServerLauncher.start(ServerLauncher.java:803)
>       at 
> org.apache.geode.distributed.ServerLauncher.run(ServerLauncher.java:732)
>       at 
> org.apache.geode.distributed.ServerLauncher.main(ServerLauncher.java:251)
> Caused by: java.net.UnknownHostException
>       at 
> org.apache.geode.internal.net.SocketCreator.getLocalHost(SocketCreator.java:285)
>       at 
> org.apache.geode.management.internal.ManagementAgent.configureAndStart(ManagementAgent.java:310)
>       at 
> org.apache.geode.management.internal.ManagementAgent.startAgent(ManagementAgent.java:131)
>       ... 14 more
> {code}



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

Reply via email to