Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-77 e7a6a28b2 -> 43a368831


GEODE-77 fixing test issues and an error in GMSMember.compareTo


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

Branch: refs/heads/feature/GEODE-77
Commit: 43a368831d350f58bb3b7ba40d9292b0157eaa7e
Parents: e7a6a28
Author: Bruce Schuchardt <[email protected]>
Authored: Tue Sep 15 10:02:48 2015 -0700
Committer: Bruce Schuchardt <[email protected]>
Committed: Tue Sep 15 10:02:48 2015 -0700

----------------------------------------------------------------------
 .../internal/DistributionManager.java           |   4 +-
 .../internal/direct/DirectChannel.java          |   4 +-
 .../membership/InternalDistributedMember.java   |   8 +-
 .../internal/membership/NetView.java            |   4 +-
 .../internal/membership/gms/GMSMember.java      |  12 -
 .../membership/gms/GMSMemberFactory.java        |   7 +-
 .../membership/gms/auth/GMSAuthenticator.java   |  14 +-
 .../gms/locator/FindCoordinatorRequest.java     |  12 +-
 .../gms/locator/FindCoordinatorResponse.java    |  11 +-
 .../membership/gms/locator/GMSLocator.java      |  15 +-
 .../membership/gms/membership/GMSJoinLeave.java |  18 +-
 .../gms/messenger/JGroupsMessenger.java         |   4 +-
 .../gms/mgr/GMSMembershipManager.java           |  18 +-
 .../gemfire/internal/i18n/LocalizedStrings.java |   3 +-
 .../MemoryThresholdsOffHeapDUnitTest.java       |   4 +-
 .../DistributedAckRegionCCEDUnitTest.java       |   4 -
 .../DistributedNoAckRegionCCEDUnitTest.java     |   5 -
 .../cache30/GlobalRegionCCEDUnitTest.java       |   3 -
 .../gemfire/cache30/MultiVMRegionTestCase.java  | 216 -----------------
 .../distributed/DistributedSystemDUnitTest.java |  45 ----
 .../gemfire/distributed/LocatorDUnitTest.java   | 148 ------------
 .../membership/MembershipJUnitTest.java         |   7 +-
 .../gms/locator/GMSLocatorJUnitTest.java        |  15 +-
 .../gms/membership/StatRecorderJUnitTest.java   |  14 +-
 .../internal/cache/Bug33726JUnitTest.java       |   2 +
 .../versions/RegionVersionVectorJUnitTest.java  | 231 ++++++++++++++++++-
 .../gemfire/memcached/IntegrationJUnitTest.java |   2 +
 27 files changed, 339 insertions(+), 491 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java
index ef8fcb1..fdd8092 100644
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java
@@ -3395,8 +3395,8 @@ public class DistributionManager
 
  //   message.setRecipient(DistributionManager.this.getId());
 
-    if (logger.isTraceEnabled()) {
-      logger.trace("Received message '{}' from <{}>", message, 
message.getSender());
+    if (logger.isDebugEnabled()) {
+      logger.debug("Received message '{}' from <{}>", message, 
message.getSender());
     }
     scheduleIncomingMessage(message);
   }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java
index acfb060..22b97cb 100644
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java
@@ -457,8 +457,8 @@ public class DirectChannel {
       }
 
       try {
-        if (logger.isTraceEnabled(LogMarker.DM)) {
-          logger.trace(LogMarker.DM, "{}{}) to {} peers ({}) via tcp/ip",
+        if (logger.isDebugEnabled()) {
+          logger.debug("{}{}) to {} peers ({}) via tcp/ip",
               (retry ? "Retrying send (" : "Sending ("),  msg, cons.size(), 
cons);
         }
         DMStats stats = getDMStats();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java
index d29fe97..c18d237 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java
@@ -653,8 +653,12 @@ public final class InternalDistributedMember
       }
     }
     
-    return this.netMbr.compareTo(other.netMbr);
-
+    if (this.netMbr != null && other.netMbr != null) {
+      return this.netMbr.compareTo(other.netMbr);
+    } else {
+      return 0;
+    }
+    
     // purposely avoid comparing roles
     // @todo Add durableClientAttributes to compare
   }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java
