This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 0ea48fce6f4f67edd4ead3bfd1fe5db6ab22d980
Author: laijianbin <[email protected]>
AuthorDate: Fri Jun 29 00:08:30 2018 +0800

    [SCB-693] registry microservice failed if failed to get host address
---
 .../servicecomb/foundation/common/net/NetUtils.java   | 14 ++++++++++++++
 .../foundation/common/net/TestNetUtils.java           | 19 +++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
index dbe8703..a25ec9a 100644
--- 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
+++ 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
@@ -55,6 +55,10 @@ public final class NetUtils {
   private static String hostAddress;
 
   static {
+    doGetHostNameAndHostAddress();
+  }
+
+  private static void doGetHostNameAndHostAddress() {
     try {
       doGetIpv4AddressFromNetworkInterface();
       // getLocalHost will throw exception in some docker image and sometimes 
will do a hostname lookup and time consuming
@@ -193,10 +197,20 @@ public final class NetUtils {
   }
 
   public static String getHostName() {
+    //If failed to get host name ,micro-service will registry failed
+    //So I add retry mechanism
+    if(hostName == null) {
+      doGetHostNameAndHostAddress();
+    }
     return hostName;
   }
 
   public static String getHostAddress() {
+    //If failed to get host address ,micro-service will registry failed
+    //So I add retry mechanism
+    if(hostAddress == null) {
+      doGetHostNameAndHostAddress();
+    }
     return hostAddress;
   }
 
diff --git 
a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
 
b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
index 85eebe2..34efa4e 100644
--- 
a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
+++ 
b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.foundation.common.net;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.util.HashMap;
@@ -107,4 +108,22 @@ public class TestNetUtils {
 
     Assert.assertTrue(NetUtils.canTcpListen(address, port));
   }
+  
+  @Test
+  public void testGetHostName() throws Exception {
+    Assert.assertNotEquals(null, NetUtils.getHostAddress());
+    Assert.assertNotEquals(null, NetUtils.getHostName());
+    
+    Class<?> clazz = 
Class.forName("org.apache.servicecomb.foundation.common.net.NetUtils");
+    Field hostNameField = clazz.getDeclaredField("hostName");
+    hostNameField.setAccessible(true);
+    hostNameField.set(NetUtils.class, null);
+    Assert.assertNotEquals(null, NetUtils.getHostName());
+    
+    Field hostAddressField = clazz.getDeclaredField("hostAddress");
+    hostAddressField.setAccessible(true);
+    hostAddressField.set(NetUtils.class, null);
+    Assert.assertNotEquals(null, NetUtils.getHostAddress());
+  
+  }
 }

Reply via email to