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();
+ }
}
}