index 60be680..b2867db 100644
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java
@@ -336,8 +336,8 @@ public class NetView implements DataSerializableFixedID {
    * that were members of the given view. Admin-only members are
    * not counted
    */
-  public List<InternalDistributedMember> getActualCrashedMembers(NetView 
oldView) {
-    List<InternalDistributedMember> result = new 
ArrayList<>(this.crashedMembers.size());
+  public Set<InternalDistributedMember> getActualCrashedMembers(NetView 
oldView) {
+    Set<InternalDistributedMember> result = new 
HashSet<>(this.crashedMembers.size());
     for (InternalDistributedMember mbr : this.crashedMembers) {
       if ((mbr.getVmKind() != DistributionManager.ADMIN_ONLY_DM_TYPE) && 
oldView.contains(mbr)) {
         result.add(mbr);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java
index 0cf2cc7..efd2067 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java
@@ -246,18 +246,6 @@ public class GMSMember implements NetMember, 
DataSerializableFixedID {
         } else if (his.vmViewId < this.vmViewId) {
           result = 1;
         }
-      } else if (this.processId != 0 && his.processId != 0) {
-        // starting in 8.0 we also consider the processId.  During startup
-        // we may have a message from a member that hasn't finished joining
-        // and address canonicalization may find an old address that has
-        // the same addr:port.  Since the new member doesn't have a viewId
-        // its address will be equal to the old member's address unless
-        // we also pay attention to the processId.
-        if (this.processId < his.processId){
-          result = -1;
-        } else if (his.processId < this.processId) {
-          result = 1;
-        }
       }
     }
     if (result == 0 && this.uuidMSBs != 0 && his.uuidMSBs != 0) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java
index 8b6be83..8d7cbbf 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java
@@ -28,6 +28,8 @@ import com.gemstone.gemfire.internal.Version;
 import com.gemstone.gemfire.internal.admin.remote.RemoteTransportConfig;
 import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
 import com.gemstone.gemfire.internal.tcp.ConnectionException;
+import com.gemstone.gemfire.security.AuthenticationFailedException;
+import com.gemstone.gemfire.security.AuthenticationRequiredException;
 
 /**
  * Create a new Member based on the given inputs.
@@ -107,7 +109,10 @@ public class GMSMemberFactory implements MemberServices {
     catch (ConnectionException e) {
       throw new 
DistributionException(LocalizedStrings.JGroupMemberFactory_UNABLE_TO_CREATE_MEMBERSHIP_MANAGER.toLocalizedString(),
 e);
     }
-    catch (GemFireConfigException | SystemConnectException e) {
+    catch (GemFireConfigException
+        | SystemConnectException
+        | AuthenticationFailedException
+        | AuthenticationRequiredException e) {
       throw e;
     }
     catch (RuntimeException e) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java
index 7e7072d..c4b822e 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java
@@ -7,6 +7,7 @@ import 
com.gemstone.gemfire.distributed.internal.membership.NetView;
 import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import 
com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Authenticator;
 import com.gemstone.gemfire.internal.ClassLoadUtil;
+import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
 import com.gemstone.gemfire.internal.logging.InternalLogWriter;
 import com.gemstone.gemfire.security.AuthInitialize;
 import com.gemstone.gemfire.security.AuthenticationFailedException;
@@ -18,6 +19,7 @@ import java.security.Principal;
 import java.util.Properties;
 import java.util.Set;
 
+
 // static messages
 import static 
com.gemstone.gemfire.internal.i18n.LocalizedStrings.HandShake_AUTHENTICATOR_INSTANCE_COULD_NOT_BE_OBTAINED;
 import static 
com.gemstone.gemfire.internal.i18n.LocalizedStrings.HandShake_FAILED_TO_ACQUIRE_AUTHENTICATOR_OBJECT;
@@ -163,11 +165,19 @@ public class GMSAuthenticator implements Authenticator {
    */
   @Override
   public Object getCredentials(InternalDistributedMember member) {
-    return getCredentials(member, securityProps);
+    try {
+      return getCredentials(member, securityProps);
+    } catch (Exception e) {
+      String authMethod = 
securityProps.getProperty(SECURITY_PEER_AUTH_INIT_NAME);
+      services.getSecurityLogWriter().warning(
+          
LocalizedStrings.AUTH_FAILED_TO_OBTAIN_CREDENTIALS_IN_0_USING_AUTHINITIALIZE_1_2,
+          new Object[] {authMethod, e.getLocalizedMessage()});
+      return null;
+    }
   }
 
   // for unit test
-  /* package */ Properties getCredentials(DistributedMember member, Properties 
secProps) {
+  Properties getCredentials(DistributedMember member, Properties secProps) {
     Properties credentials = null;
     String authMethod = secProps.getProperty(SECURITY_PEER_AUTH_INIT_NAME);
     try {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java
index 9af29a1..da79b03 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java
@@ -16,14 +16,16 @@ public class FindCoordinatorRequest implements 
DataSerializableFixedID, PeerLoca
 
   private InternalDistributedMember memberID;
   private Collection<InternalDistributedMember> rejectedCoordinators;
+  private int lastViewId;
   
   public FindCoordinatorRequest(InternalDistributedMember myId) {
     this.memberID = myId;
   }
   
-  public FindCoordinatorRequest(InternalDistributedMember myId, 
Collection<InternalDistributedMember> rejectedCoordinators) {
+  public FindCoordinatorRequest(InternalDistributedMember myId, 
Collection<InternalDistributedMember> rejectedCoordinators, int lastViewId) {
     this.memberID = myId;
     this.rejectedCoordinators = rejectedCoordinators;
+    this.lastViewId = lastViewId;
   }
   
   public FindCoordinatorRequest() {
@@ -38,11 +40,15 @@ public class FindCoordinatorRequest implements 
DataSerializableFixedID, PeerLoca
     return rejectedCoordinators;
   }
   
+  public int getLastViewId() {
+    return this.lastViewId;
+  }
+  
   @Override
   public String toString() {
     if (rejectedCoordinators != null) {
       return "FindCoordinatorRequest(memberID="+memberID
-          +", rejected="+rejectedCoordinators+")";
+          +", rejected="+rejectedCoordinators+", lastViewId="+lastViewId+")";
     } else {
       return "FindCoordinatorRequest(memberID="+memberID+")";
     }
@@ -62,12 +68,14 @@ public class FindCoordinatorRequest implements 
DataSerializableFixedID, PeerLoca
   public void toData(DataOutput out) throws IOException {
     DataSerializer.writeObject(this.memberID, out);
     DataSerializer.writeObject(this.rejectedCoordinators, out);
+    out.writeInt(lastViewId);
   }
 
   @Override
   public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
     this.memberID = DataSerializer.readObject(in);
     this.rejectedCoordinators = DataSerializer.readObject(in);
+    this.lastViewId = in.readInt();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java
index ea443e6..61d2333 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java
@@ -5,8 +5,6 @@ import java.io.DataOutput;
 import java.io.IOException;
 
 import com.gemstone.gemfire.DataSerializer;
-import com.gemstone.gemfire.distributed.internal.DistributionManager;
-import 
com.gemstone.gemfire.distributed.internal.HighPriorityDistributionMessage;
 import 
com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.internal.DataSerializableFixedID;
 import com.gemstone.gemfire.internal.Version;
@@ -15,12 +13,13 @@ public class FindCoordinatorResponse  implements 
DataSerializableFixedID {
 
   private InternalDistributedMember coordinator;
   private boolean fromView;
+  private int viewId;
   private boolean networkPartitionDetectionEnabled;
   private boolean usePreferredCoordinators;
   
   
   public FindCoordinatorResponse(InternalDistributedMember coordinator,
-      boolean fromView,
+      boolean fromView, int viewId,
       boolean networkPartitionDectionEnabled, boolean 
usePreferredCoordinators) {
     this.coordinator = coordinator;
     this.networkPartitionDetectionEnabled = networkPartitionDectionEnabled;
@@ -47,6 +46,10 @@ public class FindCoordinatorResponse  implements 
DataSerializableFixedID {
     return fromView;
   }
   
+  public int getViewId() {
+    return viewId;
+  }
+  
   @Override
   public String toString() {
     return "FindCoordinatorResponse(coordinator="+coordinator+")";
@@ -67,6 +70,7 @@ public class FindCoordinatorResponse  implements 
DataSerializableFixedID {
   @Override
   public void toData(DataOutput out) throws IOException {
     DataSerializer.writeObject(coordinator, out);
+    out.writeInt(viewId);
     out.writeBoolean(fromView);
     out.writeBoolean(networkPartitionDetectionEnabled);
     out.writeBoolean(usePreferredCoordinators);
@@ -75,6 +79,7 @@ public class FindCoordinatorResponse  implements 
DataSerializableFixedID {
   @Override
   public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
     coordinator = DataSerializer.readObject(in);
+    int viewId = in.readInt();
     fromView = in.readBoolean();
     networkPartitionDetectionEnabled = in.readBoolean();
     usePreferredCoordinators = in.readBoolean();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java
index 3296b80..7298b86 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java
@@ -148,9 +148,16 @@ public class GMSLocator implements Locator, NetLocator {
         }
         
         boolean fromView = false;
+        int viewId = -1;
         
         if (view != null) {
-          coord = view.getCoordinator(findRequest.getRejectedCoordinators());
+          viewId = view.getViewId();
+          if (viewId > findRequest.getLastViewId()) {
+            // ignore the requests rejectedCoordinators if the view has changed
+            coord = 
view.getCoordinator(Collections.<InternalDistributedMember>emptyList());
+          } else {
+            coord = view.getCoordinator(findRequest.getRejectedCoordinators());
+          }
           logger.debug("Peer locator: coordinator from view is {}", coord);
           fromView = true;
         }
@@ -183,7 +190,7 @@ public class GMSLocator implements Locator, NetLocator {
             logger.debug("Peer locator: coordinator from registrations is {}", 
coord);
           }
         }
-        response = new FindCoordinatorResponse(coord, fromView,
+        response = new FindCoordinatorResponse(coord, fromView, viewId,
             this.networkPartitionDetectionEnabled, 
this.usePreferredCoordinators);
       }
     }
@@ -306,10 +313,8 @@ public class GMSLocator implements Locator, NetLocator {
       }
     
       Object o = DataSerializer.readObject(ois2);
-      if (!(o instanceof NetView)) {
-        return false;
-      }
       this.view = (NetView)o;
+
       logger.info("Peer locator initial membership is " + view);
       return true;
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java
index af99530..f64538c 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java
@@ -158,6 +158,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
    */
   public boolean join() {
     Set<InternalDistributedMember> alreadyTried = new HashSet<>();
+    int[] lastViewIdHolder = new int[] {-1};
     
     if (Boolean.getBoolean(BYPASS_DISCOVERY)) {
       becomeCoordinator();
@@ -165,7 +166,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
     }
 
     for (int tries=0; tries<JOIN_ATTEMPTS; tries++) {
-      InternalDistributedMember coord = findCoordinator(alreadyTried);
+      InternalDistributedMember coord = findCoordinator(alreadyTried, 
lastViewIdHolder);
       logger.debug("found possible coordinator {}", coord);
       if (coord != null) {
         if (coord.equals(this.localAddress)) {
@@ -601,12 +602,12 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
    * This contacts the locators to find out who the current coordinator is.
    * All locators are contacted.  If they don't agree then we choose the oldest
    * coordinator and return it.
-   * @return
    */
-  private InternalDistributedMember 
findCoordinator(Set<InternalDistributedMember> alreadyTried) {
+  private InternalDistributedMember 
findCoordinator(Set<InternalDistributedMember> alreadyTried,
+      int[] lastViewIdHolder) {
     assert this.localAddress != null;
     
-    FindCoordinatorRequest request = new 
FindCoordinatorRequest(this.localAddress, alreadyTried);
+    FindCoordinatorRequest request = new 
FindCoordinatorRequest(this.localAddress, alreadyTried, lastViewIdHolder[0]);
     Set<InternalDistributedMember> coordinators = new 
HashSet<InternalDistributedMember>();
     long giveUpTime = System.currentTimeMillis() + 
(services.getConfig().getLocatorWaitTime() * 1000L);
     boolean anyResponses = false;
@@ -622,6 +623,13 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
           FindCoordinatorResponse response = (o instanceof 
FindCoordinatorResponse) ? (FindCoordinatorResponse)o : null;
           if (response != null && response.getCoordinator() != null) {
             anyResponses = false;
+            int viewId = response.getViewId();
+            if (viewId > lastViewIdHolder[0]) {
+              // if the view has changed it is possible that a member
+              // that we already tried to join with will become coordinator
+              alreadyTried.clear();
+              lastViewIdHolder[0] = viewId;
+            }
             coordinators.add(response.getCoordinator());
             if (response.isFromView()) {
               GMSMember mbr = (GMSMember)this.localAddress.getNetMember();
@@ -694,7 +702,7 @@ public class GMSJoinLeave implements JoinLeave, 
MessageHandler {
       
       if (isNetworkPartition(newView)) {
         if (quorumRequired) {
-          List<InternalDistributedMember> crashes = 
newView.getActualCrashedMembers(currentView);
+          Set<InternalDistributedMember> crashes = 
newView.getActualCrashedMembers(currentView);
           services.getManager().forceDisconnect(
               
LocalizedStrings.Network_partition_detected.toLocalizedString(crashes.size(), 
crashes));
           return;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
index 2004598..7bd3048 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
@@ -409,8 +409,8 @@ public class JGroupsMessenger implements Messenger {
     
     filterOutgoingMessage(msg);
     
-    if (logger.isTraceEnabled()) {
-      logger.trace("JGroupsMessenger sending [{}] recipients: {}", msg, 
msg.getRecipientsDescription());
+    if (logger.isDebugEnabled()) {
+      logger.debug("sending via UDP: [{}] recipients: {}", msg, 
msg.getRecipientsDescription());
     }
     
     InternalDistributedMember[] destinations = msg.getRecipients();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
index 200fd85..c8358d9 100755
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
@@ -114,6 +114,13 @@ public class GMSMembershipManager implements 
MembershipManager, Manager
   private volatile DatagramSocket oldDSUDPSocket;
   
   /**
+   * thread-local used to force use of JGroups for communications, usually to
+   * avoid deadlock when conserve-sockets=true.  Use of this should be removed
+   * when connection pools are implemented in the direct-channel 
+   */
+  private ThreadLocal<Boolean> forceUseJGroups = new ThreadLocal<Boolean>();
+  
+  /**
    * Trick class to make the startup synch more
    * visible in stack traces
    * 
@@ -2122,7 +2129,9 @@ public class GMSMembershipManager implements 
MembershipManager, Manager
       useMcast = (msg.getMulticast() || allDestinations);
     }
     
-    if (useMcast || tcpDisabled) {
+    boolean sendViaJGroups = isForceUDPCommunications(); // enable when bug 
#46438 is fixed: || msg.sendViaJGroups();
+
+    if (useMcast || tcpDisabled || sendViaJGroups) {
       result = services.getMessenger().send(msg);
     }
     else {
@@ -2140,9 +2149,14 @@ public class GMSMembershipManager implements 
MembershipManager, Manager
   // MembershipManager method
   @Override
   public void forceUDPMessagingForCurrentThread() {
-    // not currently supported by this manager
+    forceUseJGroups.set(null);
   }
   
+  private boolean isForceUDPCommunications() {
+    Boolean forced = forceUseJGroups.get();
+    return forced == Boolean.TRUE;
+  }
+
   // MembershipManager method
   @Override
   public void releaseUDPMessagingForCurrentThread() {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java
 
b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java
index f146834..6230937 100644
--- 
a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java
+++ 
b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java
@@ -2134,7 +2134,8 @@ public class LocalizedStrings extends 
ParentLocalizedStrings {
   public static final StringId AUTH_PEER_AUTHENTICATION_FAILED = new 
StringId(6609, "Authentication failed. See coordinator [{0}] logs for 
details.");
   public static final StringId AUTH_PEER_AUTHENTICATION_MISSING_CREDENTIALS = 
new StringId(6610, "Failed to find credentials from [{0}] using Authenticator 
[{1}]");
   public static final StringId AUTH_FAILED_TO_ACQUIRE_AUTHINITIALIZE_INSTANCE 
= new StringId(6611, "AuthInitialize instance could not be obtained");
-
+  public static final StringId 
AUTH_FAILED_TO_OBTAIN_CREDENTIALS_IN_0_USING_AUTHINITIALIZE_1_2 = new 
StringId(6612, "Failed to obtain credentials using AuthInitialize [{1}]. {2}");
+  
   /** Testing strings, messageId 90000-99999 **/
   
   /** These are simple messages for testing, translated with Babelfish. **/

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
index dd1e7e9..b2ba7fb 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
@@ -100,8 +100,8 @@ public class MemoryThresholdsOffHeapDUnitTest extends 
BridgeTestCase {
 
   @Override
   public void tearDown2() throws Exception {
-    super.tearDown2();
     invokeInEveryVM(this.resetResourceManager);
+    super.tearDown2();
   }
 
   private SerializableCallable resetResourceManager = new 
SerializableCallable() {
@@ -1262,7 +1262,7 @@ public class MemoryThresholdsOffHeapDUnitTest extends 
BridgeTestCase {
     final int port1 = ports[0];
     final int port2 = ports[1];
     final int port3 = ports[2];
-    final String regionName = "testEventOrger";
+    final String regionName = "testEventOrder";
 
     startCacheServer(server1, port1, 0f, 0f,
         regionName, false/*createPR*/, false/*notifyBySubscription*/, 0);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java
index fd92cf0..f73c007 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java
@@ -124,10 +124,6 @@ public class DistributedAckRegionCCEDUnitTest extends 
DistributedAckRegionDUnitT
 //    }
 //  }
 
-  public void testRegionVersionVectors() throws Exception {
-    versionTestRegionVersionVectors();
-  }
-  
 
   @Override
   public void testEntryTtlLocalDestroy() throws InterruptedException {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java
index a4bd50b..ba3cca4 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java
@@ -364,11 +364,6 @@ public class DistributedNoAckRegionCCEDUnitTest extends
   }
 
   
-  public void testRegionVersionVectors() throws Exception {
-    versionTestRegionVersionVectors();
-  }
-  
-  
 
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   // these methods can be uncommented to inhibit test execution

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java
index bbc4207..18d2a75 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java
@@ -231,8 +231,5 @@ public class GlobalRegionCCEDUnitTest extends 
GlobalRegionDUnitTest {
     versionTestGetAllWithVersions();
   }
 
-  public void testRegionVersionVectors() throws Exception {
-    versionTestRegionVersionVectors();
-  }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
index c5e2821..45f598b 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
@@ -8969,222 +8969,6 @@ public abstract class MultiVMRegionTestCase extends 
RegionTestCase {
   }
 
   
-  public void versionTestRegionVersionVectors() throws Exception {
-    // this is just a quick set of unit tests for basic RVV functionality
-    
-    final String local = DistributedTestCase.getIPLiteral();
-    InternalDistributedMember server1 = new InternalDistributedMember(local, 
101);
-    InternalDistributedMember server2 = new InternalDistributedMember(local, 
102);
-    InternalDistributedMember server3 = new InternalDistributedMember(local, 
103);
-    InternalDistributedMember server4 = new InternalDistributedMember(local, 
104);
-
-    RegionVersionVector rv1 = null;
-    
-    // (a) Test that an exception is mended when the versions that are missing 
are
-    // added
-    rv1 = new VMRegionVersionVector(server1);
-    rv1.recordVersion(server2, 1);
-    rv1.recordVersion(server2, 5);
-    rv1.recordVersion(server2, 8);
-    getLogWriter().info("for test (a) formed this RVV: " + rv1.fullToString());
-    // there should now be two exceptions:  1-5 and 5-8
-    assertEquals(8, rv1.getVersionForMember(server2));
-    assertEquals(2, rv1.getExceptionCount(server2));
-    rv1.recordVersion(server2, 3);
-    getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString());
-    assertEquals(8, rv1.getVersionForMember(server2));
-    assertEquals(2, rv1.getExceptionCount(server2));
-    rv1.recordVersion(server2, 4);
-    rv1.recordVersion(server2, 2);
-    getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString());
-    assertEquals(1, rv1.getExceptionCount(server2));
-    rv1.recordVersion(server2, 6);
-    rv1.recordVersion(server2, 7);
-    getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString());
-    assertEquals(0, rv1.getExceptionCount(server2));
-    
-    // (b) Test the contains() operation
-    rv1 = new VMRegionVersionVector(server1);
-    rv1.recordVersion(server2, 1);
-    rv1.recordVersion(server2, 5);
-    rv1.recordVersion(server2, 8);
-    rv1.recordVersion(server2, 10);
-    getLogWriter().info("for test (b) formed this RVV: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 1));
-    assertTrue(rv1.contains(server2, 5));
-    assertTrue(rv1.contains(server2, 8));
-    assertTrue(rv1.contains(server2, 10));
-    assertFalse(rv1.contains(server2, 2));
-    assertFalse(rv1.contains(server2, 3));
-    assertFalse(rv1.contains(server2, 4));
-    assertFalse(rv1.contains(server2, 9));
-    assertFalse(rv1.contains(server2, 11));
-    rv1.recordVersion(server2, 3);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 3));
-    rv1.recordVersion(server2, 2);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 2));
-    assertTrue(rv1.contains(server2, 3));
-    rv1.recordVersion(server2, 4);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 1));
-    assertTrue(rv1.contains(server2, 2));
-    assertTrue(rv1.contains(server2, 3));
-    assertTrue(rv1.contains(server2, 4));
-    assertTrue(rv1.contains(server2, 5));
-    rv1.recordVersion(server2, 11);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 11));
-    assertTrue(rv1.contains(server2, 10));
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    rv1.recordVersion(server2, 6);
-    assertTrue(rv1.contains(server2, 2));
-    assertTrue(rv1.contains(server2, 5));
-    assertTrue(rv1.contains(server2, 6));
-    assertFalse(rv1.contains(server2, 7));
-    assertTrue(rv1.contains(server2, 8));
-    rv1.recordVersion(server2, 7);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 7));
-    rv1.recordVersion(server2, 9);
-    getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString());
-    assertTrue(rv1.contains(server2, 9));
-    assertTrue(rv1.getExceptionCount(server2) == 0);
-    assertTrue(rv1.contains(server2, 8));
-    
-    
-    // Test RVV comparisons for GII Delta
-    rv1 = new VMRegionVersionVector(server1);
-    rv1.recordVersion(server2, 1);
-    rv1.recordVersion(server2, 4);
-    rv1.recordVersion(server2, 8);
-    rv1.recordVersion(server2, 9);
-    rv1.recordVersion(server2, 10);
-    rv1.recordVersion(server2, 11);
-    rv1.recordVersion(server2, 12);
-    
-    rv1.recordVersion(server3, 2);
-    rv1.recordVersion(server3, 3);
-    rv1.recordVersion(server3, 4);
-    rv1.recordVersion(server3, 6);
-    rv1.recordVersion(server3, 7);
-    
-    RegionVersionVector rv2 = rv1.getCloneForTransmission();
-    getLogWriter().info("rv1 is " + rv1.fullToString());
-    getLogWriter().info("rv2 is " + rv2.fullToString());
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    assertFalse(rv2.isNewerThanOrCanFillExceptionsFor(rv1));
-
-    rv1.recordVersion(server2, 6);
-    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv2.recordVersion(server2, 6);
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-
-    // fill an exception gap
-    rv1.recordVersion(server2, 5);
-    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv2.recordVersion(server2, 5);
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv1.recordVersion(server2, 7);
-    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv2.recordVersion(server2, 7);
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-
-    // add a more recent revision
-    rv1.recordVersion(server3, 8);
-    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv2.recordVersion(server3, 8);
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-
-    // fill another exception gap
-    rv1.recordVersion(server3, 5);
-    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    rv2.recordVersion(server3, 5);
-    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
-    
-    // test that old members are removed from the vector
-    InternalDistributedMember server5 = new InternalDistributedMember(local, 
105);
-    rv1 = new VMRegionVersionVector(server1);
-    rv1.recordVersion(server2, 1);
-    rv1.recordVersion(server3, 1);
-    rv1.recordVersion(server4, 1);
-    rv1.recordVersion(server5, 1);
-    rv1.memberDeparted(server2, false);
-    rv1.memberDeparted(server4, true);
-    assertTrue(rv1.containsMember(server2));
-    assertTrue(rv1.containsMember(server3));
-    assertTrue(rv1.containsMember(server4));
-    Set retain = new HashSet();
-      retain.add(server2);  // still have data from server2
-      retain.add(server3);  // still have data from server3
-      // no data found from server4 in region
-      retain.add(server5);  // still have data from server5
-    rv1.removeOldMembers(retain);
-    assertFalse(rv1.containsMember(server4));
-
-    rv1.memberDeparted(server3, false); // {server2, server3(departed), 
server5}
-
-    // Now test that departed members are transferred with GII.  We simulate
-    // a new server, server6, doing a GII from server1
-
-    InternalDistributedMember server6 = new InternalDistributedMember(local, 
106);
-    RegionVersionVector giiReceiverRVV = new VMRegionVersionVector(server6);
-    // the gii request will cause server1 to clone its RVV and send it to 
server6
-    rv2 = rv1.getCloneForTransmission();
-    // serialize/deserialize to mimic sending the rvv in a message
-    ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
-    DataOutputStream out = new DataOutputStream(baos);
-    DataSerializer.writeObject(rv2, out);
-    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-    DataInputStream in = new DataInputStream(bais);
-    RegionVersionVector transmittedVector = 
(RegionVersionVector)DataSerializer.readObject(in);
-    // record the provider's rvv in the receiver of the image
-    giiReceiverRVV.recordVersions(transmittedVector);
-    // removedMembers in the receiver should hold {server4, server3}.  Simulate
-    // another member departure to kick out server4
-    assertTrue(giiReceiverRVV.containsMember(server2));
-    assertTrue(giiReceiverRVV.containsMember(server5));
-    assertTrue(giiReceiverRVV.containsMember(server3));
-    assertTrue(giiReceiverRVV.isDepartedMember(server3));
-
-    // unit test for bit-set boundary.  First boundary is 3/4 of bitset width,
-    // which is the amount dumped to the exceptions list when the bitset 
becomes full
-    rv1 = new VMRegionVersionVector(server1);
-    long bitSetRollPoint = RegionVersionHolder.BIT_SET_WIDTH + 1;
-    long boundary = RegionVersionHolder.BIT_SET_WIDTH * 3 / 4;
-    for (long i=1; i<boundary; i++) {
-      rv1.recordVersion(server2, i);
-      assertTrue(rv1.contains(server2, i));
-    }
-    assertFalse(rv1.contains(server2, boundary+1));
-    
-    RegionVersionVector.DEBUG = true;
-
-    rv1.recordVersion(server2, bitSetRollPoint);
-    rv1.recordVersion(server2, bitSetRollPoint+1); // bitSet should be rolled 
at this point
-    RegionVersionHolder h = 
(RegionVersionHolder)rv1.getMemberToVersion().get(server2);
-    long versionBoundary = h.getBitSetVersionForTesting();
-    assertEquals("expected holder bitset version to roll to this value", 
boundary-1, versionBoundary);
-    assertFalse(rv1.contains(server2, bitSetRollPoint-1));
-    assertTrue(rv1.contains(server2, bitSetRollPoint));
-    assertTrue(rv1.contains(server2, bitSetRollPoint+1));
-    assertFalse(rv1.contains(server2, bitSetRollPoint+2));
-    
-    assertTrue(rv1.contains(server2, boundary-1));
-    assertFalse(rv1.contains(server2, boundary));
-    assertFalse(rv1.contains(server2, boundary+1));
-
-    // now test the merge
-    getLogWriter().info("testing merge for " + rv1.fullToString());
-    assertEquals(1, rv1.getExceptionCount(server2)); // one exception from 
boundary-1 to bitSetRollPoint
-    assertFalse(rv1.contains(server2, bitSetRollPoint-1));
-    assertTrue(rv1.contains(server2, bitSetRollPoint));
-    assertTrue(rv1.contains(server2, bitSetRollPoint+1));
-    assertFalse(rv1.contains(server2, bitSetRollPoint+2));
-  
-  }
-  
   
   protected boolean waitForAsyncProcessing(AsyncInvocation async, String 
expectedError) {
     boolean failed = false;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java
index 3ebc72a..195c29c 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java
@@ -407,51 +407,6 @@ public class DistributedSystemDUnitTest extends 
DistributedTestCase {
     }
   }
   
-  static volatile String problem;
-  
-  public void testInterruptedWhileConnecting() throws Exception {
-    fail("testInterruptedWhileConnecting must be reimplemented for the new 
GMS");
-  }
-  public void _testInterruptedWhileConnecting() throws Exception {
-//    Runnable r = new Runnable() {
-//      public void run() {
-//        ClientGmsImpl.SLOW_JOIN_LOCK = new Object();
-//        ClientGmsImpl.SLOW_JOIN = true;
-//        try {
-//          assertTrue("should be disconnected at this point", 
InternalDistributedSystem.getConnectedInstance() == null);
-//          getSystem();
-//          problem = "a connection to the distributed system was established 
but it should have failed";
-//        } catch (SystemConnectException e) {
-//          if 
(!e.getMessage().endsWith(ExternalStrings.ClientGmsImpl_JOIN_INTERRUPTED.getRawText()))
 {
-//            problem = "got a system connect exception but it was for the 
wrong reason";
-//            getLogWriter().info("wrong exception thrown: '" + e.getMessage() 
+ "' (wanted '"+
-//              
ExternalStrings.ClientGmsImpl_JOIN_INTERRUPTED.getRawText()+"')", e);
-//          }
-//        } finally {
-//          ClientGmsImpl.SLOW_JOIN = false;
-//          ClientGmsImpl.SLOW_JOIN_LOCK = null;
-//        }
-//      }
-//    };
-//    Thread connectThread = new Thread(r, "testInterruptedWhileConnecting 
connect thread");
-//    ClientGmsImpl.SLOW_JOIN = false;
-//    connectThread.start();
-//    while (ClientGmsImpl.SLOW_JOIN == false) {
-//      pause(1000);
-//    }
-//    pause(5000);
-//    connectThread.interrupt();
-//    connectThread.join(60000);
-//    getLogWriter().info("done waiting for connectThread.  Thread is " +
-//      (connectThread.isAlive()? "still alive" : "stopped"));
-//    if (ClientGmsImpl.SLOW_JOIN) {
-//      problem = "failed to either connect or get an exception - one of these 
should have happened";
-//      dumpMyThreads(getLogWriter());
-//    }
-//    if (problem != null) {
-//      fail(problem);
-//    }
-  }
 
   
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java
index 0145efb..845e6a6 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java
@@ -580,154 +580,6 @@ public class LocatorDUnitTest extends DistributedTestCase 
{
     }
   }
   
-  /**
-   * this is very similar to testLeadAndCoordFailure but forced-disconnects 
aren't
-   * generated.  Network partition detection is not enabled and we merely look
-   * to see if surviving members notify listeners that quorum was lost.
-   * <p>
-   * we start two locators with admin distributed systems, then start
-   * two regular distributed members.
-   * <p>
-   * We kill the second locator (which is not
-   * the view coordinator) and then kill the non-lead member.  That should be
-   * okay - the lead and remaining locator continue to run.
-   * <p>
-   * We then kill the lead member and demonstrate that the original locator
-   * (which is now the sole remaining member) notifies listeners.
-   */
-  public void testQuorumLossNotification() throws Exception {
-    addExpectedException("Possible loss of quorum due");
-    disconnectAllFromDS();
-    Host host = Host.getHost(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
-    VM locvm3 = host.getVM(3);
-    Locator locator = null;
-    
-    final int port1 = 
AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
-    final int port2 = 
AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
-    deleteLocatorStateFile(port1, port2);
-    final String host0 = getServerHostName(host); 
-    final String locators = host0 + "[" + port1 + "]," +
-                            host0 + "[" + port2 + "]";
-    final Properties properties = new Properties();
-    properties.put("mcast-port", "0");
-    properties.put("locators", locators);
-    properties.put("enable-network-partition-detection", "false");
-    properties.put("disable-auto-reconnect", "true");
-    properties.put("member-timeout", "2000");
-    properties.put(DistributionConfig.ENABLE_CLUSTER_CONFIGURATION_NAME, 
"false");
-    
-    try {
-      final String uname = getUniqueName();
-      File logFile = new File("");
-      locator = Locator.startLocatorAndDS(port1, logFile, properties);
-      final DistributedSystem sys = locator.getDistributedSystem();
-      locvm3.invoke(new SerializableRunnable() {
-        public void run() {
-          File lf = new File("");
-          try {
-            Locator.startLocatorAndDS(port2, lf, properties);
-          }
-          catch (IOException ios) {
-            fail("Unable to start locator2", ios);
-          }
-        }
-      });
-      
-      Object[] connectArgs = new Object[]{ properties };
-      
-      SerializableRunnable crashLocator =
-        new SerializableRunnable("Crash locator") {
-          public void run() {
-            Locator loc = Locator.getLocators().iterator().next();
-            DistributedSystem msys = loc.getDistributedSystem();
-            loc.stop();
-          }
-      };
-
-
-      assertTrue(MembershipManagerHelper.getLeadMember(sys) == null);
-      
-      DistributedMember mem1 = (DistributedMember)vm1.invoke(this.getClass(),
-          "getDistributedMember", connectArgs);
-      vm2.invoke(this.getClass(),
-          "getDistributedMember", connectArgs);
-      assertLeadMember(mem1, sys, 5000);
-      
-      assertEquals(sys.getDistributedMember(), 
MembershipManagerHelper.getCoordinator(sys));
-      
-      // crash the second vm.  Should be okay
-      crashDistributedSystem(vm2);
-      
-      assertTrue("Distributed system should not have disconnected",
-          vm1.invokeBoolean(LocatorDUnitTest.class, "isSystemConnected"));
-      
-      // ensure quorumLost is properly invoked
-      DistributionManager dm = 
(DistributionManager)((InternalDistributedSystem)sys).getDistributionManager();
-      final MyMembershipListener listener = new MyMembershipListener();
-      dm.addMembershipListener(listener);
-  
-      MembershipManagerHelper.inhibitForcedDisconnectLogging(true);
-      try {
-        // a new view won't be installed for 10 seconds (5*member-timeout of 
2000)
-        // so we'll detect loss of two members in one view
-        fail("slow view casting must be implemented for the jgroups 
replacement");
-//        GMS.TEST_HOOK_SLOW_VIEW_CASTING=10;
-
-        // disconnect the first vm and locator to demonstrate that the third 
vm and the
-        // locator notice the failure and notify of quorum loss
-        locvm3.invoke(crashLocator);
-        crashDistributedSystem(vm1);
-  
-        /* This vm is watching vm1, which is watching vm2 which is watching 
locvm.
-         * It will take 3 * (3 * member-timeout) milliseconds to detect the 
full
-         * failure and eject the lost members from the view.
-         */
-        
-        // quorumLost should be invoked when we detect the loss of the other 
members
-        WaitCriterion ev = new WaitCriterion() {
-          public boolean done() {
-            return !listener.quorumLostInvoked;
-          }
-          public String description() {
-            return null;
-          }
-        };
-        DistributedTestCase.waitForCriterion(ev, 12 * 2000, 200, true);
-      } finally {
-        MembershipManagerHelper.inhibitForcedDisconnectLogging(false);
-      }
-      
-      // now close the locator so we can read its log file and verify that a 
quorum-loss notification was issued
-      if (sys.isConnected()) {
-        locator.stop();
-      }
-      
-      try {
-        FileReader fr = new FileReader(logFile);
-        LineNumberReader in = new LineNumberReader(fr);
-        String line;
-        boolean found = false;
-        while ((line = in.readLine()) != null) {
-          if (line.contains("Possible loss of quorum due to the loss of") && 
line.startsWith("[severe")) {
-            getLogWriter().info("Found severe-level quorum loss notification 
as expected on line " + in.getLineNumber());
-            found = true;
-            break;
-          }
-        }
-        assertTrue("expected severe-level quorum loss notification in " + 
logFile.getName(), found);
-      } catch (IOException e) {
-        fail("unexpected exception", e);
-      }
-    }
-    finally {
-      if (locator != null) {
-        locator.stop();
-      }
-      disconnectAllFromDS();
-    }
-  }
 
   /**
    * test lead member failure and normal coordinator shutdown with network 
partition detection

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java
index 7f43557..c1a1070 100755
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java
@@ -121,7 +121,7 @@ public class MembershipJUnitTest extends TestCase {
 //    System.out.println("failed mbrs = " + failedMembers);
 //    System.out.println("failed weight = " + failedWeight);
     assertEquals("failure weight calculation is incorrect", 10, failedWeight);
-    List<InternalDistributedMember> actual = 
newView.getActualCrashedMembers(lastView);
+    Set<InternalDistributedMember> actual = 
newView.getActualCrashedMembers(lastView);
     assertTrue(!actual.contains(members[members.length-2]));
   }
   
@@ -179,8 +179,9 @@ public class MembershipJUnitTest extends TestCase {
       DMStats stats2 = mock(DMStats.class);
       m2 = MemberFactory.newMembershipManager(listener2, config, transport, 
stats2);
       
-      assert m2.getView().size() == 2;
-      assert m1.getView().size() == 2;
+      assert m2.getView().size() == 2 : "view = " + m2.getView();
+      assert m1.getView().size() == 2 : "view = " + m1.getView();
+      assert m1.getView().getCreator().equals(m2.getView().getCreator());
       assert m1.getView().getViewId() == m2.getView().getViewId();
       
       m2.shutdown();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java
index 35a6e13..7e98866 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java
@@ -43,18 +43,10 @@ public class GMSLocatorJUnitTest {
 
   @Before
   public void setUp() throws Exception {
-    String directory = "";
-    boolean isWindows = false;
-    String os = System.getProperty("os.name");
-    if (os != null) {
-      if (os.indexOf("Windows") != -1) {
-        isWindows = true;
-      }
-    }
-    if (!isWindows) {
-      directory = "/etc/";
+    tempStateFile = new File("GMSLocatorJUnitTest_locator.dat");
+    if (tempStateFile.exists()) {
+      tempStateFile.delete();
     }
-    tempStateFile = File.createTempFile(directory+"tempLocator-", ".dat", new 
File(""));
     locator = new GMSLocator(null, tempStateFile, null, false, false, new 
LocatorStats());
     // System.out.println("temp state file: " + tempStateFile);
   }
@@ -71,6 +63,7 @@ public class GMSLocatorJUnitTest {
       oos.writeInt(fileStamp);
       oos.writeInt(ordinal);
       DataSerializer.writeObject(object, oos);
+      oos.flush();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java
index 88fcbd2..99cba22 100755
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java
@@ -58,14 +58,14 @@ public class StatRecorderJUnitTest {
     
     Event evt = new Event(Event.MSG, msg);
     recorder.up(evt);
-    assert stats.ucastMessagesReceived == 1;
+    assert stats.ucastMessagesReceived == 1 : "stats.ucastMessagesReceived =" 
+ stats.ucastMessagesReceived;
     
     recorder.down(evt);
-    assert stats.ucastMessagesSent == 1;
+    assert stats.ucastMessagesSent == 1 : "stats.ucastMessagesSent =" + 
stats.ucastMessagesSent;
     
     
when(msg.getHeader(any(Short.class))).thenReturn(Header.createXmitReqHeader());
     recorder.up(evt);
-    assert stats.ucastRetransmits == 1;
+    assert stats.ucastRetransmits == 1 : "stats.ucastRetransmits =" + 
stats.ucastRetransmits;
   }
 
   /**
@@ -79,18 +79,18 @@ public class StatRecorderJUnitTest {
     
     Event evt = new Event(Event.MSG, msg);
     recorder.up(evt);
-    assert stats.mcastMessagesReceived == 1;
+    assert stats.mcastMessagesReceived == 1 : "mcastMessagesReceived = " + 
stats.mcastMessagesReceived;
     
     recorder.down(evt);
-    assert stats.mcastMessagesSent == 1;
+    assert stats.mcastMessagesSent == 1 : "mcastMessagesSent = " + 
stats.mcastMessagesSent;
     
     
when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitRequestHeader(null));
     recorder.up(evt);
-    assert stats.mcastRetransmitRequests == 1;
+    assert stats.mcastRetransmitRequests == 1 : "mcastRetransmitRequests = " + 
stats.mcastRetransmitRequests;
 
     
when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitResponseHeader());
     recorder.up(evt);
-    assert stats.mcastRetransmits == 1;
+    assert stats.mcastRetransmits == 1 : "mcastRetransmits = " + 
stats.mcastRetransmits;
   }
   
   

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java
index 3370e9c..b97bd0d 100755
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java
@@ -22,6 +22,7 @@ import com.gemstone.gemfire.cache.Region;
 import com.gemstone.gemfire.cache.RegionEvent;
 import com.gemstone.gemfire.cache.util.CacheListenerAdapter;
 import com.gemstone.gemfire.distributed.DistributedSystem;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
 import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
 
 /**
@@ -55,6 +56,7 @@ public class Bug33726JUnitTest{
   @Test
   public void testAfterRegionCreate() {
     Properties props = new Properties();
+    props.put(DistributionConfig.MCAST_PORT_NAME, "0");
     DistributedSystem ds = DistributedSystem.connect(props);
     AttributesFactory factory = new AttributesFactory();
     factory.setCacheListener(new TestCacheListener());

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java
index 6b3d4bb..892a9a2 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java
@@ -8,22 +8,28 @@
 package com.gemstone.gemfire.internal.cache.versions;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
+import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.BitSet;
+import java.util.HashSet;
 import java.util.Map;
-import java.util.TreeSet;
-
-import org.junit.experimental.categories.Category;
+import java.util.Set;
 
 import junit.framework.TestCase;
 
+import org.junit.experimental.categories.Category;
+
+import com.gemstone.gemfire.DataSerializer;
+import 
com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.internal.HeapDataOutputStream;
 import com.gemstone.gemfire.internal.InternalDataSerializer;
 import com.gemstone.gemfire.internal.Version;
 import com.gemstone.gemfire.internal.cache.persistence.DiskStoreID;
 import com.gemstone.gemfire.test.junit.categories.UnitTest;
 
+import dunit.DistributedTestCase;
+
 @Category(UnitTest.class)
 public class RegionVersionVectorJUnitTest extends TestCase {
 
@@ -38,6 +44,223 @@ public class RegionVersionVectorJUnitTest extends TestCase {
     doExceptionsWithContains(id1, rvv);
   }
   
+  @SuppressWarnings({ "unchecked", "rawtypes" })
+  public void testRegionVersionVectors() throws Exception {
+    // this is just a quick set of unit tests for basic RVV functionality
+    
+    final String local = DistributedTestCase.getIPLiteral();
+    InternalDistributedMember server1 = new InternalDistributedMember(local, 
101);
+    InternalDistributedMember server2 = new InternalDistributedMember(local, 
102);
+    InternalDistributedMember server3 = new InternalDistributedMember(local, 
103);
+    InternalDistributedMember server4 = new InternalDistributedMember(local, 
104);
+
+    RegionVersionVector rv1 = null;
+    
+    // (a) Test that an exception is mended when the versions that are missing 
are
+    // added
+    rv1 = new VMRegionVersionVector(server1);
+    rv1.recordVersion(server2, 1);
+    rv1.recordVersion(server2, 5);
+    rv1.recordVersion(server2, 8);
+    System.out.println("for test (a) formed this RVV: " + rv1.fullToString());
+    // there should now be two exceptions:  1-5 and 5-8
+    assertEquals(8, rv1.getVersionForMember(server2));
+    assertEquals(2, rv1.getExceptionCount(server2));
+    rv1.recordVersion(server2, 3);
+    System.out.println("for test (a) RVV is now: " + rv1.fullToString());
+    assertEquals(8, rv1.getVersionForMember(server2));
+    assertEquals(2, rv1.getExceptionCount(server2));
+    rv1.recordVersion(server2, 4);
+    rv1.recordVersion(server2, 2);
+    System.out.println("for test (a) RVV is now: " + rv1.fullToString());
+    assertEquals(1, rv1.getExceptionCount(server2));
+    rv1.recordVersion(server2, 6);
+    rv1.recordVersion(server2, 7);
+    System.out.println("for test (a) RVV is now: " + rv1.fullToString());
+    assertEquals(0, rv1.getExceptionCount(server2));
+    
+    // (b) Test the contains() operation
+    rv1 = new VMRegionVersionVector(server1);
+    rv1.recordVersion(server2, 1);
+    rv1.recordVersion(server2, 5);
+    rv1.recordVersion(server2, 8);
+    rv1.recordVersion(server2, 10);
+    System.out.println("for test (b) formed this RVV: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 1));
+    assertTrue(rv1.contains(server2, 5));
+    assertTrue(rv1.contains(server2, 8));
+    assertTrue(rv1.contains(server2, 10));
+    assertFalse(rv1.contains(server2, 2));
+    assertFalse(rv1.contains(server2, 3));
+    assertFalse(rv1.contains(server2, 4));
+    assertFalse(rv1.contains(server2, 9));
+    assertFalse(rv1.contains(server2, 11));
+    rv1.recordVersion(server2, 3);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 3));
+    rv1.recordVersion(server2, 2);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 2));
+    assertTrue(rv1.contains(server2, 3));
+    rv1.recordVersion(server2, 4);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 1));
+    assertTrue(rv1.contains(server2, 2));
+    assertTrue(rv1.contains(server2, 3));
+    assertTrue(rv1.contains(server2, 4));
+    assertTrue(rv1.contains(server2, 5));
+    rv1.recordVersion(server2, 11);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 11));
+    assertTrue(rv1.contains(server2, 10));
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    rv1.recordVersion(server2, 6);
+    assertTrue(rv1.contains(server2, 2));
+    assertTrue(rv1.contains(server2, 5));
+    assertTrue(rv1.contains(server2, 6));
+    assertFalse(rv1.contains(server2, 7));
+    assertTrue(rv1.contains(server2, 8));
+    rv1.recordVersion(server2, 7);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 7));
+    rv1.recordVersion(server2, 9);
+    System.out.println("for test (b) RVV is now: " + rv1.fullToString());
+    assertTrue(rv1.contains(server2, 9));
+    assertTrue(rv1.getExceptionCount(server2) == 0);
+    assertTrue(rv1.contains(server2, 8));
+    
+    
+    // Test RVV comparisons for GII Delta
+    rv1 = new VMRegionVersionVector(server1);
+    rv1.recordVersion(server2, 1);
+    rv1.recordVersion(server2, 4);
+    rv1.recordVersion(server2, 8);
+    rv1.recordVersion(server2, 9);
+    rv1.recordVersion(server2, 10);
+    rv1.recordVersion(server2, 11);
+    rv1.recordVersion(server2, 12);
+    
+    rv1.recordVersion(server3, 2);
+    rv1.recordVersion(server3, 3);
+    rv1.recordVersion(server3, 4);
+    rv1.recordVersion(server3, 6);
+    rv1.recordVersion(server3, 7);
+    
+    RegionVersionVector rv2 = rv1.getCloneForTransmission();
+    System.out.println("rv1 is " + rv1.fullToString());
+    System.out.println("rv2 is " + rv2.fullToString());
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    assertFalse(rv2.isNewerThanOrCanFillExceptionsFor(rv1));
+
+    rv1.recordVersion(server2, 6);
+    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv2.recordVersion(server2, 6);
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+
+    // fill an exception gap
+    rv1.recordVersion(server2, 5);
+    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv2.recordVersion(server2, 5);
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv1.recordVersion(server2, 7);
+    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv2.recordVersion(server2, 7);
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+
+    // add a more recent revision
+    rv1.recordVersion(server3, 8);
+    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv2.recordVersion(server3, 8);
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+
+    // fill another exception gap
+    rv1.recordVersion(server3, 5);
+    assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    rv2.recordVersion(server3, 5);
+    assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2));
+    
+    // test that old members are removed from the vector
+    InternalDistributedMember server5 = new InternalDistributedMember(local, 
105);
+    rv1 = new VMRegionVersionVector(server1);
+    rv1.recordVersion(server2, 1);
+    rv1.recordVersion(server3, 1);
+    rv1.recordVersion(server4, 1);
+    rv1.recordVersion(server5, 1);
+    rv1.memberDeparted(server2, false);
+    rv1.memberDeparted(server4, true);
+    assertTrue(rv1.containsMember(server2));
+    assertTrue(rv1.containsMember(server3));
+    assertTrue(rv1.containsMember(server4));
+    Set retain = new HashSet();
+      retain.add(server2);  // still have data from server2
+      retain.add(server3);  // still have data from server3
+      // no data found from server4 in region
+      retain.add(server5);  // still have data from server5
+    rv1.removeOldMembers(retain);
+    assertFalse(rv1.containsMember(server4));
+
+    rv1.memberDeparted(server3, false); // {server2, server3(departed), 
server5}
+
+    // Now test that departed members are transferred with GII.  We simulate
+    // a new server, server6, doing a GII from server1
+
+    InternalDistributedMember server6 = new InternalDistributedMember(local, 
106);
+    RegionVersionVector giiReceiverRVV = new VMRegionVersionVector(server6);
+    // the gii request will cause server1 to clone its RVV and send it to 
server6
+    rv2 = rv1.getCloneForTransmission();
+    // serialize/deserialize to mimic sending the rvv in a message
+    ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
+    DataOutputStream out = new DataOutputStream(baos);
+    DataSerializer.writeObject(rv2, out);
+    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+    DataInputStream in = new DataInputStream(bais);
+    RegionVersionVector transmittedVector = 
(RegionVersionVector)DataSerializer.readObject(in);
+    // record the provider's rvv in the receiver of the image
+    giiReceiverRVV.recordVersions(transmittedVector);
+    // removedMembers in the receiver should hold {server4, server3}.  Simulate
+    // another member departure to kick out server4
+    assertTrue(giiReceiverRVV.containsMember(server2));
+    assertTrue(giiReceiverRVV.containsMember(server5));
+    assertTrue(giiReceiverRVV.containsMember(server3));
+    assertTrue(giiReceiverRVV.isDepartedMember(server3));
+
+    // unit test for bit-set boundary.  First boundary is 3/4 of bitset width,
+    // which is the amount dumped to the exceptions list when the bitset 
becomes full
+    rv1 = new VMRegionVersionVector(server1);
+    long bitSetRollPoint = RegionVersionHolder.BIT_SET_WIDTH + 1;
+    long boundary = RegionVersionHolder.BIT_SET_WIDTH * 3 / 4;
+    for (long i=1; i<boundary; i++) {
+      rv1.recordVersion(server2, i);
+      assertTrue(rv1.contains(server2, i));
+    }
+    assertFalse(rv1.contains(server2, boundary+1));
+    
+    RegionVersionVector.DEBUG = true;
+
+    rv1.recordVersion(server2, bitSetRollPoint);
+    rv1.recordVersion(server2, bitSetRollPoint+1); // bitSet should be rolled 
at this point
+    RegionVersionHolder h = 
(RegionVersionHolder)rv1.getMemberToVersion().get(server2);
+    long versionBoundary = h.getBitSetVersionForTesting();
+    assertEquals("expected holder bitset version to roll to this value", 
boundary-1, versionBoundary);
+    assertFalse(rv1.contains(server2, bitSetRollPoint-1));
+    assertTrue(rv1.contains(server2, bitSetRollPoint));
+    assertTrue(rv1.contains(server2, bitSetRollPoint+1));
+    assertFalse(rv1.contains(server2, bitSetRollPoint+2));
+    
+    assertTrue(rv1.contains(server2, boundary-1));
+    assertFalse(rv1.contains(server2, boundary));
+    assertFalse(rv1.contains(server2, boundary+1));
+
+    // now test the merge
+    System.out.println("testing merge for " + rv1.fullToString());
+    assertEquals(1, rv1.getExceptionCount(server2)); // one exception from 
boundary-1 to bitSetRollPoint
+    assertFalse(rv1.contains(server2, bitSetRollPoint-1));
+    assertTrue(rv1.contains(server2, bitSetRollPoint));
+    assertTrue(rv1.contains(server2, bitSetRollPoint+1));
+    assertFalse(rv1.contains(server2, bitSetRollPoint+2));
+  
+  }
+  
   public void testRVVSerialization() throws IOException, 
ClassNotFoundException {
     DiskStoreID ownerId = new DiskStoreID(0, 0);
     DiskStoreID id1 = new DiskStoreID(0, 1);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java
index 0a19abc..d4769ad 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java
@@ -25,6 +25,7 @@ import net.spy.memcached.MemcachedClient;
 
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
 import com.gemstone.gemfire.internal.AvailablePortHelper;
 import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
 
@@ -65,6 +66,7 @@ public class IntegrationJUnitTest {
     final int port = AvailablePortHelper.getRandomAvailableTCPPort();
     props.setProperty("memcached-port", port+"");
     props.setProperty("memcached-bind-address", "127.0.0.1");
+    props.put(DistributionConfig.MCAST_PORT_NAME, "0");
     CacheFactory cf = new CacheFactory(props);
     Cache cache = cf.create();
 

Reply via email to