You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bs...@apache.org on 2015/08/06 00:04:44 UTC

[1/2] incubator-geode git commit: Enabling creation of stand-alone GMSLocator & adding 2-phase view casting

Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-77 04cc2d9b5 -> e71780aea


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messages/ViewAckMessage.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messages/ViewAckMessage.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messages/ViewAckMessage.java
index f52811b..66e59e2 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messages/ViewAckMessage.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messages/ViewAckMessage.java
@@ -6,25 +6,28 @@ import java.io.IOException;
 
 import com.gemstone.gemfire.DataSerializer;
 import com.gemstone.gemfire.distributed.internal.DistributionManager;
-import com.gemstone.gemfire.distributed.internal.DistributionMessage;
+import com.gemstone.gemfire.distributed.internal.HighPriorityDistributionMessage;
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
 
-public class ViewAckMessage extends DistributionMessage {
+public class ViewAckMessage extends HighPriorityDistributionMessage {
 
   int viewId;
+  boolean preparing;
   NetView alternateView;
   
-  public ViewAckMessage(InternalDistributedMember recipient, int viewId) {
+  public ViewAckMessage(InternalDistributedMember recipient, int viewId, boolean preparing) {
     super();
     setRecipient(recipient);
     this.viewId = viewId;
+    this.preparing = preparing;
   }
   
   public ViewAckMessage(InternalDistributedMember recipient, NetView alternateView) {
     super();
     setRecipient(recipient);
     this.alternateView = alternateView;
+    this.preparing = true;
   }
   
   public ViewAckMessage() {
@@ -35,6 +38,14 @@ public class ViewAckMessage extends DistributionMessage {
     return viewId;
   }
   
+  public NetView getAlternateView() {
+    return this.alternateView;
+  }
+  
+  public boolean isPrepareAck() {
+    return preparing;
+  }
+  
   @Override
   public int getDSFID() {
     // TODO Auto-generated method stub
@@ -55,6 +66,7 @@ public class ViewAckMessage extends DistributionMessage {
   public void toData(DataOutput out) throws IOException {
     super.toData(out);
     out.writeInt(this.viewId);
+    out.writeBoolean(this.preparing);
     DataSerializer.writeObject(this.alternateView, out);
   }
 
@@ -62,13 +74,14 @@ public class ViewAckMessage extends DistributionMessage {
   public void fromData(DataInput in) throws IOException, ClassNotFoundException {
     super.fromData(in);
     this.viewId = in.readInt();
+    this.preparing = in.readBoolean();
     this.alternateView = DataSerializer.readObject(in);
   }
   
   @Override
   public String toString() {
     String s = getSender() == null? getRecipientsDescription() : ""+getSender();
-    return "ViewAckMessage("+s+"; "+this.viewId+"; altview="+this.alternateView+")";
+    return "ViewAckMessage("+s+"; "+this.viewId+"; preparing="+preparing+"; altview="+this.alternateView+")";
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/AddressManager.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/AddressManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/AddressManager.java
index 9f2a98d..bfd0aee 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/AddressManager.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/AddressManager.java
@@ -15,7 +15,7 @@ import org.jgroups.stack.IpAddress;
 import org.jgroups.stack.Protocol;
 import org.jgroups.util.Responses;
 
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 
 /**
  * JGroups will not send messages that have IpAddress destination addresses.
@@ -29,7 +29,7 @@ import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberService
  */
 public class AddressManager extends Protocol {
 
-  private static final Logger logger = GMSMemberServices.getLogger();
+  private static final Logger logger = Services.getLogger();
   
   private UDP udp;
   private Method setPingData;
@@ -51,6 +51,7 @@ public class AddressManager extends Protocol {
         try {
           if (laddr instanceof JGAddress) {
             PingData pd = new PingData(laddr, true, laddr.toString(), newIpAddress(laddr));
+            logger.debug("AddressManager.FIND_MBRS adding response {}", pd);
             responses.addResponse(pd, false);
             updateUDPCache(pd);
           }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGAddress.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGAddress.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGAddress.java
index b34b8ed..adb108b 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGAddress.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGAddress.java
@@ -28,6 +28,10 @@ import com.gemstone.gemfire.internal.SocketCreator;
 
 public class JGAddress extends UUID {
   private static final long       serialVersionUID=-1818672332115113291L;
+
+  // whether to show UUID info in toString()
+  private final static boolean SHOW_UUIDS = Boolean.getBoolean("gemfire.show_UUIDs");
+
   private InetAddress             ip_addr;
   private int                     port;
   private int                     vmViewId;
@@ -107,6 +111,11 @@ public class JGAddress extends UUID {
       if (vmViewId >= 0) {
         sb.append("<v").append(vmViewId).append('>');
       }
+      if (SHOW_UUIDS) {
+        sb.append("(").append(toStringLong()).append(")");
+      } else if (mostSigBits == 0 && leastSigBits == 0) {
+        sb.append("(no uuid set)");
+      }
       sb.append(":").append(port);
       return sb.toString();
   }
@@ -146,6 +155,14 @@ public class JGAddress extends UUID {
       out.writeLong(mostSigBits);
       out.writeLong(leastSigBits);
   }
+  
+  public long getUUIDMsbs() {
+    return mostSigBits;
+  }
+  
+  public long getUUIDLsbs() {
+    return leastSigBits;
+  }
 
   public void readFrom(DataInput in) throws Exception {
       int len=in.readByte();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 acfbc53..128b2eb 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
@@ -52,7 +52,7 @@ import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedM
 import com.gemstone.gemfire.distributed.internal.membership.MemberAttributes;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
 import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMember;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.MessageHandler;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Messenger;
 import com.gemstone.gemfire.distributed.internal.membership.gms.messages.JoinResponseMessage;
@@ -71,7 +71,7 @@ import com.gemstone.gemfire.internal.tcp.MemberShunnedException;
 
 public class JGroupsMessenger implements Messenger {
 
-  private static final Logger logger = GMSMemberServices.getLogger();
+  private static final Logger logger = Services.getLogger();
 
   /**
    * The system property that specifies the name of a file from which to read
@@ -98,7 +98,7 @@ public class JGroupsMessenger implements Messenger {
   JChannel myChannel;
   InternalDistributedMember localAddress;
   JGAddress jgAddress;
-  GMSMemberServices services;
+  Services services;
 
   /** handlers that receive certain classes of messages instead of the Manager */
   Map<Class, MessageHandler> handlers = new ConcurrentHashMap<Class, MessageHandler>();
@@ -115,7 +115,7 @@ public class JGroupsMessenger implements Messenger {
   }
 
   @Override
-  public void init(GMSMemberServices s) {
+  public void init(Services s) {
     this.services = s;
 
     RemoteTransportConfig transport = services.getConfig().getTransport();
@@ -232,8 +232,6 @@ public class JGroupsMessenger implements Messenger {
       myChannel.setReceiver(new JGroupsReceiver());
       myChannel.connect("AG"); // apache g***** (whatever we end up calling it)
       
-    } catch (IllegalStateException e) {
-      throw new SystemConnectException("unable to create jgroups channel", e);
     } catch (Exception e) {
       throw new SystemConnectException("unable to create jgroups channel", e);
     }
@@ -297,12 +295,8 @@ public class JGroupsMessenger implements Messenger {
         getAddress.setAccessible(true);
         ipaddr = (IpAddress)getAddress.invoke(udp, new Object[0]);
         this.jgAddress = new JGAddress(logicalAddress, ipaddr);
-      } catch (NoSuchMethodException e) {
+      } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
         logger.info("Unable to find getPhysicallAddress method in UDP - parsing its address instead");
-      } catch (InvocationTargetException e) {
-        logger.info("Unable to invoke getPhysicallAddress method in UDP - parsing its address instead");
-      } catch (IllegalAccessException e) {
-        logger.info("Unable to access getPhysicallAddress method in UDP - parsing its address instead");
       }
       
       if (this.jgAddress == null) {
@@ -398,6 +392,7 @@ public class JGroupsMessenger implements Messenger {
         problem = e;
       }
       catch (Exception e) {
+        logger.info("caught unexpected exception", e);
         Throwable cause = e.getCause();
         if (cause instanceof ForcedDisconnectException) {
           problem = (Exception) cause;
@@ -543,10 +538,6 @@ public class JGroupsMessenger implements Messenger {
     msg.setDest(null);
     msg.setSrc(src);
     //log.info("Creating message with payload " + gfmsg);
-    if (gfmsg instanceof com.gemstone.gemfire.internal.cache.DistributedCacheOperation.CacheOperationMessage) {
-      com.gemstone.gemfire.internal.cache.DistributedCacheOperation.CacheOperationMessage cmsg =
-          (com.gemstone.gemfire.internal.cache.DistributedCacheOperation.CacheOperationMessage)gfmsg;
-    }
     if (gfmsg.getProcessorType() == DistributionManager.HIGH_PRIORITY_EXECUTOR
         || gfmsg instanceof HighPriorityDistributionMessage) {
       msg.setFlag(Flag.OOB);
@@ -558,7 +549,7 @@ public class JGroupsMessenger implements Messenger {
       HeapDataOutputStream out_stream =
         new HeapDataOutputStream(Version.fromOrdinalOrCurrent(version));
         Version.CURRENT.writeOrdinal(out_stream, true);
-//        DataSerializer.writeObject(this.localAddress.getNetMember(), out_stream);
+        DataSerializer.writeObject(this.localAddress.getNetMember(), out_stream);
         DataSerializer.writeObject(gfmsg, out_stream);
         msg.setBuffer(out_stream.toByteArray());
     }
@@ -582,6 +573,10 @@ public class JGroupsMessenger implements Messenger {
     
     int messageLength = jgmsg.getLength();
     
+    if (logger.isDebugEnabled()) {
+      logger.debug("deserializing a message of length "+messageLength);
+    }
+    
     if (messageLength == 0) {
       // jgroups messages with no payload are used for protocol interchange, such
       // as STABLE_GOSSIP
@@ -604,24 +599,18 @@ public class JGroupsMessenger implements Messenger {
             ordinal, true));
       }
       
-      Address s = jgmsg.getSrc();
-      sender = getMemberFromView(s, ordinal);
+      GMSMember m = DataSerializer.readObject(dis);
+      sender = getMemberFromView(m, ordinal);
 
       result = DataSerializer.readObject(dis);
       if (result instanceof DistributionMessage) {
-        ((DistributionMessage) result).setSender(sender);
+        ((DistributionMessage)result).setSender(sender);
       }
 
       logger.debug("JGroupsReceiver deserialized {}", result);
 
     }
-    catch (ClassNotFoundException e) {
-      problem = e;
-    }
-    catch (IOException e) {
-      problem = e;
-    }
-    catch (RuntimeException e) {
+    catch (ClassNotFoundException | IOException | RuntimeException e) {
       problem = e;
     }
     if (problem != null) {
@@ -652,39 +641,17 @@ public class JGroupsMessenger implements Messenger {
   /**
    * returns the member ID for the given GMSMember object
    */
-  private InternalDistributedMember getMemberFromView(Address jgId, short version) {
+  private InternalDistributedMember getMemberFromView(GMSMember jgId, short version) {
     NetView v = services.getJoinLeave().getView();
-    GMSMember gm = null;
-    
-    if ( !(jgId instanceof JGAddress) ) {
-      // not one of our addresses - gather info from JGroups to form
-      // a GMSAddress or fish for the ID using the UUID
-      IpAddress pa = (IpAddress)myChannel.down(new Event(Event.GET_PHYSICAL_ADDRESS, jgId));
-      if (pa == null) {
-        // worst-case scenario - we only have a UUID
-        for (InternalDistributedMember m: v.getMembers()) {
-          if (((GMSMember)m.getNetMember()).getUUID().equals(jgId)) {
-            return m;
-          }
-        }
-      }
-      gm = new GMSMember(pa.getIpAddress(), pa.getPort(),
-          false/*unknown*/, false/*unknown*/, version);
-    }
-    else {
-      JGAddress addr = (JGAddress)jgId;
-      gm = new GMSMember(addr.getInetAddress(), addr.getPort(),
-          false/*unknown*/, false/*unknown*/, version);
-    }
     
     if (v != null) {
       for (InternalDistributedMember m: v.getMembers()) {
-        if (m.getNetMember().equals(jgId)) {
+        if (((GMSMember)m.getNetMember()).equals(jgId)) {
           return m;
         }
       }
     }
-    return new InternalDistributedMember(gm);
+    return new InternalDistributedMember(jgId);
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 89341cc..07b59c4 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
@@ -13,6 +13,7 @@ import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 import java.net.SocketException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -63,7 +64,7 @@ import com.gemstone.gemfire.distributed.internal.membership.MembershipManager;
 import com.gemstone.gemfire.distributed.internal.membership.MembershipTestHook;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
 import com.gemstone.gemfire.distributed.internal.membership.QuorumChecker;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.SuspectMember;
 import com.gemstone.gemfire.distributed.internal.membership.gms.fd.GMSHealthMonitor;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Manager;
@@ -89,7 +90,7 @@ import com.gemstone.gemfire.internal.util.Breadcrumbs;
 
 public class GMSMembershipManager implements MembershipManager, Manager
 {
-  private static final Logger logger = GMSMemberServices.getLogger();
+  private static final Logger logger = Services.getLogger();
   
   /** product version to use for multicast serialization */
   volatile boolean disableMulticastForRollingUpgrade;
@@ -766,7 +767,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
    */
   private SystemTimer cleanupTimer;
 
-  private GMSMemberServices services;
+  private Services services;
 
 
   @Override
@@ -828,7 +829,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
   }
   
   @Override
-  public void init(GMSMemberServices services) {
+  public void init(Services services) {
     this.services = services;
 
     Assert.assertTrue(services != null);
@@ -920,8 +921,8 @@ public class GMSMembershipManager implements MembershipManager, Manager
   }
   
 
-  /** this is invoked by JGroups when there is a loss of quorum in the membership system */
-  public void quorumLost(Set failures, List remaining) {
+  /** this is invoked by JoinLeave when there is a loss of quorum in the membership system */
+  public void quorumLost(Collection<InternalDistributedMember> failures, NetView view) {
     // notify of quorum loss if split-brain detection is enabled (meaning we'll shut down) or
     // if the loss is more than one member
     
@@ -931,6 +932,9 @@ public class GMSMembershipManager implements MembershipManager, Manager
     }
     
     if (notify) {
+      List<InternalDistributedMember> remaining = new ArrayList<InternalDistributedMember>(view.getMembers());
+      remaining.removeAll(failures);
+      
       if (inhibitForceDisconnectLogging) {
         if (logger.isDebugEnabled()) {
           logger.debug("<ExpectedException action=add>Possible loss of quorum</ExpectedException>");
@@ -1616,7 +1620,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
     return address;
   }
   
-  public GMSMemberServices getServices() {
+  public Services getServices() {
     return services;
   }
 
@@ -1902,7 +1906,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
    */
   public boolean verifyMember(DistributedMember mbr, String reason) {
     if (mbr != null && memberExists((InternalDistributedMember)mbr)) {
-      this.services.getHealthMonitor().checkSuspect(mbr, reason);
+      return this.services.getHealthMonitor().checkIfAvailable(mbr, reason, true);
     }
     return false;
   }
@@ -1981,11 +1985,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
       }
       return new HashSet<InternalDistributedMember>(members);
     } // catch ConnectionExceptions
-    catch (ToDataException e) {
-      throw e; // error in user data
-    }
-    catch (CancelException e) {
-      // not interesting, we're just shutting down
+    catch (ToDataException | CancelException e) {
       throw e;
     }
     catch (IOException e) {
@@ -2947,7 +2947,7 @@ public class GMSMembershipManager implements MembershipManager, Manager
 
   @Override
   public void setSecurityLogWriter(InternalLogWriter writer) {
-    GMSMemberServices.setSecurityLogWriter(writer);
+    Services.setSecurityLogWriter(writer);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/tcpserver/TcpClient.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/tcpserver/TcpClient.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/tcpserver/TcpClient.java
index 6b7eb54..6720f64 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/tcpserver/TcpClient.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/tcpserver/TcpClient.java
@@ -88,6 +88,8 @@ public class TcpClient {
     } else {
       ipAddr = new InetSocketAddress(addr, port); // fix for bug 30810
     }
+    
+    logger.debug("TcpClient sending {} to {}", request, ipAddr);
 
     // Get the GemFire version of the TcpServer first, before sending any other request.
     short serverVersion = getServerVersion(ipAddr, REQUEST_TIMEOUT).shortValue();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 cba5c44..db27b95 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
@@ -2127,7 +2127,11 @@ public class LocalizedStrings extends ParentLocalizedStrings {
 
   public static final StringId Locator_unable_to_recover_view_0 = new StringId(6606, "Unable to recover previous membership view from  {0}");
 
+  public static final StringId Network_partition_detected = new StringId(6607, "Exiting due to possible network partition event due to loss of {0} cache processes: {1}");
+  
+  
   /** Testing strings, messageId 90000-99999 **/
+  
   /** These are simple messages for testing, translated with Babelfish. **/
   public static final StringId TESTING_THIS_IS_A_TEST_MESSAGE = new StringId(90000, "This is a test message.");
   public static final StringId TESTING_THIS_MESSAGE_HAS_0_MEMBERS = new StringId(90001, "Please ignore: This message has {0} members.");

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/internal/logging/LogService.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/logging/LogService.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/logging/LogService.java
index 64c9301..e12f83f 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/logging/LogService.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/logging/LogService.java
@@ -121,8 +121,8 @@ public class LogService extends LogManager {
   private static final void setLog4jConfigFileProperty() {
     // fix bug #52175
     final URL configInClasspath = ConfigLocator.findConfigInClasspath();
-    if (configInClasspath != null
-        && !configInClasspath.getPath().contains("jgroups-")) { // jgroups jar contains a log4j config file!
+    if (configInClasspath != null) {
+//      System.out.println("log config is " + configInClasspath);
       // Log4J 2 will find the configuration file in classpath so do nothing
       configFileInformation = "Using log4j configuration found in classpath: '" + configInClasspath.toString() + "'";
       StatusLogger.getLogger().info(configFileInformation);
@@ -135,6 +135,7 @@ public class LogService extends LogManager {
     if (configFileName != null) {
       final URL configUrl = LogService.class.getResource(configFileName);// log4j2-cli.xml is non-null, external is null
       if (configUrl == null) {
+//        System.out.println("log config (2) is " + configUrl);
         //We will let log4j2 handle the null case and just log what file we are attempting to use
         configFileInformation = "Using log4j configuration file specified by " + ConfigurationFactory.CONFIGURATION_FILE_PROPERTY + ": '" + configFileName + "'";
         StatusLogger.getLogger().info(configFileInformation);
@@ -144,6 +145,7 @@ public class LogService extends LogManager {
         //If the resource can be found and in cases where the resource is in gemfire jar,
         //we set the log location to the file that was found
         String configFilePropertyValue = configUrl.toString();
+//        System.out.println("log config (3) is " + configFilePropertyValue);
         System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, configFilePropertyValue);
         configFileInformation = "Using log4j configuration file specified by " + ConfigurationFactory.CONFIGURATION_FILE_PROPERTY + ": '" + configFilePropertyValue + "'";
         StatusLogger.getLogger().info(configFileInformation);
@@ -159,6 +161,7 @@ public class LogService extends LogManager {
     // If one of the default log4j config files exists in the current directory then use it.
     File log4jConfigFile = findLog4jConfigInCurrentDir();
     if (log4jConfigFile != null) {
+//      System.out.println("log config (4) is " + log4jConfigFile);
       String filePath = IOUtils.tryGetCanonicalPathElseGetAbsolutePath(log4jConfigFile);
       String value = new File(filePath).toURI().toString();
       String configFilePropertyValue = new File(filePath).toURI().toString();
@@ -170,6 +173,7 @@ public class LogService extends LogManager {
 
     // Use the log4j config file found on the classpath in the gemfire jar file.
     final URL configUrl = LogService.class.getResource(DEFAULT_CONFIG);
+//    System.out.println("using default log config " + configUrl);
     String configFilePropertyValue = configUrl.toString();
     System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, configFilePropertyValue);
     configFileInformation = "Setting " + ConfigurationFactory.CONFIGURATION_FILE_PROPERTY + " to specify log4j configuration file: '" + configFilePropertyValue + "'";

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/resources/com/gemstone/gemfire/internal/logging/log4j/log4j2-default.xml
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/resources/com/gemstone/gemfire/internal/logging/log4j/log4j2-default.xml b/gemfire-core/src/main/resources/com/gemstone/gemfire/internal/logging/log4j/log4j2-default.xml
index 9ab1aa6..8b1331f 100644
--- a/gemfire-core/src/main/resources/com/gemstone/gemfire/internal/logging/log4j/log4j2-default.xml
+++ b/gemfire-core/src/main/resources/com/gemstone/gemfire/internal/logging/log4j/log4j2-default.xml
@@ -14,7 +14,7 @@
       <MarkerFilter marker="GEMFIRE_VERBOSE" onMatch="DENY" onMismatch="NEUTRAL"/>
     </filters>
     </Logger>
-    <Logger name="org.jgroups" level="ALL" additivity="true"/>
+    <Logger name="org.jgroups" level="INFO" additivity="true"/>
     <Root level="INFO">
       <AppenderRef ref="STDOUT"/>
     </Root>

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/test/java/com/gemstone/gemfire/codeAnalysis/AnalyzeSerializablesJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/codeAnalysis/AnalyzeSerializablesJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/codeAnalysis/AnalyzeSerializablesJUnitTest.java
index 7cd0ca7..1aeac1f 100644
--- a/gemfire-core/src/test/java/com/gemstone/gemfire/codeAnalysis/AnalyzeSerializablesJUnitTest.java
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/codeAnalysis/AnalyzeSerializablesJUnitTest.java
@@ -21,14 +21,12 @@ import java.util.Map;
 
 import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 import com.gemstone.gemfire.codeAnalysis.decode.CompiledClass;
 import com.gemstone.gemfire.codeAnalysis.decode.CompiledField;
 import com.gemstone.gemfire.codeAnalysis.decode.CompiledMethod;
-import com.gemstone.gemfire.internal.GemFireVersion;
 import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
 import com.gemstone.gemfire.util.test.TestUtil;
 
@@ -62,7 +60,6 @@ public class AnalyzeSerializablesJUnitTest {
     List<String> excludedClasses = loadExcludedClasses(new File(TestUtil.getResourcePath(AnalyzeSerializablesJUnitTest.class, "excludedClasses.txt")));
     List<String> openBugs = loadOpenBugs(new File(TestUtil.getResourcePath(AnalyzeSerializablesJUnitTest.class, "openBugs.txt")));
     excludedClasses.addAll(openBugs);
-    loadJGroupsJar(excludedClasses);
     
     String cp = System.getProperty("java.class.path");
     System.out.println("java classpath is " + cp);
@@ -104,34 +101,6 @@ public class AnalyzeSerializablesJUnitTest {
     }
   }
   
-  private static void loadJGroupsJar(List<String> excludedClasses) throws Exception {
-    System.out.println("loadJGroupsJar starting");
-
-    String cp = System.getProperty("java.class.path");
-    System.out.println("java classpath is " + cp);
-    System.out.flush();
-    String[] entries = cp.split(File.pathSeparator);
-    String gfejgroupsjar = null;
-    String gfejgroupsjarname = GemFireVersion.getGemFireJGroupsJarFileName();
-    for (int i=0; i<entries.length; i++) {
-      System.out.println("examining '" + entries[i] + "'");
-      System.out.flush();
-      if (entries[i].endsWith(gfejgroupsjarname)) {
-        gfejgroupsjar = entries[i];
-        break;
-      }
-    }
-    if (gfejgroupsjar != null) {
-      System.out.println("loading class files from " + gfejgroupsjar);
-      System.out.flush();
-      loadClasses(new File(gfejgroupsjar), excludedClasses);
-    }
-    else {
-      fail("unable to find jgroups jar");
-    }
-    DISABLED = false;
-  }
-  
   protected static List<String> loadExcludedClasses(File exclusionsFile) throws Exception {
     List<String> excludedClasses = new LinkedList<String>();
     FileReader fr = new FileReader(exclusionsFile);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 fd955e1..4adda2a 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
@@ -7,239 +7,103 @@
  */
 package com.gemstone.gemfire.distributed.internal.membership;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-import java.util.Properties;
-import java.util.Set;
 
 import junit.framework.TestCase;
 
-import org.junit.Test;
+import org.apache.logging.log4j.Level;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.experimental.categories.Category;
 
-import com.gemstone.gemfire.cache.GemFireCache;
-import com.gemstone.gemfire.distributed.DistributedSystem;
-import com.gemstone.gemfire.distributed.Locator;
-import com.gemstone.gemfire.distributed.internal.DMStats;
-import com.gemstone.gemfire.distributed.internal.DistributionConfig;
-import com.gemstone.gemfire.distributed.internal.DistributionConfigImpl;
 import com.gemstone.gemfire.distributed.internal.DistributionManager;
-import com.gemstone.gemfire.distributed.internal.DistributionMessage;
-import com.gemstone.gemfire.distributed.internal.InternalLocator;
-import com.gemstone.gemfire.distributed.internal.LonerDistributionManager.DummyDMStats;
-import com.gemstone.gemfire.distributed.internal.PoolStatHelper;
-import com.gemstone.gemfire.distributed.internal.SharedConfiguration;
-import com.gemstone.gemfire.distributed.internal.membership.gms.NetLocator;
-import com.gemstone.gemfire.distributed.internal.tcpserver.TcpHandler;
-import com.gemstone.gemfire.distributed.internal.tcpserver.TcpServer;
-import com.gemstone.gemfire.internal.AvailablePortHelper;
-import com.gemstone.gemfire.internal.SocketCreator;
-import com.gemstone.gemfire.internal.admin.remote.RemoteTransportConfig;
 import com.gemstone.gemfire.internal.logging.LogService;
-import com.gemstone.gemfire.internal.tcp.Stub;
 import com.gemstone.gemfire.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
 public class MembershipJUnitTest extends TestCase {
-
+  Level baseLogLevel;
+  
   public MembershipJUnitTest(String name) {
     super(name);
   }
 
+  @Before
   protected void setUp() throws Exception {
+    baseLogLevel = LogService.getBaseLogLevel();
+//    LogService.setBaseLogLevel(Level.DEBUG);
     super.setUp();
   }
 
+  @After
   protected void tearDown() throws Exception {
+//    LogService.setBaseLogLevel(baseLogLevel);
     super.tearDown();
   }
   
   /**
-   * This test creates a locator with a colocated
-   * membership manager and then creates a second
-   * manager that joins the system of the first.
-   * 
-   * It then makes assertions about the state of
-   * the membership view, closes one of the managers
-   * and makes more assertions.
-   */
-  @Test
-  public void testJoinLeave() throws Exception {
-    
-    MembershipManager m1=null, m2=null;
-    Locator l = null;
-    
-    try {
-      LogService.initialize();
-      
-      MemberAttributes.setDefaults(MemberAttributes.DEFAULT.getPort(),
-          MemberAttributes.DEFAULT.getVmPid(),
-          DistributionManager.NORMAL_DM_TYPE,
-          MemberAttributes.DEFAULT.getVmViewId(),
-          MemberAttributes.DEFAULT.getName(),
-          MemberAttributes.DEFAULT.getGroups(), MemberAttributes.DEFAULT.getDurableClientAttributes());
-      
-      // boot up a locator
-      int port = AvailablePortHelper.getRandomAvailableTCPPort();
-      InetAddress localHost = SocketCreator.getLocalHost();
-      l = Locator.startLocator(port, new File("testJoinLeave.dat"), localHost);
-
-      // create configuration objects
-      Properties nonDefault = new Properties();
-      nonDefault.put(DistributionConfig.DISABLE_TCP_NAME, "true");
-      nonDefault.put(DistributionConfig.MCAST_PORT_NAME, "0");
-      nonDefault.put(DistributionConfig.LOG_FILE_NAME, "");
-      nonDefault.put(DistributionConfig.LOG_LEVEL_NAME, "fine");
-      nonDefault.put(DistributionConfig.LOCATORS_NAME, localHost.getHostName()+'['+port+']');
-      DistributionConfigImpl config = new DistributionConfigImpl(nonDefault);
-      RemoteTransportConfig transport = new RemoteTransportConfig(config);
-
-      // start the first membership manager
-      MembershipListener listener1 = new MembershipListener();
-      DMStats stats1 = new MyStats();
-      m1 = MemberFactory.newMembershipManager(listener1, config, transport, stats1);
-
-      // start the second membership manager
-      MembershipListener listener2 = new MembershipListener();
-      DMStats stats2 = new MyStats();
-      m2 = MemberFactory.newMembershipManager(listener2, config, transport, stats2);
-      
-      assert m2.getView().size() == 2;
-      assert m1.getView().size() == 2;
-      assert m1.getView().getViewId() == m2.getView().getViewId();
-      
-      m2.shutdown();
-      assert !m2.isConnected();
-      
-      assert m1.getView().size() == 1;
-    }
-    finally {
-      if (m2 != null) {
-        m2.shutdown();
-      }
-      if (m1 != null) {
-        m1.shutdown();
-      }
-      if (l != null) {
-        l.stop();
-      }
-    }
-    
-  }
-  
-  /**
    * Test that failed weight calculations are correctly performed.  See bug #47342
    * @throws Exception
    */
-  public void _testFailedWeight() throws Exception {
-//    // in #47342 a new view was created that contained a member that was joining but
-//    // was no longer reachable.  The member was included in the failed-weight and not
-//    // in the previous view-weight, causing a spurious network partition to be declared
-//    IpAddress members[] = new IpAddress[] {
-//        new IpAddress("localhost", 1), new IpAddress("localhost", 2), new IpAddress("localhost", 3),
-//        new IpAddress("localhost", 4), new IpAddress("localhost", 5), new IpAddress("localhost", 6)};
-//    int i = 0;
-//    // weight 3
-//    members[i].setVmKind(DistributionManager.LOCATOR_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(false);
-//    // weight 3
-//    members[i].setVmKind(DistributionManager.LOCATOR_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(false);
-//    // weight 15 (cache+leader)
-//    members[i].setVmKind(DistributionManager.NORMAL_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(true);
-//    // weight 0
-//    members[i].setVmKind(DistributionManager.ADMIN_ONLY_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(true);
-//    // weight 0
-//    members[i].setVmKind(DistributionManager.ADMIN_ONLY_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(true);
-//    // weight 10
-//    members[i].setVmKind(DistributionManager.NORMAL_DM_TYPE);
-//    members[i++].shouldntBeCoordinator(true);
-//    
-//    ViewId vid = new ViewId(members[0], 4);
-//    Vector<IpAddress> vmbrs = new Vector<IpAddress>();
-//    for (i=0; i<members.length; i++) {
-//      vmbrs.add(members[i]);
-//    }
-//    View lastView = new View(vid, vmbrs);
-//    IpAddress leader = members[2];
-//    assertTrue(!leader.preferredForCoordinator());
-//    
-//    IpAddress joiningMember = new IpAddress("localhost", 7);
-//    joiningMember.setVmKind(DistributionManager.NORMAL_DM_TYPE);
-//    joiningMember.shouldntBeCoordinator(true);
-//    
-//    // have the joining member and another cache process (weight 10) in the failed members
-//    // collection and check to make sure that the joining member is not included in failed
-//    // weight calcs.
-//    Set<IpAddress> failedMembers = new HashSet<IpAddress>();
-//    failedMembers.add(joiningMember);
-//    failedMembers.add(members[members.length-1]); // cache
-//    failedMembers.add(members[members.length-2]); // admin
-//    int failedWeight = GMS.processFailuresAndGetWeight(lastView, leader, failedMembers);
-////    System.out.println("last view = " + lastView);
-////    System.out.println("failed mbrs = " + failedMembers);
-////    System.out.println("failed weight = " + failedWeight);
-//    assertEquals("failure weight calculation is incorrect", 10, failedWeight);
-//    assertTrue(!failedMembers.contains(members[members.length-2]));
-  }
-  
-  static class MembershipListener implements DistributedMembershipListener {
-
-    @Override
-    public void viewInstalled(NetView view) {
-    }
-
-    @Override
-    public void quorumLost(Set<InternalDistributedMember> failures,
-        List<InternalDistributedMember> remainingMembers) {
-    }
-
-    @Override
-    public void newMemberConnected(InternalDistributedMember m, Stub stub) {
-    }
-
-    @Override
-    public void memberDeparted(InternalDistributedMember id, boolean crashed,
-        String reason) {
-    }
-
-    @Override
-    public void memberSuspect(InternalDistributedMember suspect,
-        InternalDistributedMember whoSuspected) {
-    }
-
-    @Override
-    public void messageReceived(DistributionMessage o) {
-    }
-
-    @Override
-    public boolean isShutdownMsgSent() {
-      return false;
-    }
-
-    @Override
-    public void membershipFailure(String reason, Throwable t) {
-    }
-
-    @Override
-    public DistributionManager getDM() {
-      return null;
+  public void testFailedWeight() throws Exception {
+    // in #47342 a new view was created that contained a member that was joining but
+    // was no longer reachable.  The member was included in the failed-weight and not
+    // in the previous view-weight, causing a spurious network partition to be declared
+    InternalDistributedMember members[] = new InternalDistributedMember[] {
+        new InternalDistributedMember("localhost", 1), new InternalDistributedMember("localhost", 2), new InternalDistributedMember("localhost", 3),
+        new InternalDistributedMember("localhost", 4), new InternalDistributedMember("localhost", 5), new InternalDistributedMember("localhost", 6)};
+    int i = 0;
+    // weight 3
+    members[i].setVmKind(DistributionManager.LOCATOR_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(true);
+    // weight 3
+    members[i].setVmKind(DistributionManager.LOCATOR_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(true);
+    // weight 15 (cache+leader)
+    members[i].setVmKind(DistributionManager.NORMAL_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(false);
+    // weight 0
+    members[i].setVmKind(DistributionManager.ADMIN_ONLY_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(false);
+    // weight 0
+    members[i].setVmKind(DistributionManager.ADMIN_ONLY_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(false);
+    // weight 10
+    members[i].setVmKind(DistributionManager.NORMAL_DM_TYPE);
+    members[i++].getNetMember().setPreferredForCoordinator(false);
+    
+    List<InternalDistributedMember> vmbrs = new ArrayList(members.length);
+    for (i=0; i<members.length; i++) {
+      vmbrs.add(members[i]);
     }
+    NetView lastView = new NetView(members[0], 4, vmbrs, Collections.EMPTY_LIST, Collections.EMPTY_LIST);
+    InternalDistributedMember leader = members[2];
+    assertTrue(!leader.getNetMember().preferredForCoordinator());
     
-  }
-  
-  static class MyStats extends DummyDMStats {
+    InternalDistributedMember joiningMember = new InternalDistributedMember("localhost", 7);
+    joiningMember.setVmKind(DistributionManager.NORMAL_DM_TYPE);
+    joiningMember.getNetMember().setPreferredForCoordinator(false);
     
-  }
-
-  public static class DummyPoolStatHelper implements PoolStatHelper {
-    public void startJob() {}
-    public void endJob(){}
+    // have the joining member and another cache process (weight 10) in the failed members
+    // collection and check to make sure that the joining member is not included in failed
+    // weight calcs.
+    List<InternalDistributedMember> failedMembers = new ArrayList<InternalDistributedMember>(3);
+    failedMembers.add(joiningMember);
+    failedMembers.add(members[members.length-1]); // cache
+    failedMembers.add(members[members.length-2]); // admin
+    List<InternalDistributedMember> newMbrs = new ArrayList<InternalDistributedMember>(lastView.getMembers());
+    newMbrs.removeAll(failedMembers);
+    NetView newView = new NetView(members[0], 5, newMbrs, Collections.EMPTY_LIST, failedMembers);
+    
+    int failedWeight = newView.getCrashedMemberWeight(lastView);
+//    System.out.println("last view = " + lastView);
+//    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);
+    assertTrue(!actual.contains(members[members.length-2]));
   }
   
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt b/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt
index 4dd927d..eda7776 100644
--- a/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt
+++ b/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt
@@ -2311,34 +2311,6 @@ com/gemstone/gemfire/pdx/internal/PdxType,2
 fromData,105,2a2bb80015b5000c2bb9001601003d2a1c047e99000704a7000403b5000d2a1c057e99000704a7000403b500172a2bb900180100b5000e2a2bb900180100b5000f2bb800193d033e1d1ca2001ebb001359b7001a3a0419042bb6001b2a1904b60014840301a7ffe3b1
 toData,124,2ab4000c2bb8001c033d2ab4000d9900081c0480913d2bb8001d4e2db2001eb6001f9b000f2ab400179900081c0580913d2b1cb9002002002b2ab4000eb9002102002b2ab4000fb9002102002ab40005b600222bb80023033d1c2ab40005b60022a2001a2ab400051cb60024c000134e2d2bb60025840201a7ffe1b1
 
-com/gemstone/org/jgroups/View,2
-fromData,116,2bb9005101003d1c99001b2abb000459b70052b50002b800442ab400022bb9004a03002ab800442bb900530200c00025b500032bb9005101009900132ab800442bb900530200c00041b500092ab800442bb900530200c00054b500482a2bb900550100b500172ab800442bb900530200b50010b1
-toData,124,2ab40002c6001a2b04b900460200b800442ab400022bb900450300a7000a2b03b900460200b800442ab400032bb9004703002ab40009c7000d2b03b900460200a700172b04b900460200b800442ab400092bb900470300b800442ab400482bb9004703002b2ab40017b900490200b800442ab400102bb900470300b1
-
-com/gemstone/org/jgroups/ViewId,2
-fromData,27,2ab800182bb900220200c00016b500022a2bb900230100b50003b1
-toData,24,b800182ab400022bb9001a03002b2ab40003b9001b0300b1
-
-com/gemstone/org/jgroups/protocols/pbcast/Digest,2
-fromData,80,2bb9004e01003d2a2a1cb70003b5000203360415041ca20039b800462bb9004f0200c000224e2bb90050010037052bb90050010037072bb90050010037092a2d160516071609b60009840401a7ffc7b1
-toData,120,2b2ab40002b9002e0100b9004502002ab40002b9001c0100b9001d01003a051905b9001e01009900511905b9001f0100c000204d2cb900210100c000224e2cb900230100c0000a3a04b800462d2bb9004703002b1904b40024b9004803002b1904b40025b9004803002b1904b40026b900480300a7ffabb1
-
-com/gemstone/org/jgroups/protocols/pbcast/JoinRsp,2
-fromData,46,2ab800052bb9000f0200c00010b500022ab800052bb9000f0200c00011b500032ab800052bb900120200b50004b1
-toData,40,b800052ab400022bb900070300b800052ab400032bb900070300b800052ab400042bb900080300b1
-
-com/gemstone/org/jgroups/stack/GossipData,4
-fromData,136,2a2bb9002d0100b500022ab4000207a000102a2bb9002e0100b50006a7006b2a2bb9002f0100b500032ab8002a2bb900300200c00031b500042ab8002a2bb900300200c00032b500052a2bb900330100b500072a2bb900330100b500082a2bb900330100b500092ab8002a2bb900300200c00034b5000a2ab8002a2bb900300200c00031b5000bb1
-fromDataPre_GFE_8_0_0_0,104,2a2bb9002d0100b500022ab4000207a000102a2bb9002e0100b50006a7004b2a2bb9002f0100b500032ab8002a2bb900300200c00031b500042ab8002a2bb900300200c00032b500052a2bb900330100b500072a2bb900330100b500082a2bb900330100b50009b1
-toData,136,2b2ab40002b9002602002ab4000207a000102b2ab40006b900270200a7006b2b2ab40003c700081228a700072ab40003b900290200b8002a2ab400042bb9002b0300b8002a2ab400052bb9002b03002b2ab40007b9002c02002b2ab40008b9002c02002b2ab40009b9002c0200b8002a2ab4000a2bb9002b0300b8002a2ab4000b2bb9002b0300b1
-toDataPre_GFE_8_0_0_0,110,2b2ab40002b9002602002ab4000207a000102b2ab40006b900270200a700512b2ab40003c700081228a700072ab40003b900290200b8002a2ab400042bb9002b0300b8002a2ab400052bb9002b03002b2ab40007b9002c02002b2ab40008b9002c02002b2ab40009b9002c0200b1
-
-com/gemstone/org/jgroups/stack/IpAddress,4
-fromData,221,2bb9007f01003d1c9e00161cbc084e2b2db9008002002a2db8006cb5001e2a2bb900810100b5001f2a2bb900820100b500052a2bb900820100b500062a2bb900830100b5003e2a2bb900820100b500232a2bb900840100b500072bb9008201003d1c9e00682a1cbc08b500092b2ab40009032ab40009beb9008504002ab6007c4e2dbe04643604150436052dbe9e003d2d150432127eb600869900312d150432127eb60033b600873a062a1906b80088b500041505bd00143a072d031907031505b8007d2a1907b600892bb9007f01003e2a1db600722a1d2bb60073b1
-fromDataShort,37,2bb9007f01003d1cbc084e2b2db9008002002a2db8006cb5001e2a2bb900810100b5001fb1
-toData,296,2ab4001ec600202ab4001eb600474d2b2cbeb9007702002b2c032cbeb900780400a7000a2b03b9007702002b2ab4001fb9007902002b2ab40005b9007a02002b2ab40006b9007a02002b2ab4003eb9007702002b2ab40023b9007a02002b2ab60066b9007b02002ab400049e007d2ab6007c3a041904be0460bd00144e1904be9e000e1904032d031904beb8007d2d2dbe0464bb002759b70028127eb6002a2ab40004b60057b6002d53bb001659b700173a05bb0018591905b700193a06b8000e2d1906b9001a03001905b6001b3a072b1907beb9007a02002b1907031907beb900780400a7002f2ab40009c600212b2ab40009beb9007a02002b2ab40009032ab40009beb900780400a7000a2b03b9007a02002b2ab60068b9007702002b2ab4002204b80069b1
-toDataShort,57,2ab4008ac6000b2ab4008a4da700102ab4001eb600474d2a2cb5008a2b2cbeb9007702002b2c032cbeb9007804002b2ab4001fb900790200b1
-
 com/gemstone/gemfire/internal/admin/remote/ShutdownAllGatewayHubsRequest,2
 fromData,16,2a2bb700052a2bb900060100b50003b1
 toData,16,2a2bb700072b2ab40003b900080200b1

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt b/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
index f272e4a..1272bb7 100644
--- a/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
+++ b/gemfire-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
@@ -858,114 +858,3 @@ com/gemstone/java/util/concurrent/SynchronousQueueNoSpin$LifoWaitQueue,true,-363
 com/gemstone/java/util/concurrent/SynchronousQueueNoSpin$WaitQueue,true,423369940180943459
 com/gemstone/org/apache/logging/log4j/message/GemFireParameterizedMessage,true,-665975803997290697,messagePattern:java/lang/String,stringArgs:java/lang/String[]
 com/gemstone/org/apache/logging/log4j/message/GemFireParameterizedMessageFactory,true,1
-com/gemstone/org/jgroups/ChannelClosedException,true,3183749334840801913
-com/gemstone/org/jgroups/ChannelException,true,-6809241131485085619
-com/gemstone/org/jgroups/ChannelNotConnectedException,true,-1556386890787640150
-com/gemstone/org/jgroups/Header,false
-com/gemstone/org/jgroups/Message,true,-1137364035832847034,buf:byte[],dest_addr:com/gemstone/org/jgroups/Address,headers:java/util/Map,isCacheOperation:boolean,isHighPriority:boolean,src_addr:com/gemstone/org/jgroups/Address,version:short
-com/gemstone/org/jgroups/ShunnedAddressException,true,6638258566493306758
-com/gemstone/org/jgroups/SuspectedException,true,-7362834003171175180,suspect:java/lang/Object
-com/gemstone/org/jgroups/TimeoutException,true,4078270477623063306,failed_mbrs:java/util/List
-com/gemstone/org/jgroups/ViewId,false,coord_addr:com/gemstone/org/jgroups/Address,id:long
-com/gemstone/org/jgroups/blocks/DistributedHashtable,true,-1438997064696285344
-com/gemstone/org/jgroups/blocks/DistributedLockManager$AcquireLockDecree,true,7608853900623293300,creationTime:long
-com/gemstone/org/jgroups/blocks/DistributedLockManager$LockDecree,true,-7422058144576778340,commited:boolean,lockId:java/lang/Object,managerId:java/lang/Object,multipleLocked:boolean,requester:java/lang/Object
-com/gemstone/org/jgroups/blocks/DistributedLockManager$MultiLockDecree,true,-8775726661815938941
-com/gemstone/org/jgroups/blocks/DistributedLockManager$ReleaseLockDecree,true,-159320406385342426
-com/gemstone/org/jgroups/blocks/DistributedTree$Node,true,2751686100384721286,children:java/util/Vector,element:java/io/Serializable,name:java/lang/String
-com/gemstone/org/jgroups/blocks/LockMultiLockedException,true,131820252305444362
-com/gemstone/org/jgroups/blocks/LockNotGrantedException,true,2196485072005850175
-com/gemstone/org/jgroups/blocks/LockNotReleasedException,true,-9174045093160454258
-com/gemstone/org/jgroups/blocks/LockingException,true,591671983577853564,failed_lockers:java/util/Map
-com/gemstone/org/jgroups/blocks/LogicalLink$AllLinksDown,true,-2294651737997827005
-com/gemstone/org/jgroups/blocks/LogicalLink$NoLinksAvailable,true,-4180512062659195788
-com/gemstone/org/jgroups/blocks/MethodCall,true,7873471327078957662,args:java/lang/Object[],method:java/lang/reflect/Method,method_id:short,method_name:java/lang/String,mode:short,payload:java/util/Map,signature:java/lang/String[],types:java/lang/Class[]
-com/gemstone/org/jgroups/blocks/NotificationBus$Info,true,-2247826108262348005,data:java/io/Serializable,type:int
-com/gemstone/org/jgroups/blocks/PullPushAdapter$PullHeader,false,identifier:java/io/Serializable
-com/gemstone/org/jgroups/blocks/ReplicatedHashtable,true,-892359995977718412
-com/gemstone/org/jgroups/blocks/ReplicatedHashtable$Request,true,6677272580533789582,key:java/lang/Object,req_type:int,val:java/lang/Object
-com/gemstone/org/jgroups/blocks/ReplicatedTree$Node,true,-6687893970420949516,children:java/util/TreeMap,data:java/util/HashMap,fqn:java/lang/String,name:java/lang/String,parent:com/gemstone/org/jgroups/blocks/ReplicatedTree$Node
-com/gemstone/org/jgroups/blocks/ReplicatedTree$Request,true,6700917610434765172,data:java/util/HashMap,fqn:java/lang/String,key:java/lang/String,type:int,value:java/lang/Object
-com/gemstone/org/jgroups/blocks/ReplicationData,false,data:byte[],lock_acquisition_timeout:long,lock_info:byte[],lock_lease_timeout:long,transaction:com/gemstone/org/jgroups/blocks/Xid,type:int,use_locks:boolean
-com/gemstone/org/jgroups/blocks/RequestCorrelator$Header,false,callStack:java/util/Stack,corrName:java/lang/String,dest_mbrs:java/util/List,id:long,rsp_expected:boolean,type:byte
-com/gemstone/org/jgroups/blocks/TwoPhaseVotingAdapter$TwoPhaseWrapper,true,413742420131273083,decree:java/lang/Object,type:int
-com/gemstone/org/jgroups/blocks/UpdateException,true,-4828148927982066195
-com/gemstone/org/jgroups/blocks/VoteException,true,-741925330540432706
-com/gemstone/org/jgroups/blocks/VotingAdapter$FailureVoteResult,true,8564568061818236474,reason:java/lang/String
-com/gemstone/org/jgroups/blocks/VotingAdapter$VoteResult,true,-3819484546640579697,negativeVotes:int,positiveVotes:int
-com/gemstone/org/jgroups/blocks/Xid,false,creator:com/gemstone/org/jgroups/Address,id:long,mode:int
-com/gemstone/org/jgroups/debug/Debugger,true,1264635453541531112,b1:javax/swing/JButton,b2:javax/swing/JButton,button_panel:javax/swing/JPanel,channel:com/gemstone/org/jgroups/JChannel,cummulative:boolean,prots:java/util/Vector,scroll_pane:javax/swing/JScrollPane,table:javax/swing/JTable,table_model:javax/swing/table/DefaultTableModel
-com/gemstone/org/jgroups/debug/ProtocolSpecificView,false
-com/gemstone/org/jgroups/debug/QUEUEView,true,1962110363758525507
-com/gemstone/org/jgroups/oswego/concurrent/BrokenBarrierException,true,-6430027725612057293,index:int
-com/gemstone/org/jgroups/oswego/concurrent/PropertyChangeMulticaster,true,3115925028370351924,children:java/util/HashMap,source:java/lang/Object
-com/gemstone/org/jgroups/oswego/concurrent/TimeoutException,true,-123312260478918288,duration:long
-com/gemstone/org/jgroups/oswego/concurrent/VetoableChangeMulticaster,true,7647606497666380264,children:java/util/HashMap,source:java/lang/Object
-com/gemstone/org/jgroups/persistence/CannotConnectException,true,-4938856570415903498,reason:java/lang/String,t:java/lang/Throwable
-com/gemstone/org/jgroups/persistence/CannotCreateSchemaException,true,932964652498346597,reason:java/lang/String,t:java/lang/Throwable
-com/gemstone/org/jgroups/persistence/CannotPersistException,true,-5346794365646061026,reason:java/lang/String,t:java/lang/Throwable
-com/gemstone/org/jgroups/persistence/CannotRemoveException,true,-11649062965054429,reason:java/lang/String,t:java/lang/Throwable
-com/gemstone/org/jgroups/persistence/CannotRetrieveException,true,-3825072530525191050,reason:java/lang/String,t:java/lang/Throwable
-com/gemstone/org/jgroups/protocols/AuthHeader,true,1,credentials:byte[]
-com/gemstone/org/jgroups/protocols/CAUSAL$CausalHeader,false,t:com/gemstone/org/jgroups/protocols/TransportedVectorTime
-com/gemstone/org/jgroups/protocols/COMPRESS$CompressHeader,false,original_size:int
-com/gemstone/org/jgroups/protocols/Digest,true,-1750370226005341630,highest_seqnos:long[],msgs:com/gemstone/org/jgroups/util/List
-com/gemstone/org/jgroups/protocols/ENCRYPT$EncryptHeader,false,type:short,version:java/lang/String
-com/gemstone/org/jgroups/protocols/ENCRYPT1_4$EncryptHeader,false,type:int
-com/gemstone/org/jgroups/protocols/ExampleHeader,true,-8802317525466899597
-com/gemstone/org/jgroups/protocols/FC$FcHeader,false,balance:long,type:byte
-com/gemstone/org/jgroups/protocols/FD$FdHeader,false,from:com/gemstone/org/jgroups/Address,mbrs:java/util/Vector,type:byte
-com/gemstone/org/jgroups/protocols/FD_PID$FdHeader,false,mbr:com/gemstone/org/jgroups/Address,pid:int,pids:java/util/Hashtable,type:int
-com/gemstone/org/jgroups/protocols/FD_PROB$FdHeader,false,counters:long[],members:com/gemstone/org/jgroups/Address[],type:int
-com/gemstone/org/jgroups/protocols/FD_SIMPLE$FdHeader,false,type:int
-com/gemstone/org/jgroups/protocols/FD_SOCK$FdHeader,false,abnormalTermination:boolean,cachedAddrs:java/util/Hashtable,mbr:com/gemstone/org/jgroups/Address,mbrs:java/util/Vector,sock_addr:com/gemstone/org/jgroups/stack/IpAddress,type:byte,vid:com/gemstone/org/jgroups/ViewId
-com/gemstone/org/jgroups/protocols/FD_SOCK$ReasonHeader,false,cause:java/lang/String
-com/gemstone/org/jgroups/protocols/FLOW_CONTROL$FCInfo,true,-8365016426836017979,_curValue:int
-com/gemstone/org/jgroups/protocols/FragHeader,false,frag_id:int,id:long,num_frags:int,viewId:long
-com/gemstone/org/jgroups/protocols/GemFireTimeSync$GFTimeSyncHeader,false,coordTimeAfterJoin:long,coordTimeBeforeJoin:long,opType:byte,procID:long,time:long
-com/gemstone/org/jgroups/protocols/HTOTAL$HTotalHeader,false,dest:com/gemstone/org/jgroups/Address,src:com/gemstone/org/jgroups/Address
-com/gemstone/org/jgroups/protocols/MERGE$MergeHeader,false,type:int
-com/gemstone/org/jgroups/protocols/MERGE3$CoordAnnouncement,false,coord_addr:com/gemstone/org/jgroups/Address
-com/gemstone/org/jgroups/protocols/MERGEFAST$MergefastHeader,false,coord:com/gemstone/org/jgroups/Address
-com/gemstone/org/jgroups/protocols/MyFrame,true,-5091554906224946278,button_panel:java/awt/Panel,deadlock:com/gemstone/org/jgroups/protocols/DEADLOCK,list:java/awt/List,main_panel:java/awt/Panel,members:java/util/Vector,quit:java/awt/Button,result:java/awt/Label,send:java/awt/Button
-com/gemstone/org/jgroups/protocols/NakAckHeader,false,last_seqno:long,sender:com/gemstone/org/jgroups/Address,seqno:long,stable_msgs:java/util/Vector,type:int,vid:com/gemstone/org/jgroups/ViewId
-com/gemstone/org/jgroups/protocols/PARTITIONER$PartitionerHeader,false,Destinations:java/util/Hashtable,partition:int,type:int
-com/gemstone/org/jgroups/protocols/PIGGYBACK$PiggybackHeader,false
-com/gemstone/org/jgroups/protocols/PerfEntry,false,done:long,received:long,total:long
-com/gemstone/org/jgroups/protocols/PerfHeader,false,down:java/util/HashMap,end_time:long,network_recv:long,network_send:long,network_time:long,receiver:java/lang/Object,sender:java/lang/Object,start_time:long,up:java/util/HashMap
-com/gemstone/org/jgroups/protocols/PingHeader,false,arg:com/gemstone/org/jgroups/protocols/PingRsp,type:byte
-com/gemstone/org/jgroups/protocols/PingRsp,true,3634334590904551586,coord_addr:com/gemstone/org/jgroups/Address,is_server:boolean,own_addr:com/gemstone/org/jgroups/Address
-com/gemstone/org/jgroups/protocols/SMACK$SmackHeader,false,seqno:long,type:int
-com/gemstone/org/jgroups/protocols/StateTransferRequest,true,-7734608266762273116,arg:java/lang/Object,type:int
-com/gemstone/org/jgroups/protocols/TOTAL$Header,false,localSequenceID:long,sequenceID:long,type:int
-com/gemstone/org/jgroups/protocols/TcpHeader,false,group_addr:java/lang/String
-com/gemstone/org/jgroups/protocols/TpHeader,false,channel_name:java/lang/String,size:int
-com/gemstone/org/jgroups/protocols/TransportedVectorTime,true,5857647322589533545,senderPosition:int,values:int[]
-com/gemstone/org/jgroups/protocols/TunnelHeader,false,channel_name:java/lang/String
-com/gemstone/org/jgroups/protocols/UNICAST$UnicastHeader,false,seqno:long,type:byte
-com/gemstone/org/jgroups/protocols/UdpHeader,false,channel_name:java/lang/String,size:int
-com/gemstone/org/jgroups/protocols/VERIFY_SUSPECT$VerifyHeader,false,from:com/gemstone/org/jgroups/Address,type:short
-com/gemstone/org/jgroups/protocols/VIEW_SYNC$ViewSyncHeader,false,type:int
-com/gemstone/org/jgroups/protocols/WANPIPE$WanPipeHeader,false,group_addr:java/lang/String
-com/gemstone/org/jgroups/protocols/WanPipeAddress,false,logical_name:java/lang/String
-com/gemstone/org/jgroups/protocols/pbcast/Digest,false,senders:java/util/Map
-com/gemstone/org/jgroups/protocols/pbcast/GMS$GmsHeader,false,arg:java/lang/String,forcedOut:boolean,mbr:com/gemstone/org/jgroups/Address,merge_id:com/gemstone/org/jgroups/ViewId,merge_rejected:boolean,type:byte
-com/gemstone/org/jgroups/protocols/pbcast/Gossip,true,7954243278668401185,digest:com/gemstone/org/jgroups/protocols/pbcast/Digest,id:long,not_seen:java/util/Vector,seen:java/util/Vector,sender:com/gemstone/org/jgroups/Address
-com/gemstone/org/jgroups/protocols/pbcast/MergeData,false,digest:com/gemstone/org/jgroups/protocols/pbcast/Digest,merge_rejected:boolean,sender:com/gemstone/org/jgroups/Address,view:com/gemstone/org/jgroups/View
-com/gemstone/org/jgroups/protocols/pbcast/NAKACK$RetransmissionTooLargeException,false
-com/gemstone/org/jgroups/protocols/pbcast/NakAckHeader,false,range:com/gemstone/org/jgroups/util/Range,sender:com/gemstone/org/jgroups/Address,seqno:long,type:byte
-com/gemstone/org/jgroups/protocols/pbcast/PbcastHeader,false,gossip:com/gemstone/org/jgroups/protocols/pbcast/Gossip,seqno:long,type:int,xmit_reqs:java/util/Hashtable
-com/gemstone/org/jgroups/protocols/pbcast/STABLE$StableHeader,false,stableDigest:com/gemstone/org/jgroups/protocols/pbcast/Digest,type:int
-com/gemstone/org/jgroups/protocols/pbcast/STATE_TRANSFER$StateHeader,false,id:long,my_digest:com/gemstone/org/jgroups/protocols/pbcast/Digest,sender:com/gemstone/org/jgroups/Address,type:byte
-com/gemstone/org/jgroups/protocols/ring/RingToken,false,aru:long,aruId:com/gemstone/org/jgroups/Address,backlog:int,fcc:int,recoveredMembers:java/util/Collection,retransmissionRequests:java/util/Collection,seq:long,tokenSeq:long,type:int,windowSize:int,windowThreshold:int
-com/gemstone/org/jgroups/protocols/ring/TokenLostException,true,-7870593672874341816,cause:java/lang/Throwable,failedNode:com/gemstone/org/jgroups/Address,mode:int
-com/gemstone/org/jgroups/stack/BoundedLinkedHashMap,true,-3419897166186852692,_maximumNumberOfEntries:int
-com/gemstone/org/jgroups/stack/GossipServer$EntryList,true,-3718320921705914128
-com/gemstone/org/jgroups/stack/LogicalAddress,false,additional_data:byte[],host:java/lang/String,id:int,multicast_addr:boolean,physical_addrs:java/util/ArrayList,timestamp:long
-com/gemstone/org/jgroups/util/BoundedList,false,max_capacity:int
-com/gemstone/org/jgroups/util/List,false,head:com/gemstone/org/jgroups/util/List$Element,size:int,tail:com/gemstone/org/jgroups/util/List$Element
-com/gemstone/org/jgroups/util/Proxy$MyInetSocketAddress,true,-2564520028821259228,is_ssl:boolean
-com/gemstone/org/jgroups/util/QueueClosedException,true,-5118272971200348252
-com/gemstone/org/jgroups/util/Range,false,high:long,low:long
-com/gemstone/org/jgroups/util/Stack,false
-com/gemstone/org/jgroups/util/TimedWriter$Timeout,true,-7263515891440595522


[2/2] incubator-geode git commit: Enabling creation of stand-alone GMSLocator & adding 2-phase view casting

Posted by bs...@apache.org.
Enabling creation of stand-alone GMSLocator & adding 2-phase view casting

The locator work will let us unit-test this component while the
view-casting work is in preparation for the health-monitor impl that is
coming soon & will allow us to start testing HA features.


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

Branch: refs/heads/feature/GEODE-77
Commit: e71780aea47cded85a98a9eb07a864e77444ff99
Parents: 04cc2d9
Author: Bruce Schuchardt <bs...@pivotal.io>
Authored: Wed Jul 29 16:50:57 2015 -0700
Committer: Bruce Schuchardt <bs...@pivotal.io>
Committed: Wed Aug 5 15:02:26 2015 -0700

----------------------------------------------------------------------
 .../cache/util/BoundedLinkedHashMap.java        |   1 -
 .../internal/InternalDistributedSystem.java     |   4 +-
 .../membership/InternalDistributedMember.java   |  21 +-
 .../internal/membership/NetMember.java          |  38 +-
 .../internal/membership/NetView.java            | 110 +++++
 .../internal/membership/gms/GMSMember.java      |  60 ++-
 .../membership/gms/GMSMemberFactory.java        |  13 +-
 .../membership/gms/GMSMemberServices.java       | 260 ------------
 .../internal/membership/gms/GMSUtil.java        |   2 +-
 .../internal/membership/gms/Services.java       | 260 ++++++++++++
 .../membership/gms/auth/GMSAuthenticator.java   |   4 +-
 .../membership/gms/fd/GMSHealthMonitor.java     |  19 +-
 .../gms/interfaces/HealthMonitor.java           |  24 +-
 .../membership/gms/interfaces/Manager.java      |   4 +
 .../membership/gms/interfaces/Service.java      |   4 +-
 .../membership/gms/locator/GMSLocator.java      |  18 +-
 .../membership/gms/membership/GMSJoinLeave.java | 418 +++++++++++++++----
 .../membership/gms/messages/ViewAckMessage.java |  21 +-
 .../gms/messenger/AddressManager.java           |   5 +-
 .../membership/gms/messenger/JGAddress.java     |  17 +
 .../gms/messenger/JGroupsMessenger.java         |  69 +--
 .../gms/mgr/GMSMembershipManager.java           |  28 +-
 .../internal/tcpserver/TcpClient.java           |   2 +
 .../gemfire/internal/i18n/LocalizedStrings.java |   4 +
 .../gemfire/internal/logging/LogService.java    |   8 +-
 .../internal/logging/log4j/log4j2-default.xml   |   2 +-
 .../AnalyzeSerializablesJUnitTest.java          |  31 --
 .../membership/MembershipJUnitTest.java         | 268 +++---------
 .../sanctionedDataSerializables.txt             |  28 --
 .../codeAnalysis/sanctionedSerializables.txt    | 111 -----
 30 files changed, 980 insertions(+), 874 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/cache/util/BoundedLinkedHashMap.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/util/BoundedLinkedHashMap.java b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/util/BoundedLinkedHashMap.java
index 5397381..1abf24f 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/util/BoundedLinkedHashMap.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/util/BoundedLinkedHashMap.java
@@ -18,7 +18,6 @@ import java.util.Map;
  *
  * @since 4.2
  */
-@Deprecated
 public class BoundedLinkedHashMap extends LinkedHashMap
 {
   private static final long serialVersionUID = -3419897166186852692L;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java
index 58e8884..52ee2d0 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java
@@ -55,7 +55,7 @@ import com.gemstone.gemfire.distributed.internal.locks.GrantorRequestProcessor;
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.MembershipManager;
 import com.gemstone.gemfire.distributed.internal.membership.QuorumChecker;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.mgr.GMSMembershipManager;
 import com.gemstone.gemfire.i18n.LogWriterI18n;
 import com.gemstone.gemfire.internal.Assert;
@@ -561,7 +561,7 @@ public final class InternalDistributedSystem
       this.securityLogWriter.fine("SecurityLogWriter is created.");
     }
     
-    GMSMemberServices.setSecurityLogWriter(this.securityLogWriter);
+    Services.setSecurityLogWriter(this.securityLogWriter);
 
     this.clock = new DSClock(this.isLoner);
     

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 dd9d6f3..d19a23b 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
@@ -60,6 +60,9 @@ public final class InternalDistributedMember
 {
   private final static long serialVersionUID = -2785249969777296507L;
   
+  // whether to show NetMember components in toString()
+  private final boolean SHOW_NETMEMBER = Boolean.getBoolean("gemfire.show_netmembers");
+  
   protected NetMember netMbr; // the underlying member object, e.g. from JGroups
 
   /**
@@ -719,12 +722,6 @@ public final class InternalDistributedMember
           break;
         }
         sb.append(vmStr);
-        // for split-brain and security debugging we need to know if the
-        // member has the "can't be coordinator" bit set
-//        GMSMember jgm = (GMSMember)ipAddr;
-//        if (!jgm.getAddress().canBeCoordinator()) {
-//          sb.append("<p>");
-//        }
         sb.append(")");
       }
       if (netMbr.splitBrainEnabled()) {
@@ -760,6 +757,10 @@ public final class InternalDistributedMember
             .append(')');
       }
 
+      if (SHOW_NETMEMBER) {
+        sb.append("[[").append(this.netMbr).append("]]");
+      }
+
       // leave out Roles on purpose
       
 //      if (netMbr instanceof GMSMember) {
@@ -1075,6 +1076,10 @@ public final class InternalDistributedMember
          InternalDataSerializer.getVersionForDataStream(in).ordinal(), attr);
 
      synchPayload();
+
+     if (InternalDataSerializer.getVersionForDataStream(in).compareTo(Version.GFE_90)>=0) {
+       netMbr.readAdditionalData(in);
+     }
    }
 
 
@@ -1099,6 +1104,10 @@ public final class InternalDistributedMember
      }
      // write name last to fix bug 45160
      DataSerializer.writeString(this.name, out);
+
+     if (InternalDataSerializer.getVersionForDataStream(out).compareTo(Version.GFE_90)>=0) {
+       netMbr.writeAdditionalData(out);
+     }
    }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetMember.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetMember.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetMember.java
index 16d3cc5..8966e0f 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetMember.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetMember.java
@@ -22,17 +22,17 @@ import java.net.InetAddress;
 public interface NetMember
 {
 
-  public abstract void setAttributes(MemberAttributes args);
+  public void setAttributes(MemberAttributes args);
 
-  public abstract MemberAttributes getAttributes();
+  public MemberAttributes getAttributes();
 
-  public abstract InetAddress getInetAddress();
+  public InetAddress getInetAddress();
 
-  public abstract int getPort();
+  public int getPort();
   
-  public abstract void setPort(int p);
+  public void setPort(int p);
 
-  public abstract boolean isMulticastAddress();
+  public boolean isMulticastAddress();
   
   public short getVersionOrdinal();
   
@@ -40,13 +40,21 @@ public interface NetMember
    * return a flag stating whether the member has network partition detection enabled
    * @since 5.6
    */
-  public abstract boolean splitBrainEnabled();
+  public boolean splitBrainEnabled();
   
   /**
    * return a flag stating whether the member can be the membership coordinator
    * @since 5.6
    */
-  public abstract boolean preferredForCoordinator();
+  public boolean preferredForCoordinator();
+  
+  /**
+   * Set whether this member ID is preferred for coordinator.  This
+   * is mostly useful for unit tests because it does not distribute
+   * this status to other members in the distributed system. 
+   * @param preferred
+   */
+  public void setPreferredForCoordinator(boolean preferred);
   
   public byte getMemberWeight();
 
@@ -55,7 +63,7 @@ public interface NetMember
    * Excludes channel_name from comparison.
    * @return 0 for equality, value less than 0 if smaller, greater than 0 if greater.
    */
-  public abstract int compare(NetMember other);
+  public int compare(NetMember other);
 
   /**
    * implements the java.lang.Comparable interface
@@ -66,18 +74,18 @@ public interface NetMember
    * @exception java.lang.ClassCastException - if the specified object's type prevents it
    *            from being compared to this Object.
    */
-  public abstract int compareTo(Object o);
+  public int compareTo(Object o);
 
-  public abstract boolean equals(Object obj);
+  public boolean equals(Object obj);
 
-  public abstract int hashCode();
+  public int hashCode();
 
-  public abstract String toString();
+  public String toString();
   
   /** write identity information not known by DistributedMember instances */
-  public abstract void writeAdditionalData(DataOutput out) throws IOException;
+  public void writeAdditionalData(DataOutput out) throws IOException;
   
   /** read identity information not known by DistributedMember instances */
-  public abstract void readAdditionalData(DataInput in) throws ClassNotFoundException, IOException;
+  public void readAdditionalData(DataInput in) throws ClassNotFoundException, IOException;
 
  }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 e6c2b45..2a8f248 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
@@ -11,12 +11,15 @@ import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.logging.log4j.Logger;
+
 import com.gemstone.gemfire.DataSerializer;
 import com.gemstone.gemfire.distributed.internal.DistributionManager;
 import com.gemstone.gemfire.internal.DataSerializableFixedID;
@@ -196,6 +199,113 @@ public class NetView implements DataSerializableFixedID {
     return (firstNonPreferred == null  ||  firstNonPreferred.equals(who));
   }
   
+  /**
+   * returns the weight of the members in this membership view
+   */
+  public int memberWeight() {
+    int result = 0;
+    InternalDistributedMember lead = getLeadMember();
+    for (InternalDistributedMember mbr: this.members) {
+      result += mbr.getNetMember().getMemberWeight();
+      switch (mbr.getVmKind()) {
+      case DistributionManager.NORMAL_DM_TYPE:
+        result += 10;
+        if (lead != null  &&  mbr.equals(lead)) {
+          result += 5;
+        }
+        break;
+      case DistributionManager.LOCATOR_DM_TYPE:
+        result += 3;
+        break;
+      case DistributionManager.ADMIN_ONLY_DM_TYPE:
+        break;
+      default:
+        throw new IllegalStateException("Unknown member type: " + mbr.getVmKind());
+      }
+    }
+    return result;
+  }
+
+  /**
+   * returns the weight of crashed members in this membership view
+   * with respect to the given previous view
+   */
+  public int getCrashedMemberWeight(NetView oldView) {
+    int result = 0;
+    InternalDistributedMember lead = oldView.getLeadMember();
+    for (InternalDistributedMember mbr: this.crashedMembers) {
+      if ( !oldView.contains(mbr)) {
+        continue;
+      }
+      result += mbr.getNetMember().getMemberWeight();
+      switch (mbr.getVmKind()) {
+      case DistributionManager.NORMAL_DM_TYPE:
+        result += 10;
+        if (lead != null  &&  mbr.equals(lead)) {
+          result += 5;
+        }
+        break;
+      case DistributionManager.LOCATOR_DM_TYPE:
+        result += 3;
+        break;
+      case DistributionManager.ADMIN_ONLY_DM_TYPE:
+        break;
+      default:
+        throw new IllegalStateException("Unknown member type: " + mbr.getVmKind());
+      }
+    }
+    return result;
+  }
+
+  
+  /**
+   * returns the members of this views crashedMembers collection
+   * 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());
+    InternalDistributedMember lead = oldView.getLeadMember();
+    for (InternalDistributedMember mbr: this.crashedMembers) {
+      if ((mbr.getVmKind() != DistributionManager.ADMIN_ONLY_DM_TYPE)
+          && oldView.contains(mbr)) {
+        result.add(mbr);
+      }
+    }
+    return result;
+  }
+  
+  /**
+   * logs the weight of failed members wrt the given previous
+   * view
+   */
+  public void logCrashedMemberWeights(NetView oldView, Logger log) {
+    InternalDistributedMember lead = oldView.getLeadMember();
+    for (InternalDistributedMember mbr: this.crashedMembers) {
+      if ( !oldView.contains(mbr)) {
+        continue;
+      }
+      int mbrWeight = mbr.getNetMember().getMemberWeight();
+      switch (mbr.getVmKind()) {
+      case DistributionManager.NORMAL_DM_TYPE:
+        if (lead != null  &&  mbr.equals(lead)) {
+          mbrWeight += 15;
+        } else {
+          mbrWeight += 5;
+        }
+        break;
+      case DistributionManager.LOCATOR_DM_TYPE:
+        mbrWeight += 3;
+        break;
+      case DistributionManager.ADMIN_ONLY_DM_TYPE:
+        break;
+      default:
+        throw new IllegalStateException("Unknown member type: " + mbr.getVmKind());
+      }
+      log.info("  " + mbr + " had a weight of " + mbrWeight);
+    }
+  }
+  
   public String toString() {
     InternalDistributedMember lead = getLeadMember();
     

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 05c5754..da9ab99 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
@@ -20,6 +20,7 @@ import com.gemstone.gemfire.distributed.DurableClientAttributes;
 import com.gemstone.gemfire.distributed.internal.membership.MemberAttributes;
 import com.gemstone.gemfire.distributed.internal.membership.NetMember;
 import com.gemstone.gemfire.internal.DataSerializableFixedID;
+import com.gemstone.gemfire.internal.InternalDataSerializer;
 import com.gemstone.gemfire.internal.Version;
 import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
 
@@ -36,8 +37,11 @@ import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
  * 
  */
 public class GMSMember implements NetMember, DataSerializableFixedID {
+  // whether to show UUID info in toString()
+  private final static boolean SHOW_UUIDS = Boolean.getBoolean("gemfire.show_UUIDs");
+  
   private int udpPort=0;
-  private boolean shouldNotBeCoordinator;
+  private boolean preferredForCoordinator;
   private boolean splitBrainEnabled;
   private byte memberWeight;
   private InetAddress inetAddr;
@@ -84,7 +88,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
    */
   public GMSMember(GMSMember m) {
     udpPort=m.udpPort;
-    shouldNotBeCoordinator=m.shouldNotBeCoordinator;
+    preferredForCoordinator=m.preferredForCoordinator;
     splitBrainEnabled=m.splitBrainEnabled;
     memberWeight=m.memberWeight;
     inetAddr=m.inetAddr;
@@ -124,16 +128,22 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
    * @param i the hostname, must be for the current host
    * @param p the membership listening port
    * @param splitBrainEnabled whether the member has network partition detection enabled
-   * @param canBeCoordinator whether the member can be group coordinator
-   * @param version TODO
+   * @param preferredForCoordinator whether the member can be group coordinator
+   * @param version the member's version ordinal
+   * @param msbs - most significant bytes of UUID
+   * @param lsbs - least significant bytes of UUID
    */
-  public GMSMember(InetAddress i, int p, boolean splitBrainEnabled, boolean canBeCoordinator, short version) {
+  public GMSMember(InetAddress i, int p, boolean splitBrainEnabled, boolean preferredForCoordinator,
+      short version,
+      long msbs, long lsbs) {
     setAttributes(MemberAttributes.DEFAULT);
     this.inetAddr = i;
     this.udpPort=p;
     this.splitBrainEnabled = splitBrainEnabled;
-    this.shouldNotBeCoordinator = !canBeCoordinator;
+    this.preferredForCoordinator = preferredForCoordinator;
     this.versionOrdinal = version;
+    this.uuidMSBs = msbs;
+    this.uuidLSBs = lsbs;
   }
 
   public int getPort() {
@@ -149,7 +159,11 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
   }
   
   public boolean preferredForCoordinator() {
-    return !this.shouldNotBeCoordinator;
+    return this.preferredForCoordinator;
+  }
+  
+  public void setPreferredForCoordinator(boolean preferred) {
+    this.preferredForCoordinator = preferred;
   }
   
   public InetAddress getInetAddress() {
@@ -278,8 +292,12 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder(100);
+    String uuid = SHOW_UUIDS? (";uuid=" + getUUID().toStringLong()) 
+        : ((this.uuidLSBs == 0 && this.uuidMSBs == 0)? "; no uuid" : "; uuid set");
+
     sb.append("GMSMember[addr=").append(inetAddr).append(";port=").append(udpPort)
       .append(";processId=").append(processId).append(";name=").append(name)
+      .append(uuid)
       .append("]");
     return sb.toString();
   }
@@ -289,10 +307,6 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     return udpPort;
   }
 
-  public boolean isShouldNotBeCoordinator() {
-    return shouldNotBeCoordinator;
-  }
-
   public boolean isSplitBrainEnabled() {
     return splitBrainEnabled;
   }
@@ -337,10 +351,6 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     this.udpPort = udpPort;
   }
 
-  public void setShouldNotBeCoordinator(boolean shouldNotBeCoordinator) {
-    this.shouldNotBeCoordinator = shouldNotBeCoordinator;
-  }
-
   public void setSplitBrainEnabled(boolean splitBrainEnabled) {
     this.splitBrainEnabled = splitBrainEnabled;
   }
@@ -397,7 +407,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
   }
 
   static final int SB_ENABLED = 0x01;
-  static final int SHOULD_NOT_BE_COORD = 0x02;
+  static final int PREFERRED_FOR_COORD = 0x02;
   
   @Override
   public void toData(DataOutput out) throws IOException {
@@ -405,7 +415,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     
     int flags = 0;
     if (splitBrainEnabled) flags |= SB_ENABLED;
-    if (shouldNotBeCoordinator) flags |= SHOULD_NOT_BE_COORD;
+    if (preferredForCoordinator) flags |= PREFERRED_FOR_COORD;
     out.writeInt(flags);
 
     DataSerializer.writeInetAddress(inetAddr, out);
@@ -417,8 +427,10 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     out.writeInt(vmKind);
     DataSerializer.writeString(name,  out);
     DataSerializer.writeStringArray(groups, out);
-    out.writeLong(uuidLSBs);
     out.writeLong(uuidMSBs);
+    out.writeLong(uuidLSBs);
+//    InternalDataSerializer.writeSignedVL(uuidLSBs, out);
+//    InternalDataSerializer.writeSignedVL(uuidMSBs, out);
   }
 
   @Override
@@ -427,7 +439,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     
     int flags = in.readInt();
     this.splitBrainEnabled = (flags & SB_ENABLED) != 0;
-    this.shouldNotBeCoordinator = (flags & SHOULD_NOT_BE_COORD) != 0;
+    this.preferredForCoordinator = (flags & PREFERRED_FOR_COORD) != 0;
     
     this.inetAddr = DataSerializer.readInetAddress(in);
     this.udpPort = in.readInt();
@@ -440,18 +452,24 @@ public class GMSMember implements NetMember, DataSerializableFixedID {
     this.groups = DataSerializer.readStringArray(in);
     this.uuidLSBs = in.readLong();
     this.uuidMSBs = in.readLong();
+//    this.uuidLSBs = InternalDataSerializer.readUnsignedVL(in);
+//    this.uuidMSBs = InternalDataSerializer.readUnsignedVL(in);
   }
 
   @Override
   public void writeAdditionalData(DataOutput out) throws IOException {
-    out.writeLong(uuidLSBs);
     out.writeLong(uuidMSBs);
+    out.writeLong(uuidLSBs);
+//    InternalDataSerializer.writeSignedVL(uuidLSBs, out);
+//    InternalDataSerializer.writeSignedVL(uuidMSBs, out);
   }
 
   @Override
   public void readAdditionalData(DataInput in) throws ClassNotFoundException,
       IOException {
-    this.uuidLSBs = in.readLong();
     this.uuidMSBs = in.readLong();
+    this.uuidLSBs = in.readLong();
+//    this.uuidLSBs = InternalDataSerializer.readUnsignedVL(in);
+//    this.uuidMSBs = InternalDataSerializer.readUnsignedVL(in);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 d92553f..52e8054 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
@@ -51,7 +51,7 @@ public class GMSMemberFactory implements MemberServices {
    */
   public NetMember newNetMember(InetAddress i, int p, boolean splitBrainEnabled,
       boolean canBeCoordinator, MemberAttributes attr, short version) {
-    GMSMember result = new GMSMember(i, p, splitBrainEnabled, canBeCoordinator, version);
+    GMSMember result = new GMSMember(i, p, splitBrainEnabled, canBeCoordinator, version, 0, 0);
     result.setAttributes(attr);
     return result;
   }
@@ -80,7 +80,7 @@ public class GMSMemberFactory implements MemberServices {
    * @return the new NetMember
    */
   public NetMember newNetMember(InetAddress i, int p) {
-    GMSMember result = new GMSMember(i, p, false, true, Version.CURRENT_ORDINAL);
+    GMSMember result = new GMSMember(i, p, false, true, Version.CURRENT_ORDINAL, 0, 0);
     result.setAttributes(getDefaultAttributes());
     return result;
   }
@@ -113,7 +113,7 @@ public class GMSMemberFactory implements MemberServices {
           DistributionConfig config,
           RemoteTransportConfig transport, DMStats stats) throws DistributionException
   {
-    GMSMemberServices services = new GMSMemberServices(listener, config, transport, stats);
+    Services services = new Services(listener, config, transport, stats);
     try {
       services.init();
       services.start();
@@ -121,14 +121,11 @@ public class GMSMemberFactory implements MemberServices {
     catch (ConnectionException e) {
       throw new DistributionException(LocalizedStrings.JGroupMemberFactory_UNABLE_TO_CREATE_MEMBERSHIP_MANAGER.toLocalizedString(), e);
     }
-    catch (GemFireConfigException e) {
-      throw e;
-    }
-    catch (SystemConnectException e) {
+    catch (GemFireConfigException | SystemConnectException e) {
       throw e;
     }
     catch (RuntimeException e) {
-      GMSMemberServices.getLogger().error("Unexpected problem starting up membership services", e);
+      Services.getLogger().error("Unexpected problem starting up membership services", e);
       throw new SystemConnectException("Problem starting up membership services", e);
     }
     return (MembershipManager)services.getManager();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberServices.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberServices.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberServices.java
deleted file mode 100755
index d23389f..0000000
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberServices.java
+++ /dev/null
@@ -1,260 +0,0 @@
-package com.gemstone.gemfire.distributed.internal.membership.gms;
-
-import java.util.Timer;
-
-import org.apache.logging.log4j.Logger;
-
-import com.gemstone.gemfire.CancelCriterion;
-import com.gemstone.gemfire.CancelException;
-import com.gemstone.gemfire.LogWriter;
-import com.gemstone.gemfire.distributed.internal.DMStats;
-import com.gemstone.gemfire.distributed.internal.DistributionConfig;
-import com.gemstone.gemfire.distributed.internal.InternalLocator;
-import com.gemstone.gemfire.distributed.internal.membership.DistributedMembershipListener;
-import com.gemstone.gemfire.distributed.internal.membership.MembershipManager;
-import com.gemstone.gemfire.distributed.internal.membership.NetView;
-import com.gemstone.gemfire.distributed.internal.membership.gms.membership.GMSJoinLeave;
-import com.gemstone.gemfire.distributed.internal.membership.gms.messenger.JGroupsMessenger;
-import com.gemstone.gemfire.distributed.internal.membership.gms.mgr.GMSMembershipManager;
-import com.gemstone.gemfire.distributed.internal.membership.gms.auth.GMSAuthenticator;
-import com.gemstone.gemfire.distributed.internal.membership.gms.fd.GMSHealthMonitor;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Authenticator;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.HealthMonitor;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.JoinLeave;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Locator;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Manager;
-import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Messenger;
-import com.gemstone.gemfire.internal.admin.remote.RemoteTransportConfig;
-import com.gemstone.gemfire.internal.logging.InternalLogWriter;
-import com.gemstone.gemfire.internal.logging.LogService;
-import com.gemstone.gemfire.internal.logging.LoggingThreadGroup;
-import com.gemstone.gemfire.security.AuthenticationFailedException;
-
-public class GMSMemberServices {
-
-  private static final Logger logger = LogService.getLogger();
-
-  private static final ThreadGroup threadGroup = LoggingThreadGroup.createThreadGroup("Membership", logger); 
-  
-  private static InternalLogWriter staticSecurityLogWriter;
-
-  final private Manager manager;
-  final private JoinLeave joinLeave;
-  private Locator locator;
-  final private HealthMonitor healthMon;
-  final private Messenger messenger;
-  final private Authenticator auth;
-  final private ServiceConfig config;
-  final private DMStats stats;
-  final private Stopper cancelCriterion;
-
-  private InternalLogWriter securityLogWriter;
-  
-  private Timer timer = new Timer("Membership Timer", true);
-  
-  
-
-  /**
-   * A common logger for membership classes
-   */
-  public static Logger getLogger() {
-    return logger;
-  }
-
-  /**
-   * The thread group for all membership threads
-   */
-  public static ThreadGroup getThreadGroup() {
-    return threadGroup;
-  }
-  
-  /**
-   * a timer used for membership tasks
-   */
-  public Timer getTimer() {
-    return this.timer;
-  }
-  
-
-
-  public GMSMemberServices(
-      DistributedMembershipListener listener, DistributionConfig config,
-      RemoteTransportConfig transport, DMStats stats) {
-    this.cancelCriterion = new Stopper();
-    this.stats = stats;
-    this.config = new ServiceConfig(transport, config);
-    this.manager = new GMSMembershipManager(listener);
-    this.joinLeave = new GMSJoinLeave();
-    this.healthMon = new GMSHealthMonitor();
-    this.messenger = new JGroupsMessenger();
-    this.auth = new GMSAuthenticator();
-  }
-  
-  protected void init() {
-    // InternalDistributedSystem establishes this log writer at boot time
-    // TODO fix this so that IDS doesn't know about Services
-    securityLogWriter = staticSecurityLogWriter;
-    staticSecurityLogWriter = null;
-    this.auth.init(this);
-    this.messenger.init(this);
-    this.manager.init(this);
-    this.joinLeave.init(this);
-    this.healthMon.init(this);
-    InternalLocator l = (InternalLocator)com.gemstone.gemfire.distributed.Locator.getLocator();
-    if (l != null) {
-      l.getLocatorHandler().setMembershipManager((MembershipManager)this.manager);
-      this.locator = (Locator)l.getLocatorHandler();
-    }
-  }
-  
-  protected void start() {
-    boolean started = false;
-    try {
-      logger.info("Membership: starting Authenticator");
-      this.auth.start();
-      logger.info("Membership: starting Messenger");
-      this.messenger.start();
-      logger.info("Membership: starting JoinLeave");
-      this.joinLeave.start();
-      logger.info("Membership: starting HealthMonitor");
-      this.healthMon.start();
-      logger.info("Membership: starting Manager");
-      this.manager.start();
-      started = true;
-    } catch (RuntimeException e) {
-      logger.fatal("Unexpected exception while booting membership services", e);
-      throw e;
-    } finally {
-      if (!started) {
-        this.manager.stop();
-        this.healthMon.stop();
-        this.joinLeave.stop();
-        this.messenger.stop();
-        this.auth.stop();
-      }
-    }
-    this.auth.started();
-    this.messenger.started();
-    this.joinLeave.started();
-    this.healthMon.started();
-    this.manager.started();
-    
-    this.manager.joinDistributedSystem();
-  }
-  
-  public void emergencyClose() {
-  }
-  
-  public void stop() {
-    logger.info("Membership: stopping services");
-    this.joinLeave.stop();
-    this.healthMon.stop();
-    this.auth.stop();
-    this.messenger.stop();
-    this.manager.stop();
-    this.timer.cancel();
-  }
-  
-  public static void setSecurityLogWriter(InternalLogWriter writer) {
-    staticSecurityLogWriter = writer;
-  }
-  
-  public LogWriter getSecurityLogWriter() {
-    return this.securityLogWriter;
-  }
-  
-  public Authenticator getAuthenticator() {
-    return auth;
-  }
-
-  public void installView(NetView v) {
-    try {
-      auth.installView(v);
-    } catch (AuthenticationFailedException e) {
-      return;
-    }
-    if (locator != null) {
-      locator.installView(v);
-    }
-    healthMon.installView(v);
-    messenger.installView(v);
-    manager.installView(v);
-  }
-
-  public Manager getManager() {
-    return manager;
-  }
-
-  public Locator getLocator() {
-    return locator;
-  }
-
-  public void setLocator(Locator locator) {
-    this.locator = locator;
-  }
-
-  public JoinLeave getJoinLeave() {
-    return joinLeave;
-  }
-
-  public HealthMonitor getHealthMonitor() {
-    return healthMon;
-  }
-
-  public ServiceConfig getConfig() {
-    return this.config;
-  }
-  
-  public Messenger getMessenger() {
-    return this.messenger;
-  }
-  
-  public DMStats getStatistics() {
-    return this.stats;
-  }
-  
-  public Stopper getCancelCriterion() {
-    return this.cancelCriterion;
-  }
-  
-  
-  
-  
-  public static class Stopper extends CancelCriterion {
-    volatile String reasonForStopping = null;
-    
-    public void cancel(String reason) {
-      this.reasonForStopping = reason;
-    }
-
-    @Override
-    public String cancelInProgress() {
-      return reasonForStopping;
-    }
-    
-    public boolean isCancelInProgress() {
-      return cancelInProgress() != null;
-    }
-
-    @Override
-    public RuntimeException generateCancelledException(Throwable e) {
-      String reason = cancelInProgress();
-      if (reason == null) {
-        return null;
-      }
-      else {
-        return new ServicesStoppedException(reasonForStopping, e);
-      }
-    }
-    
-  }
-  
-  public static class ServicesStoppedException extends CancelException {
-    private static final long serialVersionUID = 2134474966059876801L;
-
-    public ServicesStoppedException(String message, Throwable cause) {
-      super(message, cause);
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSUtil.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSUtil.java
index 0005ef3..c65f4d0 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSUtil.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSUtil.java
@@ -14,7 +14,7 @@ import com.gemstone.gemfire.distributed.internal.membership.MemberAttributes;
 import com.gemstone.gemfire.internal.SocketCreator;
 
 public class GMSUtil {
-  static Logger logger = GMSMemberServices.getLogger();
+  static Logger logger = Services.getLogger();
   
   public static List<InetSocketAddress> parseLocators(String locatorsString, String bindAddress) {
     InetAddress addr = null;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java
new file mode 100755
index 0000000..7478ef3
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java
@@ -0,0 +1,260 @@
+package com.gemstone.gemfire.distributed.internal.membership.gms;
+
+import java.util.Timer;
+
+import org.apache.logging.log4j.Logger;
+
+import com.gemstone.gemfire.CancelCriterion;
+import com.gemstone.gemfire.CancelException;
+import com.gemstone.gemfire.LogWriter;
+import com.gemstone.gemfire.distributed.internal.DMStats;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.distributed.internal.InternalLocator;
+import com.gemstone.gemfire.distributed.internal.membership.DistributedMembershipListener;
+import com.gemstone.gemfire.distributed.internal.membership.MembershipManager;
+import com.gemstone.gemfire.distributed.internal.membership.NetView;
+import com.gemstone.gemfire.distributed.internal.membership.gms.membership.GMSJoinLeave;
+import com.gemstone.gemfire.distributed.internal.membership.gms.messenger.JGroupsMessenger;
+import com.gemstone.gemfire.distributed.internal.membership.gms.mgr.GMSMembershipManager;
+import com.gemstone.gemfire.distributed.internal.membership.gms.auth.GMSAuthenticator;
+import com.gemstone.gemfire.distributed.internal.membership.gms.fd.GMSHealthMonitor;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Authenticator;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.HealthMonitor;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.JoinLeave;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Locator;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Manager;
+import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Messenger;
+import com.gemstone.gemfire.internal.admin.remote.RemoteTransportConfig;
+import com.gemstone.gemfire.internal.logging.InternalLogWriter;
+import com.gemstone.gemfire.internal.logging.LogService;
+import com.gemstone.gemfire.internal.logging.LoggingThreadGroup;
+import com.gemstone.gemfire.security.AuthenticationFailedException;
+
+public class Services {
+
+  private static final Logger logger = LogService.getLogger();
+
+  private static final ThreadGroup threadGroup = LoggingThreadGroup.createThreadGroup("Membership", logger); 
+  
+  private static InternalLogWriter staticSecurityLogWriter;
+
+  final private Manager manager;
+  final private JoinLeave joinLeave;
+  private Locator locator;
+  final private HealthMonitor healthMon;
+  final private Messenger messenger;
+  final private Authenticator auth;
+  final private ServiceConfig config;
+  final private DMStats stats;
+  final private Stopper cancelCriterion;
+
+  private InternalLogWriter securityLogWriter;
+  
+  private Timer timer = new Timer("Membership Timer", true);
+  
+  
+
+  /**
+   * A common logger for membership classes
+   */
+  public static Logger getLogger() {
+    return logger;
+  }
+
+  /**
+   * The thread group for all membership threads
+   */
+  public static ThreadGroup getThreadGroup() {
+    return threadGroup;
+  }
+  
+  /**
+   * a timer used for membership tasks
+   */
+  public Timer getTimer() {
+    return this.timer;
+  }
+  
+
+
+  public Services(
+      DistributedMembershipListener listener, DistributionConfig config,
+      RemoteTransportConfig transport, DMStats stats) {
+    this.cancelCriterion = new Stopper();
+    this.stats = stats;
+    this.config = new ServiceConfig(transport, config);
+    this.manager = new GMSMembershipManager(listener);
+    this.joinLeave = new GMSJoinLeave();
+    this.healthMon = new GMSHealthMonitor();
+    this.messenger = new JGroupsMessenger();
+    this.auth = new GMSAuthenticator();
+  }
+  
+  protected void init() {
+    // InternalDistributedSystem establishes this log writer at boot time
+    // TODO fix this so that IDS doesn't know about Services
+    securityLogWriter = staticSecurityLogWriter;
+    staticSecurityLogWriter = null;
+    this.auth.init(this);
+    this.messenger.init(this);
+    this.manager.init(this);
+    this.joinLeave.init(this);
+    this.healthMon.init(this);
+    InternalLocator l = (InternalLocator)com.gemstone.gemfire.distributed.Locator.getLocator();
+    if (l != null) {
+      l.getLocatorHandler().setMembershipManager((MembershipManager)this.manager);
+      this.locator = (Locator)l.getLocatorHandler();
+    }
+  }
+  
+  protected void start() {
+    boolean started = false;
+    try {
+      logger.info("Membership: starting Authenticator");
+      this.auth.start();
+      logger.info("Membership: starting Messenger");
+      this.messenger.start();
+      logger.info("Membership: starting JoinLeave");
+      this.joinLeave.start();
+      logger.info("Membership: starting HealthMonitor");
+      this.healthMon.start();
+      logger.info("Membership: starting Manager");
+      this.manager.start();
+      started = true;
+    } catch (RuntimeException e) {
+      logger.fatal("Unexpected exception while booting membership services", e);
+      throw e;
+    } finally {
+      if (!started) {
+        this.manager.stop();
+        this.healthMon.stop();
+        this.joinLeave.stop();
+        this.messenger.stop();
+        this.auth.stop();
+      }
+    }
+    this.auth.started();
+    this.messenger.started();
+    this.joinLeave.started();
+    this.healthMon.started();
+    this.manager.started();
+    
+    this.manager.joinDistributedSystem();
+  }
+  
+  public void emergencyClose() {
+  }
+  
+  public void stop() {
+    logger.info("Membership: stopping services");
+    this.joinLeave.stop();
+    this.healthMon.stop();
+    this.auth.stop();
+    this.messenger.stop();
+    this.manager.stop();
+    this.timer.cancel();
+  }
+  
+  public static void setSecurityLogWriter(InternalLogWriter writer) {
+    staticSecurityLogWriter = writer;
+  }
+  
+  public LogWriter getSecurityLogWriter() {
+    return this.securityLogWriter;
+  }
+  
+  public Authenticator getAuthenticator() {
+    return auth;
+  }
+
+  public void installView(NetView v) {
+    try {
+      auth.installView(v);
+    } catch (AuthenticationFailedException e) {
+      return;
+    }
+    if (locator != null) {
+      locator.installView(v);
+    }
+    healthMon.installView(v);
+    messenger.installView(v);
+    manager.installView(v);
+  }
+
+  public Manager getManager() {
+    return manager;
+  }
+
+  public Locator getLocator() {
+    return locator;
+  }
+
+  public void setLocator(Locator locator) {
+    this.locator = locator;
+  }
+
+  public JoinLeave getJoinLeave() {
+    return joinLeave;
+  }
+
+  public HealthMonitor getHealthMonitor() {
+    return healthMon;
+  }
+
+  public ServiceConfig getConfig() {
+    return this.config;
+  }
+  
+  public Messenger getMessenger() {
+    return this.messenger;
+  }
+  
+  public DMStats getStatistics() {
+    return this.stats;
+  }
+  
+  public Stopper getCancelCriterion() {
+    return this.cancelCriterion;
+  }
+  
+  
+  
+  
+  public static class Stopper extends CancelCriterion {
+    volatile String reasonForStopping = null;
+    
+    public void cancel(String reason) {
+      this.reasonForStopping = reason;
+    }
+
+    @Override
+    public String cancelInProgress() {
+      return reasonForStopping;
+    }
+    
+    public boolean isCancelInProgress() {
+      return cancelInProgress() != null;
+    }
+
+    @Override
+    public RuntimeException generateCancelledException(Throwable e) {
+      String reason = cancelInProgress();
+      if (reason == null) {
+        return null;
+      }
+      else {
+        return new ServicesStoppedException(reasonForStopping, e);
+      }
+    }
+    
+  }
+  
+  public static class ServicesStoppedException extends CancelException {
+    private static final long serialVersionUID = 2134474966059876801L;
+
+    public ServicesStoppedException(String message, Throwable cause) {
+      super(message, cause);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 518e183..c008171 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
@@ -2,14 +2,14 @@ package com.gemstone.gemfire.distributed.internal.membership.gms.auth;
 
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Authenticator;
 import com.gemstone.gemfire.security.AuthenticationFailedException;
 
 public class GMSAuthenticator implements Authenticator {
 
   @Override
-  public void init(GMSMemberServices s) {
+  public void init(Services s) {
     // TODO Auto-generated method stub
 
   }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/fd/GMSHealthMonitor.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
index 4ad271f..274ecd5 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
@@ -3,41 +3,32 @@ package com.gemstone.gemfire.distributed.internal.membership.gms.fd;
 import com.gemstone.gemfire.distributed.DistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.HealthMonitor;
 
 /** Failure Detection */
 public class GMSHealthMonitor implements HealthMonitor {
 
-  private GMSMemberServices services;
+  private Services services;
   private NetView currentView;
 
   public static void loadEmergencyClasses() {
   }
 
-  /* (non-Javadoc)
-   * @see com.gemstone.gemfire.distributed.internal.membership.gms.fd.HealthMonitor#messageReceivedFrom(com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember)
-   */
   @Override
   public void contactedBy(InternalDistributedMember sender) {
     // TODO Auto-generated method stub
   }
 
-  /* (non-Javadoc)
-   * @see com.gemstone.gemfire.distributed.internal.membership.gms.fd.HealthMonitor#suspectMember(com.gemstone.gemfire.distributed.DistributedMember, java.lang.String)
-   */
   @Override
   public void suspect(InternalDistributedMember mbr, String reason) {
     // TODO Auto-generated method stub
   }
 
-  /* (non-Javadoc)
-   * @see com.gemstone.gemfire.distributed.internal.membership.gms.fd.HealthMonitor#checkSuspect(com.gemstone.gemfire.distributed.DistributedMember, java.lang.String)
-   */
   @Override
-  public void checkSuspect(DistributedMember mbr, String reason) {
+  public boolean checkIfAvailable(DistributedMember mbr, String reason, boolean initiateRemoval) {
     // TODO Auto-generated method stub
-    
+    return true;
   }
 
   public void playDead(boolean b) {
@@ -53,7 +44,7 @@ public class GMSHealthMonitor implements HealthMonitor {
   }
 
   @Override
-  public void init(GMSMemberServices s) {
+  public void init(Services s) {
     // TODO Auto-generated method stub
     
   }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/HealthMonitor.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/HealthMonitor.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/HealthMonitor.java
index 6b268cb..aab95b6 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/HealthMonitor.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/HealthMonitor.java
@@ -5,10 +5,28 @@ import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedM
 
 public interface HealthMonitor extends Service {
 
-  public abstract void contactedBy(InternalDistributedMember sender);
+  /**
+   * Note that this member has been contacted by the given member
+   * @param sender
+   */
+  public void contactedBy(InternalDistributedMember sender);
 
-  public abstract void suspect(InternalDistributedMember mbr, String reason);
+  /**
+   * initiate, asynchronously, suspicion that the member is no longer available
+   * @param mbr
+   * @param reason
+   */
+  public void suspect(InternalDistributedMember mbr, String reason);
 
-  public abstract void checkSuspect(DistributedMember mbr, String reason);
+  /**
+   * Check on the health of the given member, initiating suspicion if it
+   * fails.  Return true if the member is found to be available, false
+   * if it isn't.
+   * @param mbr
+   * @param reason the reason this check is being performed
+   * @param initiateRemoval if the member should be removed if it is not available
+   * @return 
+   */
+  public boolean checkIfAvailable(DistributedMember mbr, String reason, boolean initiateRemoval);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Manager.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Manager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Manager.java
index 315b69f..b379d6d 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Manager.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Manager.java
@@ -1,12 +1,14 @@
 package com.gemstone.gemfire.distributed.internal.membership.gms.interfaces;
 
 import java.io.NotSerializableException;
+import java.util.Collection;
 import java.util.Set;
 
 import com.gemstone.gemfire.distributed.DistributedMember;
 import com.gemstone.gemfire.distributed.internal.DistributionMessage;
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.NetMember;
+import com.gemstone.gemfire.distributed.internal.membership.NetView;
 
 /**
  * Manager presents the GMS services to the outside world and
@@ -29,6 +31,8 @@ public interface Manager extends Service, MessageHandler {
   Set<InternalDistributedMember> send(DistributionMessage m) throws NotSerializableException;
 
   void forceDisconnect(String reason);
+  
+  void quorumLost(Collection<InternalDistributedMember> failures, NetView view);
 
   void addSurpriseMemberForTesting(DistributedMember mbr, long birthTime);
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Service.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Service.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Service.java
index f414d3f..082ea0a 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Service.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Service.java
@@ -1,14 +1,14 @@
 package com.gemstone.gemfire.distributed.internal.membership.gms.interfaces;
 
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 
 /**
  * Services in GMS all implement this interface
  *
  */
 public interface Service {
-  void init(GMSMemberServices s);
+  void init(Services s);
 
   /**
    * called after all services have been initialized 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 576b250..0eb29a1 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
@@ -26,7 +26,7 @@ import com.gemstone.gemfire.distributed.internal.membership.MembershipManager;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
 import com.gemstone.gemfire.distributed.internal.membership.gms.GMSUtil;
 import com.gemstone.gemfire.distributed.internal.membership.gms.NetLocator;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Locator;
 import com.gemstone.gemfire.distributed.internal.membership.gms.mgr.GMSMembershipManager;
 import com.gemstone.gemfire.distributed.internal.tcpserver.TcpClient;
@@ -47,7 +47,7 @@ public class GMSLocator implements Locator, NetLocator {
   private final boolean networkPartitionDetectionEnabled;
   private final String locatorString;
   private final List<InetSocketAddress> locators;
-  private GMSMemberServices services;
+  private Services services;
   
   private Set<InternalDistributedMember> registrants = new HashSet<InternalDistributedMember>();
 
@@ -80,10 +80,12 @@ public class GMSLocator implements Locator, NetLocator {
   
   @Override
   public void setMembershipManager(MembershipManager mgr) {
-    logger.info("Peer locator is connecting to local membership services");
-    services = ((GMSMembershipManager)mgr).getServices();
-    services.setLocator(this);
-    this.view = services.getJoinLeave().getView();
+    if (services == null) {
+      logger.info("Peer locator is connecting to local membership services");
+      services = ((GMSMembershipManager)mgr).getServices();
+      services.setLocator(this);
+      this.view = services.getJoinLeave().getView();
+    }
   }
   
   @Override
@@ -152,7 +154,9 @@ public class GMSLocator implements Locator, NetLocator {
             }
             for (InternalDistributedMember mbr: registrants) {
               if (mbr != coord  &&  (coord==null  ||  mbr.compareTo(coord) < 0)) {
-                coord = mbr;
+                if (mbr.getNetMember().preferredForCoordinator() || !mbr.getNetMember().splitBrainEnabled()) {
+                  coord = mbr;
+                }
               }
             }
           }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e71780ae/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 3059890..3aa80ab 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
@@ -3,12 +3,21 @@ package com.gemstone.gemfire.distributed.internal.membership.gms.membership;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
@@ -21,8 +30,8 @@ import com.gemstone.gemfire.distributed.internal.DistributionMessage;
 import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
 import com.gemstone.gemfire.distributed.internal.membership.NetView;
 import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMember;
+import com.gemstone.gemfire.distributed.internal.membership.gms.Services;
 import com.gemstone.gemfire.distributed.internal.membership.gms.GMSUtil;
-import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMemberServices;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.JoinLeave;
 import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.MessageHandler;
 import com.gemstone.gemfire.distributed.internal.membership.gms.locator.FindCoordinatorRequest;
@@ -34,7 +43,9 @@ import com.gemstone.gemfire.distributed.internal.membership.gms.messages.LeaveRe
 import com.gemstone.gemfire.distributed.internal.membership.gms.messages.RemoveMemberMessage;
 import com.gemstone.gemfire.distributed.internal.membership.gms.messages.ViewAckMessage;
 import com.gemstone.gemfire.distributed.internal.tcpserver.TcpClient;
+import com.gemstone.gemfire.internal.logging.LoggingThreadGroup;
 import com.gemstone.gemfire.internal.Version;
+import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
 import com.gemstone.gemfire.security.AuthenticationFailedException;
 
 /**
@@ -46,22 +57,22 @@ import com.gemstone.gemfire.security.AuthenticationFailedException;
 public class GMSJoinLeave implements JoinLeave, MessageHandler {
 
   /** number of times to try joining before giving up */
-  private static final int JOIN_ATTEMPTS = Integer.getInteger("geode.join-attempts", 6);
+  private static final int JOIN_ATTEMPTS = Integer.getInteger("gemfire.join-attempts", 4);
   
   /** amount of time to sleep before trying to join after a failed attempt */
-  private static final int JOIN_RETRY_SLEEP = Integer.getInteger("geode.join-retry-sleep", 3000);
+  private static final int JOIN_RETRY_SLEEP = Integer.getInteger("gemfire.join-retry-sleep", 3000);
   
   /** amount of time to wait for a view to be acked by all members before performing suspect processing on non-responders */
-  private static final int VIEW_INSTALLATION_TIMEOUT = Integer.getInteger("geode.view-ack-timeout", 12500);
+  private static final int VIEW_INSTALLATION_TIMEOUT = Integer.getInteger("gemfire.view-ack-timeout", 12500);
 
   /** stall time to wait for concurrent join/leave/remove requests to be received */
-  private static final long MEMBER_REQUEST_COLLECTION_INTERVAL = Long.getLong("geode.member-request-collection-interval", 2000);
+  private static final long MEMBER_REQUEST_COLLECTION_INTERVAL = Long.getLong("gemfire.member-request-collection-interval", 2000);
 
   /** time to wait for a leave request to be transmitted by jgroups */
-  private static final long LEAVE_MESSAGE_SLEEP_TIME = Long.getLong("geode.leave-message-sleep-time", 2000);
+  private static final long LEAVE_MESSAGE_SLEEP_TIME = Long.getLong("gemfire.leave-message-sleep-time", 2000);
   
   /** membership logger */
-  private static final Logger logger = GMSMemberServices.getLogger();
+  private static final Logger logger = Services.getLogger();
 
 
   /** the view ID where I entered into membership */
@@ -70,7 +81,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   /** my address */
   private InternalDistributedMember localAddress;
 
-  private GMSMemberServices services;
+  private Services services;
   
   private boolean isConnected;
 
@@ -88,9 +99,10 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   /** a new view being installed */
   private NetView preparedView;
   
-  private List<InetSocketAddress> locators;
+  /** the last view that conflicted with view preparation */
+  private NetView lastConflictingView;
   
-  private InternalDistributedMember leader;
+  private List<InetSocketAddress> locators;
   
   /** a list of join/leave/crashes */
   private final List<DistributionMessage> viewRequests = new LinkedList<DistributionMessage>();
@@ -98,9 +110,13 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   /** collects the response to a join request */
   private JoinResponseMessage[] joinResponse = new JoinResponseMessage[1];
   
-  private ViewReplyProcessor viewResponses = new ViewReplyProcessor();
+  private ViewReplyProcessor viewResponses = new ViewReplyProcessor(false);
+  
+  private ViewReplyProcessor prepareResponses = new ViewReplyProcessor(true);
 
-  private boolean disableForcedDisconnect = false;
+  private boolean quorumRequired = false;
+  
+  private int viewAckTimeout;
 
   /** background thread that creates new membership views */
   private ViewCreator viewCreator;
@@ -189,7 +205,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
         GMSMember me = (GMSMember)this.localAddress.getNetMember();
         GMSMember o = (GMSMember)response.getMemberID().getNetMember();
         me.setSplitBrainEnabled(o.isSplitBrainEnabled());
-        me.setShouldNotBeCoordinator(o.isShouldNotBeCoordinator());
+        me.setPreferredForCoordinator(o.preferredForCoordinator());
         installView(response.getCurrentView());
         return true;
       }
@@ -205,12 +221,24 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
    * @param incomingRequest
    */
   private void processJoinRequest(JoinRequestMessage incomingRequest) {
+    if (incomingRequest.getMemberID().getVersionObject().compareTo(Version.CURRENT) < 0) {
+      logger.warn("detected an attempt to start a peer using an older version of the product {}",
+          incomingRequest.getMemberID());
+      JoinResponseMessage m = new JoinResponseMessage("Rejecting the attempt of a member using an older version");
+      m.setRecipient(incomingRequest.getMemberID());
+      try {
+        services.getMessenger().send(m);
+      } catch (IOException e) {
+        //ignore - the attempt has been logged and the member can't join
+      }
+      return;
+    }
     Object creds = incomingRequest.getCredentials();
     if (creds != null) {
       String rejection = null;
       try {
         rejection = services.getAuthenticator().authenticate(incomingRequest.getMemberID(), creds);
-      } catch (AuthenticationFailedException e) {
+      } catch (Exception e) {
         rejection = e.getMessage();
       }
       if (rejection != null  &&  rejection.length() > 0) {
@@ -382,47 +410,66 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
     }
   }
   
+  
+  boolean prepareView(NetView view) {
+    return sendView(view, true, this.prepareResponses);
+  }
+  
   void sendView(NetView view) {
-    // TODO two-phase view installation and network partition detection
-    // send a prepared view, check for conflicting prepared view
-    // examine members that don't respond & recreate view and start over
+    sendView(view, false, this.viewResponses);
+  }
+  
+  
+  boolean sendView(NetView view, boolean preparing, ViewReplyProcessor rp) {
     int id = view.getViewId();
-    InstallViewMessage msg = new InstallViewMessage(view, services.getAuthenticator().getCredentials());
+    InstallViewMessage msg = new InstallViewMessage(view, services.getAuthenticator().getCredentials(), preparing);
     Set<InternalDistributedMember> recips = new HashSet<InternalDistributedMember>(view.getMembers());
     recips.addAll(view.getCrashedMembers());
     msg.setRecipients(recips);
-    this.viewResponses.initialize(id, recips);
-    logger.info("View Creator sending new view " + view);
+    rp.initialize(id, recips);
+    logger.info("View Creator " + (preparing? "preparing" : "sending") + " new view " + view);
     try {
       services.getMessenger().send(msg);
     }
     catch (IOException e) {
       logger.warn("Unsuccessful in installing new membership view", e);
+      return false;
     }
-    
-    Set<InternalDistributedMember> failedToRespond = this.viewResponses.waitForResponses();
-    
-    logger.info("View Creator is finished waiting for responses to view change");
 
-    if (!failedToRespond.isEmpty()  &&  (services.getCancelCriterion().cancelInProgress() == null)) {
-      logger.warn("these members failed to respond to the view change: " + failedToRespond);
+    // only wait for responses during preparation
+    if (preparing) {
+      Set<InternalDistributedMember> failedToRespond = rp.waitForResponses();
+
+      logger.info("View Creator is finished waiting for responses to view preparation");
+      
+      InternalDistributedMember conflictingViewSender = rp.getConflictingViewSender();
+      NetView conflictingView = rp.getConflictingView();
+      if (conflictingView != null) {
+        logger.warn("View Creator received a conflicting membership view from " + conflictingViewSender
+            + " during preparation: " + conflictingView);
+        return false;
+      }
+      
+      if (!failedToRespond.isEmpty()  &&  (services.getCancelCriterion().cancelInProgress() == null)) {
+        logger.warn("these members failed to respond to the view change: " + failedToRespond);
+        return false;
+      }
     }
+    
+    return true;
   }
   
   
 
   private void processViewMessage(InstallViewMessage m) {
     NetView view = m.getView();
+    
     if (currentView != null  &&  view.getViewId() < currentView.getViewId()) {
       // ignore old views
       ackView(m);
       return;
     }
     
-    if (currentView != null  &&  !m.isPreparing() && !view.contains(this.localAddress)) {
-      services.getManager().forceDisconnect("I am no longer in the membership view");
-      return;
-    }
     
     if (m.isPreparing()) {
       if (this.preparedView != null && this.preparedView.getViewId() >= view.getViewId()) {
@@ -432,30 +479,44 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
           logger.info("unable to send view response to " + m.getSender(), e);
         }
       }
+      else {
+        this.preparedView = view;
+        ackView(m);
+      }
     }
-
-    if (view.contains(view.getCreator())) {
-      ackView(m);
+    else { // !preparing
+      if (currentView != null  &&  !view.contains(this.localAddress)) {
+        if (quorumRequired) {
+          services.getManager().forceDisconnect("This node is no longer in the membership view");
+        }
+      }
+      else {
+        ackView(m);
+        installView(view);
+      }
     }
-    
-    // process the view
-    installView(view);
   }
   
 
   private void ackView(InstallViewMessage m) {
-    // send an acknowledgement
-    try {
-      services.getMessenger().send(new ViewAckMessage(m.getSender(), m.getView().getViewId()));
-    } catch (IOException e) {
-      logger.info("unable to send view response to " + m.getSender(), e);
+    if (m.getView().contains(m.getView().getCreator())) {
+      try {
+        services.getMessenger().send(new ViewAckMessage(m.getSender(), m.getView().getViewId(), m.isPreparing()));
+      } catch (IOException e) {
+        logger.info("unable to send view response to " + m.getSender(), e);
+      }
     }
   }
   
   
   private void processViewAckMessage(ViewAckMessage m) {
-    this.viewResponses.processViewResponse(m.getViewId(), m.getSender());
+    if (m.isPrepareAck()) {
+      this.prepareResponses.processViewResponse(m.getViewId(), m.getSender(), m.getAlternateView());
+    } else {
+      this.viewResponses.processViewResponse(m.getViewId(), m.getSender(), m.getAlternateView());
+    }
   }
+  
   /**
    * 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
@@ -468,31 +529,45 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
       String bindAddr = dconfig.getBindAddress();
       locators = GMSUtil.parseLocators(dconfig.getLocators(), bindAddr);
     }
+
     assert this.localAddress != null;
+    
     FindCoordinatorRequest request = new FindCoordinatorRequest(this.localAddress);
     Set<InternalDistributedMember> coordinators = new HashSet<InternalDistributedMember>();
-    for (InetSocketAddress addr: locators) { 
-      try {
-        Object o = TcpClient.requestToServer(
-            addr.getAddress(), addr.getPort(), request, services.getConfig().getJoinTimeout(), 
-            true);
-        FindCoordinatorResponse response = (o instanceof FindCoordinatorResponse) ? (FindCoordinatorResponse)o : null;
-        if (response != null && response.getCoordinator() != null) {
-          coordinators.add(response.getCoordinator());
-          GMSMember mbr = (GMSMember)this.localAddress.getNetMember();
-          services.getConfig().setNetworkPartitionDetectionEnabled(response.isNetworkPartitionDetectionEnabled());
-          if (response.isUsePreferredCoordinators()
-              && localAddress.getVmKind() != DistributionManager.LOCATOR_DM_TYPE) {
-            mbr.setShouldNotBeCoordinator(true);
+    long giveUpTime = System.currentTimeMillis() + (services.getConfig().getLocatorWaitTime() * 1000L);
+    boolean anyResponses = false;
+    
+    do {
+      for (InetSocketAddress addr: locators) { 
+        try {
+          Object o = TcpClient.requestToServer(
+              addr.getAddress(), addr.getPort(), request, services.getConfig().getJoinTimeout(), 
+              true);
+          FindCoordinatorResponse response = (o instanceof FindCoordinatorResponse) ? (FindCoordinatorResponse)o : null;
+          if (response != null && response.getCoordinator() != null) {
+            anyResponses = false;
+            coordinators.add(response.getCoordinator());
+            GMSMember mbr = (GMSMember)this.localAddress.getNetMember();
+            services.getConfig().setNetworkPartitionDetectionEnabled(response.isNetworkPartitionDetectionEnabled());
+            if (response.isUsePreferredCoordinators()
+                && localAddress.getVmKind() != DistributionManager.LOCATOR_DM_TYPE) {
+              mbr.setPreferredForCoordinator(false);
+            }
           }
+        } catch (IOException | ClassNotFoundException problem) {
         }
-      } catch (IOException problem) {
-      } catch (ClassNotFoundException problem) {
       }
-    }
-    if (coordinators.isEmpty()) {
-      return null;
-    }
+      if (coordinators.isEmpty()) {
+        return null;
+      }
+      if (!anyResponses) {
+        try { Thread.sleep(2000); } catch (InterruptedException e) {
+          Thread.currentThread().interrupt();
+          return null;
+        }
+      }
+    } while (!anyResponses && System.currentTimeMillis() < giveUpTime);
+    
     Iterator<InternalDistributedMember> it = coordinators.iterator();
     if (coordinators.size() == 1) {
       return it.next();
@@ -535,10 +610,19 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
         // old view - ignore it
         return;
       }
-      checkForPartition(newView);
+      
+      if (checkForPartition(newView)) {
+        if (quorumRequired) {
+          List<InternalDistributedMember> crashes = newView.getActualCrashedMembers(currentView);
+          services.getManager().forceDisconnect(
+              LocalizedStrings.Network_partition_detected.toLocalizedString(crashes.size(), crashes));
+        }
+        return;
+      }
+      
       currentView = newView;
-      leader = newView.getLeadMember();
       preparedView = null;
+      lastConflictingView = null;
       services.installView(newView);
       if (!newView.getCreator().equals(this.localAddress)) {
         if (newView.shouldBeCoordinator(this.localAddress)) {
@@ -577,18 +661,33 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   }
   
 
-  private void checkForPartition(NetView newView) {
-    // compare currentView to newView to see if there's been a network
-    // partition event
-    
+  /**
+   * check to see if the new view shows a drop of 51% or more
+   */
+  private boolean checkForPartition(NetView newView) {
+    if (currentView == null) {
+      return false;
+    }
+    int oldWeight = currentView.memberWeight();
+    int failedWeight = newView.getCrashedMemberWeight(currentView);
+    if (failedWeight > 0) {
+      if (logger.isInfoEnabled()) {
+        newView.logCrashedMemberWeights(currentView, logger);
+      }
+      int failurePoint = (int)(Math.round(51 * oldWeight) / 100.0);
+      if (failedWeight > failurePoint) {
+        services.getManager().quorumLost(newView.getActualCrashedMembers(currentView), currentView);
+        return true;
+      }
+    }
+    return false;
   }
   
   
   /** invoke this under the viewInstallationLock */
   private void startCoordinatorServices() {
     if (viewCreator == null || viewCreator.isShutdown()) {
-      viewCreator = new ViewCreator(Version.CURRENT.getProductName()
-          +" Membership View Creator", GMSMemberServices.getThreadGroup());
+      viewCreator = new ViewCreator("GemFire Membership View Creator", Services.getThreadGroup());
       viewCreator.setDaemon(true);
       viewCreator.start();
     }
@@ -707,11 +806,11 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   
   @Override
   public void disableDisconnectOnQuorumLossForTesting() {
-    this.disableForcedDisconnect = true;
+    this.quorumRequired = false;
   }
   
   @Override
-  public void init(GMSMemberServices s) {
+  public void init(Services s) {
     this.services = s;
     services.getMessenger().addHandler(JoinRequestMessage.class, this);
     services.getMessenger().addHandler(JoinResponseMessage.class, this);
@@ -728,7 +827,10 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
       ackCollectionTimeout = 12437;
     }
     ackCollectionTimeout = Integer.getInteger("gemfire.VIEW_ACK_TIMEOUT", ackCollectionTimeout).intValue();
-
+    this.viewAckTimeout = ackCollectionTimeout;
+    
+    this.quorumRequired = services.getConfig().getDistributionConfig().getEnableNetworkPartitionDetection();
+    
   }
 
   @Override
@@ -760,14 +862,31 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
   class ViewReplyProcessor {
     volatile int viewId = -1;
     volatile Set<InternalDistributedMember> recipients;
+    volatile NetView conflictingView;
+    volatile InternalDistributedMember conflictingViewSender;
+    volatile boolean waiting;
+    final boolean isPrepareViewProcessor;
+    
+    ViewReplyProcessor(boolean forPreparation) {
+      this.isPrepareViewProcessor = forPreparation;
+    }
     
     void initialize(int viewId, Set<InternalDistributedMember> recips) {
+      this.waiting = true;
       this.viewId = viewId;
       this.recipients = recips;
     }
     
-    void processViewResponse(int viewId, InternalDistributedMember sender) {
+    void processViewResponse(int viewId, InternalDistributedMember sender, NetView conflictingView) {
+      if (!this.waiting) {
+        return;
+      }
+      
       if (viewId == this.viewId) {
+        if (conflictingView != null) {
+          this.conflictingViewSender = sender;
+          this.conflictingView = conflictingView;
+        }
         Set<InternalDistributedMember> waitingFor = this.recipients;
         waitingFor.remove(sender);
         if (waitingFor.isEmpty()) {
@@ -776,24 +895,41 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
           }
         }
       }
+      
     }
     
     Set<InternalDistributedMember> waitForResponses() {
       Set<InternalDistributedMember> result = this.recipients;
-      long endOfWait = System.currentTimeMillis() + VIEW_INSTALLATION_TIMEOUT;
-      while (System.currentTimeMillis() < endOfWait
-          &&  (services.getCancelCriterion().cancelInProgress() == null)) {
-        try {
-          synchronized(result) {
-            result.wait(1000);
+      long endOfWait = System.currentTimeMillis() + viewAckTimeout;
+      try {
+        while (System.currentTimeMillis() < endOfWait
+            &&  (services.getCancelCriterion().cancelInProgress() == null)) {
+          try {
+            synchronized(result) {
+              result.wait(1000);
+            }
+          } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            return result;
           }
-        } catch (InterruptedException e) {
-          Thread.currentThread().interrupt();
-          return result;
         }
+      } finally {
+        this.waiting = false;
       }
       return result;
     }
+    
+    NetView getConflictingView() {
+      return this.conflictingView;
+    }
+    
+    InternalDistributedMember getConflictingViewSender() {
+      return this.conflictingViewSender;
+    }
+    
+    Set<InternalDistributedMember> getUnresponsiveMembers() {
+      return this.recipients;
+    }
   }
   
 
@@ -859,7 +995,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
           } // synchronized
           if (requests != null  && !requests.isEmpty()) {
             logger.debug("View Creator is processing {} requests for the next membership view", requests.size());
-            createAndSendView(requests);
+            /*boolean success = */createAndSendView(requests);
             requests = null;
           }
         }
@@ -868,7 +1004,11 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
       }
     }
     
-    void createAndSendView(List<DistributionMessage> requests) {
+    /**
+     * Create a new membership view and send it to members (including crashed members).
+     * Returns false if the view cannot be prepared successfully, true otherwise
+     */
+    boolean createAndSendView(List<DistributionMessage> requests) {
       List<InternalDistributedMember> joinReqs = new ArrayList<InternalDistributedMember>();
       List<InternalDistributedMember> leaveReqs = new ArrayList<InternalDistributedMember>();
       List<InternalDistributedMember> removalReqs = new ArrayList<InternalDistributedMember>();
@@ -909,14 +1049,120 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
         newView = new NetView(localAddress, viewNumber, mbrs, leaveReqs,
             removalReqs);
       }
+      
       for (InternalDistributedMember mbr: joinReqs) {
         mbr.setVmViewId(newView.getViewId());
       }
       // send removal messages before installing the view so we stop
-      // getting messages from them
+      // getting messages from members that have been kicked out
       sendRemoveMessages(removalReqs, removalReasons, newView);
-      sendJoinResponses(joinReqs, newView);
+      
+      // we want to always check for quorum loss but don't act on it
+      // unless network-partition-detection is enabled
+      if ( !(checkForPartition(newView) && quorumRequired) ) {
+        sendJoinResponses(joinReqs, newView);
+      }
+
+      if (quorumRequired) {
+        boolean prepared = false;
+        do {
+          if (this.shutdown || Thread.currentThread().isInterrupted()) {
+            return false;
+          }
+          prepared = prepareView(newView);
+          if (!prepared && quorumRequired) {
+            Set<InternalDistributedMember> unresponsive = prepareResponses.getUnresponsiveMembers();
+            try {
+              removeHealthyMembers(unresponsive);
+            } catch (InterruptedException e) {
+              // abort the view if interrupted
+              shutdown = true;
+              return false;
+            }
+  
+            List<InternalDistributedMember> failures = new ArrayList<InternalDistributedMember>(currentView.getCrashedMembers().size() + unresponsive.size());
+            failures.addAll(unresponsive);
+            
+            NetView conflictingView = prepareResponses.getConflictingView();
+            if (conflictingView != null
+                && !conflictingView.getCreator().equals(localAddress)
+                && conflictingView.getViewId() > newView.getViewId()
+                && (lastConflictingView == null || conflictingView.getViewId() > lastConflictingView.getViewId())) {
+              lastConflictingView = conflictingView;
+              failures.addAll(conflictingView.getCrashedMembers());
+            }
+  
+            failures.removeAll(removalReqs);
+            if (failures.size() > 0) {
+              // abort the current view and try again
+              removalReqs.addAll(failures);
+              newView = new NetView(localAddress, newView.getViewId()+1, newView.getMembers(), leaveReqs,
+                  removalReqs);
+            }
+          }
+        } while (!prepared);
+      } // quorumRequired
+      
+      lastConflictingView = null;
+      
       sendView(newView);
+      return true;
+    }
+    
+    /**
+     * performs health checks on the collection of members, removing any that
+     * are found to be healthy
+     * @param mbrs
+     */
+    private void removeHealthyMembers(Collection<InternalDistributedMember> mbrs) throws InterruptedException {
+      List<Callable<InternalDistributedMember>> checkers = new ArrayList<Callable<InternalDistributedMember>>(mbrs.size()); 
+      
+      for (InternalDistributedMember mbr: mbrs) {
+        final InternalDistributedMember fmbr = mbr;
+        checkers.add(new Callable<InternalDistributedMember>() {
+          @Override
+          public InternalDistributedMember call() throws Exception {
+            // return the member id if it fails health checks
+            logger.info("checking state of member " + fmbr);
+            if (services.getHealthMonitor().checkIfAvailable(fmbr, "Member failed to acknowledge a membership view", false)) {
+              logger.info("member " + fmbr + " passed availability check");
+              return null;
+            }
+            logger.info("member " + fmbr + " failed availability check");
+            return fmbr;
+          }
+        });
+      }
+      
+      ExecutorService svc = Executors.newFixedThreadPool(mbrs.size(), new ThreadFactory() {
+        AtomicInteger i = new AtomicInteger();
+        @Override
+        public Thread newThread(Runnable r) {
+          return new Thread(Services.getThreadGroup(), r,
+              "Member verification thread " + i.incrementAndGet());
+        }
+      });
+
+      try {
+        List<Future<InternalDistributedMember>> futures;
+        futures = svc.invokeAll(checkers);
+
+        for (Future<InternalDistributedMember> future: futures) {
+          try {
+            InternalDistributedMember mbr = future.get(viewAckTimeout, TimeUnit.MILLISECONDS);
+            if (mbr != null) {
+              logger.debug("disregarding lack of acknowledgement from {}", mbr);
+              mbrs.remove(mbr);
+            }
+          } catch (java.util.concurrent.TimeoutException e) {
+            // TODO should the member be removed if we can't verify it in time?
+          } catch (ExecutionException e) {
+            logger.info("unexpected exception caught during member verification", e);
+          }
+        }
+      } finally {
+        svc.shutdownNow();
+      }
     }
   }