GEODE-2804 Caching the InetAddress for configured ip string

    1. We keep configure host string in HostAddress class
    2. We reuse InetsocketAddress if it is ipString.
    3. Client has logic to retry thus we keep InetsocketAddress even if
       it is not ip string.

    GEODE-3017 IPv6 issue on windows. Above changes fixed this issue.

    GEODE-2940 Now we don't validate configure host string on start. As
    there is possibility that host may not available.

    1. Earlier wan config were failing because of that. Now we just keep
    those configure host string. And try this later.

    Added unit tests for it.


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/ea8840fc
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/ea8840fc
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/ea8840fc

Branch: refs/heads/feature/GEODE-2804v3
Commit: ea8840fc98c794e58f380fb6a82f1002f195152e
Parents: 3a46b79
Author: Hitesh Khamesra <hkhame...@pivotal.io>
Authored: Tue Jun 27 12:51:12 2017 -0700
Committer: Hitesh Khamesra <hkhame...@pivotal.io>
Committed: Tue Jun 27 12:54:17 2017 -0700

----------------------------------------------------------------------
 geode-assembly/build.gradle                     |   1 +
 .../src/test/resources/expected_jars.txt        |   3 +-
 geode-core/build.gradle                         |   3 +
 .../admin/internal/DistributionLocatorImpl.java |   6 +-
 .../internal/AutoConnectionSourceImpl.java      | 133 +++++++++++--------
 .../geode/cache/client/internal/PoolImpl.java   |  15 ++-
 .../internal/AbstractDistributionConfig.java    |   8 +-
 .../internal/InternalDistributedSystem.java     |   6 +-
 .../internal/membership/gms/GMSUtil.java        |  11 +-
 .../membership/gms/locator/GMSLocator.java      |   9 +-
 .../membership/gms/membership/GMSJoinLeave.java |   8 +-
 .../membership/gms/membership/HostAddress.java  | 118 ++++++++++++++++
 .../internal/tcpserver/TcpClient.java           |   3 +-
 .../admin/remote/DistributionLocatorId.java     |  45 +++++--
 .../admin/remote/RemoteTransportConfig.java     |   5 +-
 .../cache/ClusterConfigurationLoader.java       |   2 +-
 .../geode/internal/cache/PoolFactoryImpl.java   |  30 +++--
 .../internal/AutoConnectionSourceDUnitTest.java |  12 +-
 .../AutoConnectionSourceImplJUnitTest.java      |  84 ++++++++++--
 .../internal/DistributionConfigJUnitTest.java   |   2 +-
 .../internal/StartupMessageDataJUnitTest.java   |   4 +-
 .../gms/membership/GMSJoinLeaveJUnitTest.java   |   1 +
 .../geode/codeAnalysis/excludedClasses.txt      |   3 +-
 .../internal/locator/wan/LocatorDiscovery.java  |  10 +-
 .../wan/LocatorMembershipListenerImpl.java      |   8 +-
 .../cache/wan/AbstractRemoteGatewaySender.java  |   4 +-
 .../wan/misc/WanAutoDiscoveryDUnitTest.java     |   7 +-
 gradle/dependency-versions.properties           |   1 +
 28 files changed, 403 insertions(+), 139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-assembly/build.gradle
----------------------------------------------------------------------
diff --git a/geode-assembly/build.gradle b/geode-assembly/build.gradle
index 39bb542..95ccc70 100755
--- a/geode-assembly/build.gradle
+++ b/geode-assembly/build.gradle
@@ -140,6 +140,7 @@ def cp = {
         it.contains('commons-collections') ||
         it.contains('commons-lang') ||
         it.contains('commons-logging') ||
+        it.contains('commons-validator') ||        
         it.contains('fast-classpath-scanner') ||
         it.contains('fastutil') ||
         it.contains('jackson-annotations') ||

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-assembly/src/test/resources/expected_jars.txt
----------------------------------------------------------------------
diff --git a/geode-assembly/src/test/resources/expected_jars.txt 
b/geode-assembly/src/test/resources/expected_jars.txt
index 6260167..b0e7154 100644
--- a/geode-assembly/src/test/resources/expected_jars.txt
+++ b/geode-assembly/src/test/resources/expected_jars.txt
@@ -85,4 +85,5 @@ springfox-spring-web
 springfox-swagger
 springfox-swagger-common
 springfox-swagger-ui
-swagger-models
\ No newline at end of file
+swagger-models
+commons-validator

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/build.gradle
----------------------------------------------------------------------
diff --git a/geode-core/build.gradle b/geode-core/build.gradle
index 7f34b4a..9ecb0f9 100755
--- a/geode-core/build.gradle
+++ b/geode-core/build.gradle
@@ -39,6 +39,8 @@ dependencies {
   compile 'antlr:antlr:' + project.'antlr.version'
   compile 'com.fasterxml.jackson.core:jackson-databind:' + 
project.'jackson.version'
   compile 'commons-io:commons-io:' + project.'commons-io.version'
+  compile 'commons-validator:commons-validator:' + 
project.'commons-validator.version'
+
   compile 'commons-lang:commons-lang:' + project.'commons-lang.version'
   compile ('commons-modeler:commons-modeler:' + 
project.'commons-modeler.version') {
     exclude module: 'commons-digester'
@@ -133,6 +135,7 @@ dependencies {
   testRuntime 'commons-collections:commons-collections:' + 
project.'commons-collections.version'
   testRuntime 'commons-configuration:commons-configuration:' + 
project.'commons-configuration.version'
   testRuntime 'commons-io:commons-io:' + project.'commons-io.version'
+  testRuntime 'commons-validator:commons-validator:' + 
project.'commons-validator.version'
   testCompile 'net.spy:spymemcached:' + project.'spymemcached.version'
   testCompile 'redis.clients:jedis:' + project.'jedis.version'
 

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
 
b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
index c1bfc93..97c5c7d 100755
--- 
a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
@@ -193,14 +193,14 @@ public class DistributionLocatorImpl implements 
DistributionLocator, InternalMan
       for (Iterator<String> locatorIter =
           hostedLocators.get(memberIter.next()).iterator(); 
locatorIter.hasNext();) {
         DistributionLocatorId locator = new 
DistributionLocatorId(locatorIter.next());
-        found = found || locator.getHost().getHostAddress().equals(host);
-        found = found || locator.getHost().getHostName().equals(host);
+        found = found || locator.getHostName().equals(host);
         if (!found && !host.contains(".")) {
           try {
             InetAddress inetAddr = InetAddress.getByName(host);
             found = 
locator.getHost().getHostName().equals(inetAddr.getHostName());
             if (!found) {
-              found = 
locator.getHost().getHostAddress().equals(inetAddr.getHostAddress());
+              found =
+                  
locator.getHost().getAddress().getHostAddress().equals(inetAddr.getHostAddress());
             }
           } catch (UnknownHostException e) {
             // try config host as if it is an IP address instead of host name

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
index 070451c..7bf9f23 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
@@ -49,6 +49,7 @@ import 
org.apache.geode.cache.client.internal.locator.ServerLocationRequest;
 import org.apache.geode.cache.client.internal.locator.ServerLocationResponse;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.ServerLocation;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
 import org.apache.geode.internal.i18n.LocalizedStrings;
@@ -69,9 +70,11 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
   private TcpClient tcpClient;
 
   protected static final LocatorListRequest LOCATOR_LIST_REQUEST = new 
LocatorListRequest();
-  private static final Comparator<InetSocketAddress> SOCKET_ADDRESS_COMPARATOR 
=
-      new Comparator<InetSocketAddress>() {
-        public int compare(InetSocketAddress o1, InetSocketAddress o2) {
+  private static final Comparator<HostAddress> SOCKET_ADDRESS_COMPARATOR =
+      new Comparator<HostAddress>() {
+        public int compare(HostAddress la1, HostAddress la2) {
+          InetSocketAddress o1 = la1.getSocketInetAddress();
+          InetSocketAddress o2 = la2.getSocketInetAddress();
           // shouldn't happen, but if it does we'll say they're the same.
           if (o1.getAddress() == null || o2.getAddress() == null) {
             return 0;
@@ -87,7 +90,7 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
             return o1.getPort() - o2.getPort();
         }
       };
-  protected final List<InetSocketAddress> initialLocators;
+  protected final List<HostAddress> initialLocators;
   private final String serverGroup;
   private AtomicReference<LocatorList> locators = new 
AtomicReference<LocatorList>();
   private AtomicReference<LocatorList> onlineLocators = new 
AtomicReference<LocatorList>();
@@ -108,12 +111,18 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
    * @param serverGroup
    * @param handshakeTimeout
    */
-  public AutoConnectionSourceImpl(List<InetSocketAddress> contacts, String 
serverGroup,
-      int handshakeTimeout) {
-    ArrayList<InetSocketAddress> tmpContacts = new 
ArrayList<InetSocketAddress>(contacts);
+  public AutoConnectionSourceImpl(List<InetSocketAddress> locators, 
List<HostAddress> contacts,
+      String serverGroup, int handshakeTimeout) {
+    /*
+     * if (contacts == null || contacts.size() == 0) { contacts = new 
ArrayList<>(); for
+     * (InetSocketAddress l : locators) { LocatorAddress la = new 
LocatorAddress(l,
+     * l.getHostName()); contacts.add(la); } }
+     */
+    ArrayList<HostAddress> tmpContacts =
+        new ArrayList<HostAddress>(Collections.unmodifiableList(contacts));
     this.locators.set(new LocatorList(tmpContacts));
     this.onlineLocators.set(new LocatorList(Collections.emptyList()));
-    this.initialLocators = Collections.unmodifiableList(tmpContacts);
+    this.initialLocators = 
Collections.unmodifiableList(this.locators.get().getLocatorAddresses());
     this.connectionTimeout = handshakeTimeout;
     this.serverGroup = serverGroup;
     this.tcpClient = new TcpClient();
@@ -202,20 +211,21 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
   }
 
 
-  private ServerLocationResponse queryOneLocator(InetSocketAddress locator,
+  private ServerLocationResponse queryOneLocator(HostAddress locator,
       ServerLocationRequest request) {
     Object returnObj = null;
     try {
       pool.getStats().incLocatorRequests();
-      returnObj = tcpClient.requestToServer(locator, request, 
connectionTimeout, true);
+      returnObj = tcpClient.requestToServer(locator.getSocketInetAddressC(), 
request,
+          connectionTimeout, true);
       ServerLocationResponse response = (ServerLocationResponse) returnObj;
       pool.getStats().incLocatorResponses();
       if (response != null) {
-        reportLiveLocator(locator);
+        reportLiveLocator(locator.getSocketInetAddressC());
       }
       return response;
     } catch (IOException ioe) {
-      reportDeadLocator(locator, ioe);
+      reportDeadLocator(locator.getSocketInetAddressC(), ioe);
       updateLocatorInLocatorList(locator);
       return null;
     } catch (ClassNotFoundException e) {
@@ -228,7 +238,7 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
       if (logger.isDebugEnabled()) {
         logger.debug("Received odd response object from the locator: {}", 
returnObj);
       }
-      reportDeadLocator(locator, e);
+      reportDeadLocator(locator.getSocketInetAddressC(), e);
       return null;
     }
   }
@@ -240,19 +250,20 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
    * 
    * @param locator
    */
-  protected void updateLocatorInLocatorList(InetSocketAddress locator) {
-    if (locator.getHostName() != null) {
+  protected void updateLocatorInLocatorList(HostAddress locator) {
+    if (locator.getSocketInetAddressC().getHostName() != null && 
!locator.isIpString()) {
       LocatorList locatorList = locators.get();
-      List<InetSocketAddress> newLocatorsList = new ArrayList<>();
+      List<HostAddress> newLocatorsList = new ArrayList<>();
 
-      for (InetSocketAddress tloc : locatorList.getLocators()) {
+      for (HostAddress tloc : locatorList.getLocatorAddresses()) {
         if (tloc.equals(locator)) {
           /**
            * This call doesn't throw UnknownHostException;
            */
-          InetSocketAddress changeLoc =
-              new InetSocketAddress(locator.getHostName(), locator.getPort());
-          newLocatorsList.add(changeLoc);
+          InetSocketAddress changeLoc = new 
InetSocketAddress(locator.getHostName(),
+              locator.getSocketInetAddressC().getPort());
+          HostAddress la = new HostAddress(changeLoc, locator.getHostName());
+          newLocatorsList.add(la);
           logger.info("updateLocatorInLocatorList changing locator list: loc 
form: " + locator
               + " ,loc to: " + changeLoc);
         } else {
@@ -269,7 +280,7 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
   }
 
   protected List<InetSocketAddress> getCurrentLocators() {
-    return locators.get().locators;
+    return locators.get().getLocators();
   }
 
   protected ServerLocationResponse queryLocators(ServerLocationRequest 
request) {
@@ -278,13 +289,13 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
 
     final boolean isDebugEnabled = logger.isDebugEnabled();
     do {
-      InetSocketAddress locator = (InetSocketAddress) controllerItr.next();
+      HostAddress la = (HostAddress) controllerItr.next();
       if (isDebugEnabled) {
-        logger.debug("Sending query to locator {}: {}", locator, request);
+        logger.debug("Sending query to locator {}: {}", la, request);
       }
-      response = queryOneLocator(locator, request);
+      response = queryOneLocator(la, request);
       if (isDebugEnabled) {
-        logger.debug("Received query response from locator {}: {}", locator, 
response);
+        logger.debug("Received query response from locator {}: {}", la, 
response);
       }
     } while (controllerItr.hasNext() && (response == null || 
!response.hasResult()));
 
@@ -301,28 +312,31 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
     isBalanced = response.isBalanced();
     List<ServerLocation> locatorResponse = response.getLocators();
 
-    List<InetSocketAddress> newLocators = new 
ArrayList<InetSocketAddress>(locatorResponse.size());
-    List<InetSocketAddress> newOnlineLocators =
-        new ArrayList<InetSocketAddress>(locatorResponse.size());
+    List<HostAddress> newLocatorAddresses = new 
ArrayList<HostAddress>(locatorResponse.size());
+    List<HostAddress> newOnlineLocators = new 
ArrayList<>(locatorResponse.size());
 
-    Set<InetSocketAddress> badLocators = new 
HashSet<InetSocketAddress>(initialLocators);
+    Set<HostAddress> badLocators = new HashSet<>(initialLocators);
     for (Iterator<ServerLocation> itr = locatorResponse.iterator(); 
itr.hasNext();) {
       ServerLocation locator = itr.next();
       InetSocketAddress address = new InetSocketAddress(locator.getHostName(), 
locator.getPort());
-      newLocators.add(address);
-      newOnlineLocators.add(address);
-      badLocators.remove(address);
+      HostAddress la = new HostAddress(address, locator.getHostName());
+      newLocatorAddresses.add(la);
+      newOnlineLocators.add(la);
+      badLocators.remove(la);
     }
 
-    addbadLocators(newLocators, badLocators);
+    addbadLocators(newLocatorAddresses, badLocators);
+
+    LocatorList newLocatorList = new LocatorList(newLocatorAddresses);
 
     if (logger.isInfoEnabled()) {
+      List<InetSocketAddress> newLocators = newLocatorList.getLocators();
       LocatorList oldLocators = (LocatorList) locators.get();
       ArrayList<InetSocketAddress> removedLocators =
           new ArrayList<InetSocketAddress>(oldLocators.getLocators());
       removedLocators.removeAll(newLocators);
 
-      ArrayList<InetSocketAddress> addedLocators = new 
ArrayList<InetSocketAddress>(newLocators);
+      ArrayList<InetSocketAddress> addedLocators = new 
ArrayList<>(newLocators);
       addedLocators.removeAll(oldLocators.getLocators());
       if (!addedLocators.isEmpty()) {
         
locatorCallback.locatorsDiscovered(Collections.unmodifiableList(addedLocators));
@@ -337,34 +351,33 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
             removedLocators));
       }
     }
-    LocatorList newLocatorList = new LocatorList(newLocators);
+
+
 
     locators.set(newLocatorList);
     onlineLocators.set(new LocatorList(newOnlineLocators));
-    pool.getStats().setLocatorCount(newLocators.size());
+    pool.getStats().setLocatorCount(newLocatorAddresses.size());
   }
 
   /**
    * This method will add bad locator only when locator with hostname and port 
is not already in
    * list.
    */
-  protected void addbadLocators(List<InetSocketAddress> newLocators,
-      Set<InetSocketAddress> badLocators) {
-    for (InetSocketAddress badLoc : badLocators) {
+  protected void addbadLocators(List<HostAddress> newLocators, 
Set<HostAddress> badLocators) {
+    for (HostAddress badloc : badLocators) {
       boolean addIt = true;
-      for (InetSocketAddress goodloc : newLocators) {
-        boolean isSameHost = 
badLoc.getHostName().equals(goodloc.getHostName());
-        if (isSameHost) {
-          boolean isSamePort = badLoc.getPort() == goodloc.getPort();
-          if (isSamePort) {
-            // ip has been changed so don't add this in current list
-            addIt = false;
-            break;
-          }
+      for (HostAddress goodloc : newLocators) {
+        boolean isSameHost = 
badloc.getHostName().equals(goodloc.getHostName());
+        if (isSameHost && badloc.getPort() == goodloc.getPort()) {
+          // ip has been changed so don't add this in current
+          // list
+          addIt = false;
+          break;
+
         }
       }
       if (addIt) {
-        newLocators.add(badLoc);
+        newLocators.add(badloc);
       }
     }
   }
@@ -423,15 +436,23 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
    * A list of locators, which remembers the last known good locator.
    */
   private static class LocatorList {
-    protected final List<InetSocketAddress> locators;
+    protected final List<HostAddress> locators;
     protected AtomicInteger currentLocatorIndex = new AtomicInteger();
 
-    public LocatorList(List<InetSocketAddress> locators) {
+    public LocatorList(List<HostAddress> locators) {
       Collections.sort(locators, SOCKET_ADDRESS_COMPARATOR);
       this.locators = Collections.unmodifiableList(locators);
     }
 
-    public Collection<InetSocketAddress> getLocators() {
+    public List<InetSocketAddress> getLocators() {
+      List<InetSocketAddress> locs = new ArrayList<>();
+      for (HostAddress la : locators) {
+        locs.add(la.getSocketInetAddress());
+      }
+      return locs;
+    }
+
+    public List<HostAddress> getLocatorAddresses() {
       return locators;
     }
 
@@ -439,7 +460,7 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
       return locators.size();
     }
 
-    public Iterator<InetSocketAddress> iterator() {
+    public Iterator<HostAddress> iterator() {
       return new LocatorIterator();
     }
 
@@ -454,7 +475,7 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
      * controller.
      * 
      */
-    protected class LocatorIterator implements Iterator<InetSocketAddress> {
+    protected class LocatorIterator implements Iterator<HostAddress> {
       private int startLocator = currentLocatorIndex.get();
       private int locatorNum = 0;
 
@@ -462,12 +483,12 @@ public class AutoConnectionSourceImpl implements 
ConnectionSource {
         return locatorNum < locators.size();
       }
 
-      public InetSocketAddress next() {
+      public HostAddress next() {
         if (!hasNext()) {
           return null;
         } else {
           int index = (locatorNum + startLocator) % locators.size();
-          InetSocketAddress nextLocator = locators.get(index);
+          HostAddress nextLocator = locators.get(index);
           currentLocatorIndex.set(index);
           locatorNum++;
           return nextLocator;

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
index 3ded54a..332046d 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
@@ -55,6 +55,7 @@ import org.apache.geode.distributed.PoolCancelledException;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.internal.ScheduledThreadPoolExecutorWithKeepAlive;
 import org.apache.geode.internal.admin.ClientStatsManager;
 import org.apache.geode.internal.cache.EventID;
@@ -111,6 +112,7 @@ public class PoolImpl implements InternalPool {
   private final int subscriptionMessageTrackingTimeout;
   private final int subscriptionAckInterval;
   private final String serverGroup;
+  private final List<HostAddress> locatorAddresses;
   private final List<InetSocketAddress> locators;
   private final List<InetSocketAddress> servers;
   private final boolean startDisabled;
@@ -151,8 +153,9 @@ public class PoolImpl implements InternalPool {
   public static final int PRIMARY_QUEUE_TIMED_OUT = -1;
   private AtomicInteger primaryQueueSize = new 
AtomicInteger(PRIMARY_QUEUE_NOT_AVAILABLE);
 
-  public static PoolImpl create(PoolManagerImpl pm, String name, Pool 
attributes) {
-    PoolImpl pool = new PoolImpl(pm, name, attributes);
+  public static PoolImpl create(PoolManagerImpl pm, String name, Pool 
attributes,
+      List<HostAddress> locatorAddresses) {
+    PoolImpl pool = new PoolImpl(pm, name, attributes, locatorAddresses);
     pool.finishCreate(pm);
     return pool;
   }
@@ -178,7 +181,8 @@ public class PoolImpl implements InternalPool {
     }
   }
 
-  protected PoolImpl(PoolManagerImpl pm, String name, Pool attributes) {
+  protected PoolImpl(PoolManagerImpl pm, String name, Pool attributes,
+      List<HostAddress> locAddresses) {
     this.pm = pm;
     this.name = name;
     this.socketConnectTimeout = attributes.getSocketConnectTimeout();
@@ -200,6 +204,7 @@ public class PoolImpl implements InternalPool {
     this.subscriptionAckInterval = attributes.getSubscriptionAckInterval();
     this.serverGroup = attributes.getServerGroup();
     this.multiuserSecureModeEnabled = attributes.getMultiuserAuthentication();
+    this.locatorAddresses = locAddresses;
     this.locators = attributes.getLocators();
     this.servers = attributes.getServers();
     this.startDisabled =
@@ -643,8 +648,8 @@ public class PoolImpl implements InternalPool {
     if (locators.isEmpty()) {
       return new ExplicitConnectionSourceImpl(getServers());
     } else {
-      AutoConnectionSourceImpl source =
-          new AutoConnectionSourceImpl(locators, getServerGroup(), 
socketConnectTimeout);
+      AutoConnectionSourceImpl source = new AutoConnectionSourceImpl(locators, 
locatorAddresses,
+          getServerGroup(), socketConnectTimeout);
       if (locatorDiscoveryCallback != null) {
         source.setLocatorDiscoveryCallback(locatorDiscoveryCallback);
       }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/AbstractDistributionConfig.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/AbstractDistributionConfig.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/AbstractDistributionConfig.java
index 01c6157..795f6a5 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/AbstractDistributionConfig.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/AbstractDistributionConfig.java
@@ -24,11 +24,13 @@ import org.apache.geode.internal.AbstractConfig;
 import org.apache.geode.internal.ConfigSource;
 import org.apache.geode.internal.admin.remote.DistributionLocatorId;
 import org.apache.geode.internal.i18n.LocalizedStrings;
+import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.logging.LogWriterImpl;
 import org.apache.geode.internal.logging.log4j.LogLevel;
 import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
 import org.apache.geode.memcached.GemFireMemcachedServer;
+import org.apache.logging.log4j.Logger;
 
 import java.lang.reflect.Method;
 import java.net.InetAddress;
@@ -54,6 +56,8 @@ import java.util.StringTokenizer;
 public abstract class AbstractDistributionConfig extends AbstractConfig
     implements DistributionConfig {
 
+  private static final Logger logger = LogService.getLogger();
+
   protected Object checkAttribute(String attName, Object value) {
     // first check to see if this attribute is modifiable, this also checks if 
the attribute is a
     // valid one.
@@ -274,9 +278,7 @@ public abstract class AbstractDistributionConfig extends 
AbstractConfig
         hostAddress = InetAddress.getByName(host);
 
       } catch (UnknownHostException ex) {
-        throw new IllegalArgumentException(
-            LocalizedStrings.AbstractDistributionConfig_UNKNOWN_LOCATOR_HOST_0
-                .toLocalizedString(host));
+        logger.warn("Unknown locator host: " + host);
       }
 
       locatorsb.append(host);

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
index a4b3a50..6aa602f 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
@@ -845,8 +845,8 @@ public class InternalDistributedSystem extends 
DistributedSystem
                                                                                
      // Appenders
               this.securityLogWriter, // LOG: this is after IDS has created 
LogWriterLoggers and
                                       // Appenders
-              locId.getHost(), locId.getHostnameForClients(), 
this.originalConfig.toProperties(),
-              false);
+              locId.getHost().getAddress(), locId.getHostnameForClients(),
+              this.originalConfig.toProperties(), false);
 
       // if locator is started this way, cluster config is not enabled, set 
the flag correctly
       this.startedLocator.getConfig().setEnableClusterConfiguration(false);
@@ -1595,7 +1595,7 @@ public class InternalDistributedSystem extends 
DistributedSystem
       if (addr != null && addr.trim().length() > 0) {
         canonical.append(addr);
       } else {
-        canonical.append(locId.getHost().getHostAddress());
+        canonical.append(locId.getHostName());
       }
       canonical.append("[");
       canonical.append(String.valueOf(locId.getPort()));

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
index da295ab..9f3126a 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
@@ -24,6 +24,7 @@ import java.util.StringTokenizer;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.GemFireConfigException;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.internal.net.SocketCreator;
 
 public class GMSUtil {
@@ -35,7 +36,7 @@ public class GMSUtil {
    * @param bindAddress optional address to check for loopback compatibility
    * @return addresses of locators
    */
-  public static List<InetSocketAddress> parseLocators(String locatorsString, 
String bindAddress) {
+  public static List<HostAddress> parseLocators(String locatorsString, String 
bindAddress) {
     InetAddress addr = null;
 
     try {
@@ -57,9 +58,8 @@ public class GMSUtil {
    * @param bindAddress optional address to check for loopback compatibility
    * @return addresses of locators
    */
-  public static List<InetSocketAddress> parseLocators(String locatorsString,
-      InetAddress bindAddress) {
-    List<InetSocketAddress> result = new ArrayList<>(2);
+  public static List<HostAddress> parseLocators(String locatorsString, 
InetAddress bindAddress) {
+    List<HostAddress> result = new ArrayList<>(2);
     String host;
     int port;
     boolean checkLoopback = (bindAddress != null);
@@ -95,7 +95,8 @@ public class GMSUtil {
                     + ").  On Unix this usually means that /etc/hosts is 
misconfigured.");
           }
         }
-        result.add(isa);
+        HostAddress la = new HostAddress(isa, host);
+        result.add(la);
       } catch (NumberFormatException e) {
         // this shouldn't happen because the config has already been parsed and
         // validated

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
index aff1938..6c7af90 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
@@ -51,6 +51,7 @@ import 
org.apache.geode.distributed.internal.membership.gms.GMSUtil;
 import org.apache.geode.distributed.internal.membership.gms.NetLocator;
 import org.apache.geode.distributed.internal.membership.gms.Services;
 import org.apache.geode.distributed.internal.membership.gms.interfaces.Locator;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import 
org.apache.geode.distributed.internal.membership.gms.mgr.GMSMembershipManager;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpServer;
@@ -70,7 +71,7 @@ public class GMSLocator implements Locator, NetLocator {
   private final boolean networkPartitionDetectionEnabled;
   private final String securityUDPDHAlgo;
   private final String locatorString;
-  private final List<InetSocketAddress> locators;
+  private final List<HostAddress> locators;
   private Services services;
   private final LocatorStats stats;
   private InternalDistributedMember localAddress;
@@ -106,7 +107,7 @@ public class GMSLocator implements Locator, NetLocator {
     this.securityUDPDHAlgo = securityUDPDHAlgo;
     this.locatorString = locatorString;
     if (this.locatorString == null || this.locatorString.length() == 0) {
-      this.locators = new ArrayList<>(0);
+      this.locators = new ArrayList<HostAddress>(0);
     } else {
       this.locators = GMSUtil.parseLocators(locatorString, bindAddress);
     }
@@ -387,8 +388,8 @@ public class GMSLocator implements Locator, NetLocator {
   }
 
   private boolean recoverFromOthers() {
-    for (InetSocketAddress other : this.locators) {
-      if (recover(other)) {
+    for (HostAddress other : this.locators) {
+      if (recover(other.getSocketInetAddress())) {
         logger.info("Peer locator recovered state from " + other);
         return true;
       }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
index 93c5bf8..56e2662 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
@@ -184,7 +184,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
    */
   private NetView lastConflictingView;
 
-  private List<InetSocketAddress> locators;
+  private List<HostAddress> locators;
 
   /**
    * a list of join/leave/crashes
@@ -1098,8 +1098,9 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
     state.locatorsContacted = 0;
 
     do {
-      for (InetSocketAddress addr : locators) {
+      for (HostAddress laddr : locators) {
         try {
+          InetSocketAddress addr = laddr.getSocketInetAddress();
           Object o = tcpClientWrapper.sendCoordinatorFindRequest(addr, 
request, connectTimeout);
           FindCoordinatorResponse response =
               (o instanceof FindCoordinatorResponse) ? 
(FindCoordinatorResponse) o : null;
@@ -1135,6 +1136,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
             }
           }
         } catch (IOException | ClassNotFoundException problem) {
+          logger.debug("EOFException IOException ", problem);
         }
       }
     } while (!anyResponses && System.currentTimeMillis() < giveUpTime);
@@ -1187,7 +1189,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
         FindCoordinatorRequest request, int connectTimeout)
         throws ClassNotFoundException, IOException {
       TcpClient client = new TcpClient();
-      return client.requestToServer(addr.getAddress(), addr.getPort(), 
request, connectTimeout);
+      return client.requestToServer(addr, request, connectTimeout, true);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
new file mode 100644
index 0000000..58ef3a5
--- /dev/null
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.distributed.internal.membership.gms.membership;
+
+import java.net.InetSocketAddress;
+
+import org.apache.commons.validator.routines.InetAddressValidator;
+
+public class HostAddress {
+  private InetSocketAddress socketInetAddress;
+  private String hostname;
+  private int port;
+  private boolean isIpString;
+
+  public HostAddress(InetSocketAddress loc, String locStr) {
+    this.socketInetAddress = loc;
+    this.hostname = locStr;
+    this.port = loc.getPort();
+    this.isIpString = InetAddressValidator.getInstance().isValid(locStr);
+  }
+
+  public boolean isIpString() {
+    return isIpString;
+  }
+
+  /**
+   * if host is ipString then it will return the cached InetScoketAddress 
Otherwise it will create
+   * the new instance of InetScoketAddress
+   * 
+   * @return
+   */
+  public InetSocketAddress getSocketInetAddress() {
+    if (this.isIpString) {
+      return this.socketInetAddress;
+    } else {
+      InetSocketAddress isa = new InetSocketAddress(hostname, 
this.socketInetAddress.getPort());
+      return isa;
+    }
+  }
+
+
+
+  public String getHostName() {
+    return hostname;
+  }
+
+
+  public int getPort() {
+    return port;
+  }
+
+  /**
+   * If component has retry logic then use this method to get the 
InetSocketAddress address
+   * AutoConnectionSourceImpl for client has retry logic; This way client will 
not make DNS query
+   * each time
+   * 
+   * @return InetSocketAddress
+   */
+  public InetSocketAddress getSocketInetAddressC() {
+    return this.socketInetAddress;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + (isIpString ? 1231 : 1237);
+    result = prime * result + ((socketInetAddress == null) ? 0 : 
socketInetAddress.hashCode());
+    result = prime * result + ((hostname == null) ? 0 : hostname.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj)
+      return true;
+    if (obj == null)
+      return false;
+    if (getClass() != obj.getClass())
+      return false;
+    HostAddress other = (HostAddress) obj;
+    if (isIpString != other.isIpString)
+      return false;
+    if (socketInetAddress == null) {
+      if (other.socketInetAddress != null)
+        return false;
+    } else if (!socketInetAddress.equals(other.socketInetAddress))
+      return false;
+    if (hostname == null) {
+      if (other.hostname != null)
+        return false;
+    } else if (!hostname.equals(other.hostname))
+      return false;
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    return "LocatorAddress [locatorSocketInetAddress=" + socketInetAddress + 
", lochostname="
+        + hostname + ", isIpString=" + isIpString + "]";
+  }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
index e9476b5..b2189f4 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
@@ -158,7 +158,7 @@ public class TcpClient {
     if (addr == null) {
       ipAddr = new InetSocketAddress(port);
     } else {
-      ipAddr = new InetSocketAddress(addr.getHostName(), port); // fix for bug 
30810
+      ipAddr = new InetSocketAddress(addr, port); // fix for bug 30810 bruce??
     }
     return requestToServer(ipAddr, request, timeout, replyExpected);
   }
@@ -232,6 +232,7 @@ public class TcpClient {
           logger.debug("received response: {}", response);
           return response;
         } catch (EOFException ex) {
+          logger.debug("requestToServer EOFException ", ex);
           EOFException eof = new EOFException("Locator at " + ipAddr
               + " did not respond. This is normal if the locator was shutdown. 
If it wasn't check its log for exceptions.");
           eof.initCause(ex);

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
index 5ab1bed..23801d9 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
@@ -23,12 +23,14 @@ import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.validator.routines.InetAddressValidator;
 
 /**
  * Identifies the host, port, and bindAddress a distribution locator is 
listening on.
@@ -38,7 +40,7 @@ import org.apache.commons.lang.StringUtils;
 public class DistributionLocatorId implements java.io.Serializable {
   private static final long serialVersionUID = 6587390186971937865L;
 
-  private final InetAddress host;
+  private InetAddress host;
   private final int port;
   private final String bindAddress;
   transient private SSLConfig sslConfig;
@@ -47,6 +49,7 @@ public class DistributionLocatorId implements 
java.io.Serializable {
   private boolean peerLocator = true;
   private boolean serverLocator = true;
   private String hostnameForClients;
+  private String hostname;
 
   /**
    * Constructs a DistributionLocatorId with the given host and port.
@@ -116,7 +119,7 @@ public class DistributionLocatorId implements 
java.io.Serializable {
       bindIdx = marshalled.lastIndexOf(':');
     }
 
-    String hostname = marshalled.substring(0, bindIdx > -1 ? bindIdx : 
portStartIdx);
+    hostname = marshalled.substring(0, bindIdx > -1 ? bindIdx : portStartIdx);
 
     if (hostname.indexOf(':') >= 0) {
       bindIdx = marshalled.lastIndexOf('@');
@@ -127,9 +130,7 @@ public class DistributionLocatorId implements 
java.io.Serializable {
     try {
       this.host = InetAddress.getByName(hostname);
     } catch (UnknownHostException ex) {
-      throw new InternalGemFireException(
-          
LocalizedStrings.DistributionLocatorId_FAILED_GETTING_HOST_FROM_NAME_0
-              .toLocalizedString(hostname));
+      this.host = null;
     }
 
     try {
@@ -215,9 +216,37 @@ public class DistributionLocatorId implements 
java.io.Serializable {
     return this.port;
   }
 
-  /** Returns the host. */
-  public InetAddress getHost() {
-    return this.host;
+  /**
+   * Returns the resolved InetSocketAddress of the locator We cache the 
InetAddress if hostname is
+   * ipString Otherwise we create InetAddress each time.
+   * 
+   **/
+  public InetSocketAddress getHost() throws UnknownHostException {
+    if (hostname != null) {
+      boolean isIpString = 
InetAddressValidator.getInstance().isValid(hostname);
+      if (isIpString) {
+        if (this.host == null) {
+          this.host = InetAddress.getByName(hostname);
+        }
+        return new InetSocketAddress(this.host, port);
+      }
+    }
+
+    if (this.hostname == null) {
+      if (this.host != null) {
+        return new InetSocketAddress(this.host, port);
+      }
+      throw new UnknownHostException("locator ID has no hostname or resolved 
inet address");
+    }
+    return new InetSocketAddress(hostname, port);
+  }
+
+  /** returns the host name */
+  public String getHostName() {
+    if (this.hostname == null) {
+      this.hostname = this.host.getHostName();
+    }
+    return this.hostname;
   }
 
   /** Returns true if this is a multicast address:port */

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteTransportConfig.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteTransportConfig.java
 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteTransportConfig.java
index 1dc2fd1..4759fe8 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteTransportConfig.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteTransportConfig.java
@@ -30,6 +30,7 @@ import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.admin.TransportConfig;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 
+import java.net.UnknownHostException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -259,7 +260,7 @@ public class RemoteTransportConfig implements 
TransportConfig {
     }
     if (this.mcastEnabled) {
       // Fix bug 32849
-      props.setProperty(MCAST_ADDRESS, 
String.valueOf(this.mcastId.getHost().getHostAddress()));
+      props.setProperty(MCAST_ADDRESS, this.mcastId.getHostName());
       props.setProperty(MCAST_PORT, String.valueOf(this.mcastId.getPort()));
 
     } else {
@@ -274,7 +275,7 @@ public class RemoteTransportConfig implements 
TransportConfig {
         if (baddr != null && baddr.trim().length() > 0) {
           locators.append(baddr);
         } else {
-          locators.append(locator.getHost().getCanonicalHostName());
+          locators.append(locator.getHostName());
         }
         locators.append("[");
         locators.append(locator.getPort());

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/internal/cache/ClusterConfigurationLoader.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/ClusterConfigurationLoader.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/ClusterConfigurationLoader.java
index 92cfd96..1c4104e 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/ClusterConfigurationLoader.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/ClusterConfigurationLoader.java
@@ -231,7 +231,7 @@ public class ClusterConfigurationLoader {
       if (StringUtils.isNotBlank(ipaddress)) {
         locatorInetAddress = InetAddress.getByName(ipaddress);
       } else {
-        locatorInetAddress = dlId.getHost();
+        locatorInetAddress = dlId.getHost().getAddress();
       }
 
       int port = dlId.getPort();

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
index d4fdbd0..65d6e02 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
@@ -37,6 +37,7 @@ import 
org.apache.geode.cache.client.internal.LocatorDiscoveryCallback;
 import org.apache.geode.cache.client.internal.PoolImpl;
 import org.apache.geode.cache.query.QueryService;
 import org.apache.geode.cache.wan.GatewaySender;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.logging.log4j.LocalizedMessage;
@@ -55,6 +56,8 @@ public class PoolFactoryImpl implements PoolFactory {
    */
   private PoolAttributes attributes = new PoolAttributes();
 
+  private List<HostAddress> loators = new ArrayList<>();
+
   /**
    * The cache that created this factory
    */
@@ -217,25 +220,24 @@ public class PoolFactoryImpl implements PoolFactory {
     return this;
   }
 
-  private PoolFactory add(String host, int port, List l) {
+  private InetSocketAddress getInetSocketAddress(String host, int port) {
     if (port == 0) {
       throw new IllegalArgumentException("port must be greater than 0 but was 
" + port);
       // the rest of the port validation is done by InetSocketAddress
     }
+    InetSocketAddress sockAddr = null;
     try {
       InetAddress hostAddr = InetAddress.getByName(host);
-      InetSocketAddress sockAddr = new InetSocketAddress(hostAddr, port);
-      l.add(sockAddr);
+      sockAddr = new InetSocketAddress(hostAddr, port);
     } catch (UnknownHostException ignore) {
       // IllegalArgumentException ex = new IllegalArgumentException("Unknown 
host " + host);
       // ex.initCause(cause);
       // throw ex;
       // Fix for #45348
       
logger.warn(LocalizedMessage.create(LocalizedStrings.PoolFactoryImpl_HOSTNAME_UNKNOWN,
 host));
-      InetSocketAddress sockAddr = new InetSocketAddress(host, port);
-      l.add(sockAddr);
+      sockAddr = new InetSocketAddress(host, port);
     }
-    return this;
+    return sockAddr;
   }
 
   public PoolFactory setSubscriptionAckInterval(int ackInterval) {
@@ -252,7 +254,10 @@ public class PoolFactoryImpl implements PoolFactory {
       throw new IllegalStateException(
           "A server has already been added. You can only add locators or 
servers; not both.");
     }
-    return add(host, port, this.attributes.locators);
+    InetSocketAddress isa = getInetSocketAddress(host, port);
+    this.attributes.locators.add(isa);
+    loators.add(new HostAddress(isa, host));
+    return this;
   }
 
   public PoolFactory addServer(String host, int port) {
@@ -260,7 +265,9 @@ public class PoolFactoryImpl implements PoolFactory {
       throw new IllegalStateException(
           "A locator has already been added. You can only add locators or 
servers; not both.");
     }
-    return add(host, port, this.attributes.servers);
+    InetSocketAddress isa = getInetSocketAddress(host, port);
+    this.attributes.servers.add(isa);
+    return this;
   }
 
   public PoolFactory reset() {
@@ -295,7 +302,10 @@ public class PoolFactoryImpl implements PoolFactory {
     setSubscriptionAckInterval(cp.getSubscriptionAckInterval());
     setServerGroup(cp.getServerGroup());
     setMultiuserAuthentication(cp.getMultiuserAuthentication());
-    this.attributes.locators.addAll(cp.getLocators());
+    for (InetSocketAddress l : cp.getLocators()) {
+      addLocator(l.getHostName(), l.getPort());
+    }
+    // this.attributes.locators.addAll(cp.getLocators());
     this.attributes.servers.addAll(cp.getServers());
   }
 
@@ -327,7 +337,7 @@ public class PoolFactoryImpl implements PoolFactory {
         registry.creatingPool();
       }
     }
-    return PoolImpl.create(this.pm, name, this.attributes);
+    return PoolImpl.create(this.pm, name, this.attributes, this.loators);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceDUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceDUnitTest.java
index 789d326..deb3325 100644
--- 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceDUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceDUnitTest.java
@@ -160,10 +160,12 @@ public class AutoConnectionSourceDUnitTest extends 
LocatorTestBase {
       final int locatorPort3 = ports[2];
       String locators =
           getLocatorString(host, new int[] {locatorPort0, locatorPort1, 
locatorPort3});
-      vm0.invoke("Start Locator", () -> 
startLocator(NetworkUtils.getServerHostName(vm0.getHost()),
-          locatorPort0, locators));
-      vm1.invoke("Start Locator", () -> 
startLocator(NetworkUtils.getServerHostName(vm1.getHost()),
-          locatorPort1, locators));
+      vm0.invoke("Start Locator1 ",
+          () -> startLocator(NetworkUtils.getServerHostName(vm0.getHost()), 
locatorPort0,
+              locators));
+      vm1.invoke("Start Locator2 ",
+          () -> startLocator(NetworkUtils.getServerHostName(vm1.getHost()), 
locatorPort1,
+              locators));
 
       vm2.invoke("StartBridgeClient", () -> startBridgeClient(null,
           NetworkUtils.getServerHostName(vm0.getHost()), locatorPort0));
@@ -524,7 +526,7 @@ public class AutoConnectionSourceDUnitTest extends 
LocatorTestBase {
         }
 
         List<InetSocketAddress> locators = pool.getOnlineLocators();
-        Assert.assertEquals(expected.length, locators.size());
+        Assert.assertEquals("found " + locators, expected.length, 
locators.size());
         Arrays.sort(expected, 
Comparator.comparing(InetSocketAddress::getPort));
         for (int i = 0; i < locators.size(); i++) {
           InetSocketAddress locator = locators.get(i);

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
index 9169904..b5dc288 100644
--- 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
@@ -18,14 +18,18 @@ import org.apache.geode.CancelCriterion;
 import org.apache.geode.cache.*;
 import org.apache.geode.cache.client.NoAvailableLocatorsException;
 import org.apache.geode.cache.client.SubscriptionNotEnabledException;
+import 
org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.UpdateLocatorListTask;
+import org.apache.geode.cache.client.internal.PoolImpl.PoolTask;
 import org.apache.geode.cache.client.internal.locator.ClientConnectionRequest;
 import org.apache.geode.cache.client.internal.locator.ClientConnectionResponse;
+import org.apache.geode.cache.client.internal.locator.LocatorListRequest;
 import org.apache.geode.cache.client.internal.locator.LocatorListResponse;
 import org.apache.geode.cache.query.QueryService;
 import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.PoolStatHelper;
 import org.apache.geode.distributed.internal.ServerLocation;
+import 
org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.distributed.internal.ClusterConfigurationService;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
@@ -59,6 +63,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -70,6 +75,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 import org.awaitility.Awaitility;
+import org.awaitility.Duration;
 
 /**
  *
@@ -113,8 +119,12 @@ public class AutoConnectionSourceImplJUnitTest {
     background = Executors.newSingleThreadScheduledExecutor();
 
     List/* <InetSocketAddress> */ locators = new ArrayList();
-    locators.add(new InetSocketAddress(InetAddress.getLocalHost(), port));
-    source = new AutoConnectionSourceImpl(locators, "", 60 * 1000);
+    InetAddress ia = InetAddress.getLocalHost();
+    InetSocketAddress isa = new InetSocketAddress(ia, port);
+    locators.add(isa);
+    List<HostAddress> la = new ArrayList<>();
+    la.add(new HostAddress(isa, ia.getHostName()));
+    source = new AutoConnectionSourceImpl(locators, la, "", 60 * 1000);
     source.start(pool);
   }
 
@@ -159,12 +169,18 @@ public class AutoConnectionSourceImplJUnitTest {
     List<InetSocketAddress> locators = new ArrayList();
     InetSocketAddress floc1 = new InetSocketAddress("fakeLocalHost1", port);
     InetSocketAddress floc2 = new InetSocketAddress("fakeLocalHost2", port);
+
     locators.add(floc1);
     locators.add(floc2);
-    AutoConnectionSourceImpl src = new AutoConnectionSourceImpl(locators, "", 
60 * 1000);
+
+    List<HostAddress> la = new ArrayList<>();
+    la.add(new HostAddress(floc1, floc1.getHostName()));
+    la.add(new HostAddress(floc2, floc2.getHostName()));
+
+    AutoConnectionSourceImpl src = new AutoConnectionSourceImpl(locators, la, 
"", 60 * 1000);
 
     // This method will create a new InetSocketAddress of floc1
-    src.updateLocatorInLocatorList(floc1);
+    src.updateLocatorInLocatorList(new HostAddress(floc1, 
floc1.getHostName()));
 
     List<InetSocketAddress> cLocList = src.getCurrentLocators();
 
@@ -191,18 +207,24 @@ public class AutoConnectionSourceImplJUnitTest {
     InetSocketAddress floc2 = new InetSocketAddress("fakeLocalHost2", port);
     locators.add(floc1);
     locators.add(floc2);
-    AutoConnectionSourceImpl src = new AutoConnectionSourceImpl(locators, "", 
60 * 1000);
+    List<HostAddress> la = new ArrayList<>();
+    la.add(new HostAddress(floc1, floc1.getHostName()));
+    la.add(new HostAddress(floc2, floc2.getHostName()));
+    AutoConnectionSourceImpl src = new AutoConnectionSourceImpl(locators, la, 
"", 60 * 1000);
 
 
-    Set<InetSocketAddress> badLocators = new HashSet<>();
     InetSocketAddress b1 = new InetSocketAddress("fakeLocalHost1", port);
     InetSocketAddress b2 = new InetSocketAddress("fakeLocalHost3", port);
-    badLocators.add(b1);
-    badLocators.add(b2);
 
-    src.addbadLocators(locators, badLocators);
+    Set<HostAddress> bla = new HashSet<>();
+    bla.add(new HostAddress(b1, b1.getHostName()));
+    bla.add(new HostAddress(b2, b2.getHostName()));
+
 
-    Assert.assertEquals(3, locators.size());
+    src.addbadLocators(la, bla);
+
+    System.out.println("new locatores " + la );
+    Assert.assertEquals(3, la.size());
   }
 
   @Test
@@ -276,6 +298,11 @@ public class AutoConnectionSourceImplJUnitTest {
     assertEquals(loc1, source.findServer(null));
   }
 
+  /**
+   * This tests that discovery works even after one of two locators was shut 
down
+   * 
+   * @throws Exception
+   */
   @Test
   public void testDiscoverLocators() throws Exception {
     startFakeLocator();
@@ -310,6 +337,41 @@ public class AutoConnectionSourceImplJUnitTest {
   }
 
   @Test
+  public void testDiscoverLocatorsConnectsToLocatorsAfterTheyStartUp() throws 
Exception {
+    ArrayList locators = new ArrayList();
+    locators.add(new ServerLocation(InetAddress.getLocalHost().getHostName(), 
port));
+    handler.nextLocatorListResponse = new LocatorListResponse(locators, false);
+    
+    try {
+      Awaitility.await().pollDelay(new Duration(200, 
TimeUnit.MILLISECONDS)).atMost(500, TimeUnit.MILLISECONDS).until(new 
Callable<Boolean>() {
+
+        @Override
+        public Boolean call() throws Exception {
+          return source.getOnlineLocators().isEmpty();
+        }
+      });
+      startFakeLocator();
+
+      server.join(1000);
+      
+      Awaitility.await().atMost(5000, TimeUnit.MILLISECONDS).until(new 
Callable<Boolean>() {
+
+        @Override
+        public Boolean call() throws Exception {
+          return source.getOnlineLocators().size() == 1;
+        }
+      });
+    } finally {
+      try {
+        new TcpClient().stop(InetAddress.getLocalHost(), port);
+      } catch (ConnectException ignore) {
+        // must not be running
+      }
+      server.join(60 * 1000);
+    }
+  }
+
+  @Test
   public void testSysPropLocatorUpdateInterval() throws Exception {
     long updateLocatorInterval = 543;
     System.setProperty(DistributionConfig.GEMFIRE_PREFIX + 
"LOCATOR_UPDATE_INTERVAL",
@@ -598,5 +660,5 @@ public class AutoConnectionSourceImplJUnitTest {
     }
 
     public void setServerAffinityLocation(ServerLocation serverLocation) {}
-  }
+  }  
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
index 9f6c5fb..9bd8dd8 100644
--- 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
@@ -342,7 +342,7 @@ public class DistributionConfigJUnitTest {
     assertEquals(config.getStartLocator(), address);
   }
 
-  @Test(expected = InternalGemFireException.class)
+  @Test
   public void testInvalidLocatorAddress() {
     String address = "bad.bad[7056]";
     config.modifiable = true;

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/java/org/apache/geode/distributed/internal/StartupMessageDataJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/StartupMessageDataJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/StartupMessageDataJUnitTest.java
index 9d63050..b5a62ca 100755
--- 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/StartupMessageDataJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/StartupMessageDataJUnitTest.java
@@ -252,9 +252,9 @@ public class StartupMessageDataJUnitTest {
 
   private String createOneLocatorString() throws Exception {
     DistributionLocatorId locatorId =
-        new DistributionLocatorId(SocketCreator.getLocalHost(), 445566, 
"111.222.333.444", null);
+        new DistributionLocatorId(SocketCreator.getLocalHost(), 44556, 
"111.222.333.444", null);
     String locatorString = locatorId.marshal();
-    assertEquals("" + locatorId.getHost().getHostAddress() + 
":111.222.333.444[445566]",
+    assertEquals("" + locatorId.getHost().getAddress().getHostAddress() + 
":111.222.333.444[44556]",
         locatorString);
     return locatorString;
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
index a31fa8d..ff61a50 100644
--- 
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
@@ -36,6 +36,7 @@ import 
org.apache.geode.distributed.internal.DistributionConfig;
 import 
org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.distributed.internal.membership.NetView;
 import org.apache.geode.distributed.internal.membership.gms.GMSMember;
+import org.apache.geode.distributed.internal.membership.gms.GMSUtil;
 import org.apache.geode.distributed.internal.membership.gms.ServiceConfig;
 import org.apache.geode.distributed.internal.membership.gms.Services;
 import org.apache.geode.distributed.internal.membership.gms.Services.Stopper;

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
 
b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
index 6a6e0c1..db234e0 100644
--- 
a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
+++ 
b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
@@ -155,4 +155,5 @@ 
org/apache/geode/distributed/internal/tcpserver/LocatorCancelException
 org.apache.geode.internal.security.SecurableCommunicationChannel
 org/apache/geode/internal/security/shiro/GeodeAuthenticationToken
 org/apache/geode/internal/cache/InitialImageOperation$GIITestHook
-org/apache/geode/internal/AvailablePort$Keeper
\ No newline at end of file
+org/apache/geode/internal/AvailablePort$Keeper
+org/apache/geode/internal/admin/remote/DistributionLocatorId

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
----------------------------------------------------------------------
diff --git 
a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
 
b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
index f5a8fcf..dd3fc84 100644
--- 
a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
+++ 
b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
@@ -131,8 +131,8 @@ public class LocatorDiscovery {
     while (!getDiscoverer().isStopped()) {
       try {
         RemoteLocatorJoinResponse response =
-            (RemoteLocatorJoinResponse) 
locatorClient.requestToServer(locatorId.getHost(),
-                locatorId.getPort(), request, 
WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT);
+            (RemoteLocatorJoinResponse) 
locatorClient.requestToServer(locatorId.getHost(), request,
+                WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
         if (response != null) {
           LocatorHelper.addExchangedLocators(response.getLocators(), 
this.locatorListener);
           logger.info(LocalizedMessage.create(
@@ -181,8 +181,7 @@ public class LocatorDiscovery {
       try {
         response =
             (RemoteLocatorJoinResponse) 
locatorClient.requestToServer(remoteLocator.getHost(),
-                remoteLocator.getPort(), request,
-                WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT);
+                request, WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, 
true);
         if (response != null) {
           LocatorHelper.addExchangedLocators(response.getLocators(), 
this.locatorListener);
           logger.info(LocalizedMessage.create(
@@ -193,8 +192,7 @@ public class LocatorDiscovery {
             Thread.sleep(WAN_LOCATOR_PING_INTERVAL);
             RemoteLocatorPingResponse pingResponse =
                 (RemoteLocatorPingResponse) 
locatorClient.requestToServer(remoteLocator.getHost(),
-                    remoteLocator.getPort(), pingRequest,
-                    WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT);
+                    pingRequest, 
WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
             if (pingResponse != null) {
               continue;
             }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
 
b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
index d6d5d7c..5fe1eda 100644
--- 
a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
+++ 
b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
@@ -104,25 +104,25 @@ public class LocatorMembershipListenerImpl implements 
LocatorMembershipListener
           }
           for (DistributionLocatorId value : entry.getValue()) {
             try {
-              tcpClient.requestToServer(value.getHost(), value.getPort(),
+              tcpClient.requestToServer(value.getHost(),
                   new LocatorJoinMessage(distributedSystemId, locator, 
localLocatorId, ""), 1000,
                   false);
             } catch (Exception e) {
               if (logger.isDebugEnabled()) {
                 logger.debug(LocalizedMessage.create(
                     
LocalizedStrings.LOCATOR_MEMBERSHIP_LISTENER_COULD_NOT_EXCHANGE_LOCATOR_INFORMATION_0_1_WIHT_2_3,
-                    new Object[] {locator.getHost(), locator.getPort(), 
value.getHost(),
+                    new Object[] {locator.getHostName(), locator.getPort(), 
value.getHostName(),
                         value.getPort()}));
               }
             }
             try {
-              tcpClient.requestToServer(locator.getHost(), locator.getPort(),
+              tcpClient.requestToServer(locator.getHost(),
                   new LocatorJoinMessage(entry.getKey(), value, 
localLocatorId, ""), 1000, false);
             } catch (Exception e) {
               if (logger.isDebugEnabled()) {
                 logger.debug(LocalizedMessage.create(
                     
LocalizedStrings.LOCATOR_MEMBERSHIP_LISTENER_COULD_NOT_EXCHANGE_LOCATOR_INFORMATION_0_1_WIHT_2_3,
-                    new Object[] {value.getHost(), value.getPort(), 
locator.getHost(),
+                    new Object[] {value.getHostName(), value.getPort(), 
locator.getHostName(),
                         locator.getPort()}));
               }
             }

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/AbstractRemoteGatewaySender.java
----------------------------------------------------------------------
diff --git 
a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/AbstractRemoteGatewaySender.java
 
b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/AbstractRemoteGatewaySender.java
index dbc2cc6..00cc760 100644
--- 
a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/AbstractRemoteGatewaySender.java
+++ 
b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/AbstractRemoteGatewaySender.java
@@ -75,8 +75,8 @@ public abstract class AbstractRemoteGatewaySender extends 
AbstractGatewaySender
       DistributionLocatorId locatorID = new 
DistributionLocatorId(localLocator);
       try {
         RemoteLocatorResponse response =
-            (RemoteLocatorResponse) new 
TcpClient().requestToServer(locatorID.getHost(),
-                locatorID.getPort(), request, 
WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT);
+            (RemoteLocatorResponse) new 
TcpClient().requestToServer(locatorID.getHost(), request,
+                WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
 
         if (response != null) {
           if (response.getLocators() == null) {

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WanAutoDiscoveryDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WanAutoDiscoveryDUnitTest.java
 
b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WanAutoDiscoveryDUnitTest.java
index 6d75064..63f6005 100644
--- 
a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WanAutoDiscoveryDUnitTest.java
+++ 
b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WanAutoDiscoveryDUnitTest.java
@@ -603,6 +603,7 @@ public class WanAutoDiscoveryDUnitTest extends WANTestBase {
     testRemoteLocators(remoteLocators, true, 1);
   }
 
+  // pool has been created even though locator address is not valid
   @Test
   public void testInvalidHostRemoteLocators() {
     IgnoredException ie = IgnoredException
@@ -610,7 +611,8 @@ public class WanAutoDiscoveryDUnitTest extends WANTestBase {
     try {
       Set<String> remoteLocators = new HashSet();
       addUnknownHost(remoteLocators);
-      testRemoteLocators(remoteLocators, false, 0);
+      // now we don't validata address upfront
+      testRemoteLocators(remoteLocators, true, 1);
     } finally {
       ie.remove();
     }
@@ -621,7 +623,8 @@ public class WanAutoDiscoveryDUnitTest extends WANTestBase {
     Set<String> remoteLocators = new HashSet();
     remoteLocators.add("localhost[12345]");
     addUnknownHost(remoteLocators);
-    testRemoteLocators(remoteLocators, true, 1);
+    // now we add the locator to pool, because we don't validate locator 
address
+    testRemoteLocators(remoteLocators, true, 2);
   }
 
   private void addUnknownHost(Set<String> remoteLocators) {

http://git-wip-us.apache.org/repos/asf/geode/blob/ea8840fc/gradle/dependency-versions.properties
----------------------------------------------------------------------
diff --git a/gradle/dependency-versions.properties 
b/gradle/dependency-versions.properties
index 6a730a4..4dd3f34 100644
--- a/gradle/dependency-versions.properties
+++ b/gradle/dependency-versions.properties
@@ -98,3 +98,4 @@ tempus-fugit.version = 1.1
 tomcat6.version = 6.0.37
 tomcat7.version = 7.0.73
 tomcat8.version = 8.5.9
+commons-validator.version = 1.6

Reply via email to