GEODE-1372 Fixed review comments. Added api docs. Removed statis in GMSEncrpt and made that functionality in GMSLocator. Added system property for #of encryptors. Fixed test issue
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/5cb50091 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/5cb50091 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/5cb50091 Branch: refs/heads/develop Commit: 5cb50091a801b2dfd1b71747d946027a7efcaafc Parents: 9f7091f Author: Hitesh Khamesra <[email protected]> Authored: Mon Aug 29 10:36:38 2016 -0700 Committer: Hitesh Khamesra <[email protected]> Committed: Mon Aug 29 10:39:19 2016 -0700 ---------------------------------------------------------------------- .../distributed/ConfigurationProperties.java | 6 +- .../membership/InternalDistributedMember.java | 28 +++++++ .../internal/membership/MemberFactory.java | 1 - .../internal/membership/MemberServices.java | 1 - .../internal/membership/gms/GMSMember.java | 19 +---- .../internal/membership/gms/Services.java | 8 ++ .../membership/gms/interfaces/JoinLeave.java | 2 - .../membership/gms/interfaces/Messenger.java | 28 ++++++- .../membership/gms/locator/GMSLocator.java | 21 ++++-- .../membership/gms/membership/GMSJoinLeave.java | 35 ++++----- .../membership/gms/messenger/GMSEncrypt.java | 78 ++++++-------------- .../gms/messenger/JGroupsMessenger.java | 63 +++------------- .../messenger/JGroupsMessengerJUnitTest.java | 6 +- .../sanctionedDataSerializables.txt | 6 +- 14 files changed, 144 insertions(+), 158 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/ConfigurationProperties.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/ConfigurationProperties.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/ConfigurationProperties.java index aaad75e..e02f470 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/ConfigurationProperties.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/ConfigurationProperties.java @@ -1203,7 +1203,11 @@ public interface ConfigurationProperties { String SECURITY_CLIENT_DHALGO = SECURITY_PREFIX + "client-dhalgo"; /** * The static String definition of the <i>"security-udp-dhalgo"</i> - * property + * property. Application can set this property to valid symmetric key + * algorithm, to encrypt udp messages in Geode. Geode will generate + * symmetric key using Diffie-Hellman key exchange algorithm between + * peers. That key further used by specified algorithm to encrypt the + * udp messages. */ String SECURITY_UDP_DHALGO = SECURITY_PREFIX + "udp-dhalgo"; /** http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java index 54a0997..ead2c89 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java @@ -1293,4 +1293,32 @@ public class InternalDistributedMember return size; } + + public static class InternalDistributedMemberWrapper { + InternalDistributedMember mbr; + + public InternalDistributedMemberWrapper(InternalDistributedMember m) { + this.mbr = m; + } + + public InternalDistributedMember getMbr() { + return mbr; + } + + @Override + public int hashCode() { + return mbr.hashCode(); + } + + @Override + public boolean equals(Object obj) { + InternalDistributedMember other = ((InternalDistributedMemberWrapper)obj).mbr; + return mbr.compareTo(other, false, false) == 0; + } + + @Override + public String toString() { + return "InternalDistrubtedMemberWrapper [mbr=" + mbr + "]"; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberFactory.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberFactory.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberFactory.java index 1f4751b..f10731b 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberFactory.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberFactory.java @@ -95,7 +95,6 @@ public class MemberFactory { /** * currently this is a test method but it ought to be used by InternalLocator * to create the peer location TcpHandler - * @param securityUDPDHAlgo TODO */ static public NetLocator newLocatorHandler(InetAddress bindAddress, File stateFile, http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberServices.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberServices.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberServices.java index 236ac43..235373f 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberServices.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/MemberServices.java @@ -81,7 +81,6 @@ public interface MemberServices { /** * currently this is a test method but it ought to be used by InternalLocator * to create the peer location TcpHandler - * @param securityUDPDHAlgo TODO */ public abstract NetLocator newLocatorHandler(InetAddress bindAddress, File stateFile, String locatorString, boolean usePreferredCoordinators, http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java index b7754ce..969933b 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java @@ -407,7 +407,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID { @Override public void toData(DataOutput out) throws IOException { - writeShallowData(out); + writeEssentialData(out); out.writeInt(directPort); out.writeByte(memberWeight); out.writeByte(vmKind); @@ -417,7 +417,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID { DataSerializer.writeStringArray(groups, out); } - public void writeShallowData(DataOutput out) throws IOException { + public void writeEssentialData(DataOutput out) throws IOException { Version.writeOrdinal(out, this.versionOrdinal, true); int flags = 0; @@ -435,7 +435,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID { @Override public void fromData(DataInput in) throws IOException, ClassNotFoundException { - readShallowData(in); + readEssentialData(in); this.directPort = in.readInt(); this.memberWeight = in.readByte(); this.vmKind = in.readByte(); @@ -445,7 +445,7 @@ public class GMSMember implements NetMember, DataSerializableFixedID { this.groups = DataSerializer.readStringArray(in); } - public void readShallowData(DataInput in) throws IOException, ClassNotFoundException { + public void readEssentialData(DataInput in) throws IOException, ClassNotFoundException { this.versionOrdinal = Version.readOrdinal(in); int flags = in.readShort(); @@ -473,15 +473,4 @@ public class GMSMember implements NetMember, DataSerializableFixedID { this.uuidLSBs = in.readLong(); memberWeight = (byte)(in.readByte() & 0xFF); } - - public static void writeShallowNetMember(GMSMember mbr, DataOutput out) throws IOException { - mbr.writeShallowData(out); - } - - public static GMSMember readShallowNetMember(DataInput in) throws ClassNotFoundException, IOException { - GMSMember mbr = new GMSMember(); - mbr.readShallowData(in); - - return mbr; - } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java index 5bc006f..9ff1636 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/Services.java @@ -29,6 +29,7 @@ import com.gemstone.gemfire.distributed.internal.membership.NetView; 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.*; +import com.gemstone.gemfire.distributed.internal.membership.gms.locator.GMSLocator; 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; @@ -357,6 +358,13 @@ public class Services { return !getConfig().getDistributionConfig().getDisableAutoReconnect(); } + public byte[] getPublicKey(InternalDistributedMember mbr) { + if(locator != null) { + return ((GMSLocator)locator).getPublicKey(mbr); + } + return null; + } + public class Stopper extends CancelCriterion { volatile String reasonForStopping = null; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/JoinLeave.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/JoinLeave.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/JoinLeave.java index 3bacaf4..202a125 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/JoinLeave.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/JoinLeave.java @@ -20,7 +20,6 @@ import com.gemstone.gemfire.distributed.DistributedMember; import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember; import com.gemstone.gemfire.distributed.internal.membership.NetMember; import com.gemstone.gemfire.distributed.internal.membership.NetView; -import com.gemstone.gemfire.distributed.internal.membership.gms.GMSMember; public interface JoinLeave extends Service { @@ -53,7 +52,6 @@ public interface JoinLeave extends Service { /** * Get "InternalDistributedMember" from current view or prepared view. - * */ InternalDistributedMember getMemberID(NetMember m); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Messenger.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Messenger.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Messenger.java index 3e9a2dc..18f1529 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Messenger.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/interfaces/Messenger.java @@ -87,15 +87,41 @@ public interface Messenger extends Service { */ void waitForMessageState(InternalDistributedMember member, Map state) throws InterruptedException; - byte[] getPublickey(InternalDistributedMember mbr); + /** + * Get the public key of member. + * @param mbr + * @return + */ + byte[] getPublicKey(InternalDistributedMember mbr); + + /** + * Set public key of member. + * @param publickey + * @param mbr + */ void setPublicKey(byte[] publickey, InternalDistributedMember mbr); + /** + * Set cluster key in local member.Memebr calls when it gets cluster key in join response + * @param clusterSecretKey + */ void setClusterSecretKey(byte[] clusterSecretKey); + /** + * To retrieve the cluster key. This needs to send cluster key to new memebr. + * @return + */ byte[] getClusterSecretKey(); + /** + * To set requestId in request. This requestId comes back in response to match the request. + * @return + */ int getRequestId(); + /** + * Initialize the cluster key, this happens when member becomes coordinator. + */ void initClusterKey(); } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java index 44e5ce8..69a1f60 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java @@ -30,7 +30,9 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import com.gemstone.gemfire.InternalGemFireException; @@ -45,11 +47,11 @@ import com.gemstone.gemfire.distributed.internal.SharedConfiguration; import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember; import com.gemstone.gemfire.distributed.internal.membership.MembershipManager; import com.gemstone.gemfire.distributed.internal.membership.NetView; +import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember.InternalDistributedMemberWrapper; 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.Services; import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Locator; -import com.gemstone.gemfire.distributed.internal.membership.gms.messenger.GMSEncrypt; import com.gemstone.gemfire.distributed.internal.membership.gms.mgr.GMSMembershipManager; import com.gemstone.gemfire.distributed.internal.tcpserver.TcpClient; import com.gemstone.gemfire.distributed.internal.tcpserver.TcpServer; @@ -75,6 +77,7 @@ public class GMSLocator implements Locator, NetLocator { private InternalDistributedMember localAddress; private final Set<InternalDistributedMember> registrants = new HashSet<>(); + public Map<InternalDistributedMemberWrapper, byte[]> registerMbrVsPK = new ConcurrentHashMap<>(); /** * The current membership view, or one recovered from disk. @@ -91,7 +94,7 @@ public class GMSLocator implements Locator, NetLocator { * @param usePreferredCoordinators true if the membership coordinator should be a Locator * @param networkPartitionDetectionEnabled true if network partition detection is enabled * @param stats the locator statistics object - * @param securityUDPDHAlgo TODO + * @param securityUDPDHAlgo DF algorithm */ public GMSLocator( InetAddress bindAddress, File stateFile, @@ -185,7 +188,8 @@ public class GMSLocator implements Locator, NetLocator { if(services != null) { services.getMessenger().setPublicKey(findRequest.getMyPublicKey(), findRequest.getMemberID()); } else { - GMSEncrypt.registerMember(findRequest.getMyPublicKey(), findRequest.getMemberID()); + //GMSEncrypt.registerMember(findRequest.getMyPublicKey(), findRequest.getMemberID()); + registerMbrVsPK.put(new InternalDistributedMemberWrapper(findRequest.getMemberID()), findRequest.getMyPublicKey()); } if (findRequest.getMemberID() != null) { InternalDistributedMember coord = null; @@ -252,9 +256,10 @@ public class GMSLocator implements Locator, NetLocator { } if (coordPk == null) { if(services != null){ - coordPk = services.getMessenger().getPublickey(coord); + coordPk = services.getMessenger().getPublicKey(coord); } else { - coordPk = GMSEncrypt.getRegisteredPublicKey(coord); + //coordPk = GMSEncrypt.getRegisteredPublicKey(coord); + coordPk = registerMbrVsPK.get(new InternalDistributedMemberWrapper(coord)); } } response = new FindCoordinatorResponse(coord, localAddress, @@ -308,10 +313,14 @@ public class GMSLocator implements Locator, NetLocator { stats.endLocatorResponse(startTime); } + public byte[] getPublicKey(InternalDistributedMember mbr) { + return registerMbrVsPK.get(new InternalDistributedMemberWrapper(mbr)); + } + @Override public void shutDown() { // nothing to do for GMSLocator - GMSEncrypt.clear(); + registerMbrVsPK.clear(); } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java index 5f4a6e6..1c6cf16 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java @@ -847,7 +847,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { pendingRemovals.removeAll(view.getCrashedMembers()); viewReplyProcessor.initialize(id, responders); viewReplyProcessor.processPendingRequests(pendingLeaves, pendingRemovals); - addPublickeysToView(view); + addPublicKeysToView(view); services.getMessenger().send(msg); // only wait for responses during preparation @@ -875,8 +875,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { return true; } - private void addPublickeysToView(NetView view) { - //TODO: is this check is correct + private void addPublicKeysToView(NetView view) { String sDHAlgo = services.getConfig().getDistributionConfig().getSecurityUDPDHAlgo(); if (sDHAlgo != null && !sDHAlgo.isEmpty()) { List<InternalDistributedMember> mbrs = view.getMembers(); @@ -884,7 +883,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { while (itr.hasNext()) { InternalDistributedMember mbr = itr.next(); - byte[] pk = services.getMessenger().getPublickey(mbr); + byte[] pk = services.getMessenger().getPublicKey(mbr); view.setPublicKey(mbr, pk); } } @@ -893,7 +892,10 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { NetView view = m.getView(); + //If our current view doesn't contaion sender then we wanrt to ignore that view. if(currentView != null && !currentView.contains(m.getSender())) { + //but if preparedView contains sender then we don't want to ignore that view. + //this may happen when we locator re-join and it take over coordinator's responsibility. if(this.preparedView == null || !this.preparedView.contains(m.getSender())) { logger.info("Ignoring the view {} from member {}, which is not in my current view {} ", view, m.getSender(), currentView); @@ -994,7 +996,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { String dhalgo = services.getConfig().getDistributionConfig().getSecurityUDPDHAlgo(); FindCoordinatorRequest request = new FindCoordinatorRequest(this.localAddress, state.alreadyTried, state.viewId, - services.getMessenger().getPublickey(localAddress), services.getMessenger().getRequestId(), dhalgo); + services.getMessenger().getPublicKey(localAddress), services.getMessenger().getRequestId(), dhalgo); Set<InternalDistributedMember> possibleCoordinators = new HashSet<InternalDistributedMember>(); Set<InternalDistributedMember> coordinatorsWithView = new HashSet<InternalDistributedMember>(); @@ -1128,17 +1130,19 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { String dhalgo = services.getConfig().getDistributionConfig().getSecurityUDPDHAlgo(); if (!dhalgo.isEmpty()) { + //Here we are sending message one-by-one to all recipients as we don't have cluster secret key yet. + //Usually this happens when locator re-joins the cluster and it has saved view. for (InternalDistributedMember mbr : v.getMembers()) { Set<InternalDistributedMember> r = new HashSet<>(); r.add(mbr); - FindCoordinatorRequest req = new FindCoordinatorRequest(localAddress, state.alreadyTried, state.viewId, services.getMessenger().getPublickey( + FindCoordinatorRequest req = new FindCoordinatorRequest(localAddress, state.alreadyTried, state.viewId, services.getMessenger().getPublicKey( localAddress), services.getMessenger().getRequestId(), dhalgo); req.setRecipients(r); services.getMessenger().send(req, v); } } else { - FindCoordinatorRequest req = new FindCoordinatorRequest(localAddress, state.alreadyTried, state.viewId, services.getMessenger().getPublickey( + FindCoordinatorRequest req = new FindCoordinatorRequest(localAddress, state.alreadyTried, state.viewId, services.getMessenger().getPublicKey( localAddress), services.getMessenger().getRequestId(), dhalgo); req.setRecipients(v.getMembers()); @@ -1229,10 +1233,10 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { if (this.isJoined) { NetView v = currentView; resp = new FindCoordinatorResponse(v.getCoordinator(), localAddress, - services.getMessenger().getPublickey(v.getCoordinator()), req.getRequestId()); + services.getMessenger().getPublicKey(v.getCoordinator()), req.getRequestId()); } else { resp = new FindCoordinatorResponse(localAddress, localAddress, - services.getMessenger().getPublickey(localAddress), req.getRequestId()); + services.getMessenger().getPublicKey(localAddress), req.getRequestId()); } resp.setRecipient(req.getMemberID()); services.getMessenger().send(resp); @@ -2074,13 +2078,11 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { viewRequests.clear(); } - + NetView v = currentView; for (DistributionMessage msg : requests) { switch (msg.getDSFID()) { - case JOIN_REQUEST: - - NetView v = currentView; - logger.info("Informing to pending join requests {} myid {} coord {}", msg, localAddress, v.getCoordinator()); + case JOIN_REQUEST: + logger.debug("Informing to pending join requests {} myid {} coord {}", msg, localAddress, v.getCoordinator()); if (!v.getCoordinator().equals(localAddress)) { joinResponseSent = true; //lets inform that coordinator has been changed @@ -2226,9 +2228,6 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { return; } - //we already sent whrn we got join request - //sendJoinResponses(newView, joinReqs); - // send removal messages before installing the view so we stop // getting messages from members that have been kicked out sendRemoveMessages(removalReqs, removalReasons, oldIDs); @@ -2355,8 +2354,6 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { // we also send a join response so that information like the multicast message digest // can be transmitted to the new members w/o including it in the view message - //we already sent whrn we got join request - //sendJoinResponses(newView, joinReqs); if (markViewCreatorForShutdown && getViewCreator() != null) { shutdown = true; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/GMSEncrypt.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/GMSEncrypt.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/GMSEncrypt.java index ba049d2..6c41465 100755 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/GMSEncrypt.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/GMSEncrypt.java @@ -20,7 +20,6 @@ import java.math.BigInteger; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -34,13 +33,13 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember; +import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember.InternalDistributedMemberWrapper; import com.gemstone.gemfire.distributed.internal.membership.NetView; import com.gemstone.gemfire.distributed.internal.membership.gms.Services; import com.gemstone.gemfire.distributed.internal.DistributionConfig; public class GMSEncrypt implements Cloneable { - - public static Map<GMSEncrypt.InternalDistributedMemberWrapper, byte[]> registrants = new ConcurrentHashMap<>(); + public static long encodingsPerformed; public static long decodingsPerformed; @@ -73,11 +72,20 @@ public class GMSEncrypt implements Cloneable { private NetView view; - private int numberOfPeerEncryptorCopies = 10; + public static final int numberOfPeerEncryptorCopies = Integer.getInteger("GMSEncrypt.MAX_ENCRYPTORS", Math.max(Runtime.getRuntime().availableProcessors()*4, 16)).intValue(); + /** + * Keeps multiple copies for peer + */ private ConcurrentHashMap<InternalDistributedMember, PeerEncryptor>[] copyOfPeerEncryptors; - private ClusterEncryptor[] clusterEncryptors; + /** + * Keeps multiple copies of cluster keys + */ + private ClusterEncryptor[] copyOfClusterEncryptors; - private Map<GMSEncrypt.InternalDistributedMemberWrapper, byte[]> memberToPeerEncryptor = new ConcurrentHashMap<>(); + /** + * it keeps PK for peers + */ + private Map<InternalDistributedMemberWrapper, byte[]> memberToPeerEncryptor = new ConcurrentHashMap<>(); private ClusterEncryptor clusterEncryptor; @@ -102,7 +110,6 @@ public class GMSEncrypt implements Cloneable { } protected synchronized void addClusterKey(byte[] secretBytes) { - //TODO we are reseeting here, in case there is some race this.clusterEncryptor = new ClusterEncryptor(secretBytes); } @@ -110,19 +117,8 @@ public class GMSEncrypt implements Cloneable { initEncryptors(); } - public static void registerMember(byte[] pk, InternalDistributedMember mbr) { - if (pk != null) { - registrants.put(new GMSEncrypt.InternalDistributedMemberWrapper(mbr), pk); - } - } - - public static void clear() { - registrants.clear(); - } - - public static byte[] getRegisteredPublicKey(InternalDistributedMember mbr) { - InternalDistributedMemberWrapper m = new InternalDistributedMemberWrapper(mbr); - return registrants.get(m); + private byte[] getRegisteredPublicKey(InternalDistributedMember mbr) { + return services.getPublicKey(mbr); } public GMSEncrypt(Services services) throws Exception { @@ -140,7 +136,7 @@ public class GMSEncrypt implements Cloneable { void initEncryptors() { copyOfPeerEncryptors = new ConcurrentHashMap[numberOfPeerEncryptorCopies]; - clusterEncryptors = new ClusterEncryptor[numberOfPeerEncryptorCopies]; + copyOfClusterEncryptors = new ClusterEncryptor[numberOfPeerEncryptorCopies]; } public byte[] decryptData(byte[] data, InternalDistributedMember member) throws Exception { @@ -203,6 +199,7 @@ public class GMSEncrypt implements Cloneable { GMSEncrypt gmsEncrypt = new GMSEncrypt(); gmsEncrypt.localMember = this.localMember; gmsEncrypt.dhSKAlgo = this.dhSKAlgo; + gmsEncrypt.services = this.services; X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(this.dhPublicKey.getEncoded()); KeyFactory keyFact = KeyFactory.getInstance("DH"); @@ -241,35 +238,7 @@ public class GMSEncrypt implements Cloneable { dhPrivateKey = keypair.getPrivate(); dhPublicKey = keypair.getPublic(); } - } - - static class InternalDistributedMemberWrapper { - InternalDistributedMember mbr; - - public InternalDistributedMemberWrapper(InternalDistributedMember m) { - this.mbr = m; - } - - public InternalDistributedMember getMbr() { - return mbr; - } - - @Override - public int hashCode() { - return mbr.hashCode(); - } - - @Override - public boolean equals(Object obj) { - InternalDistributedMember other = ((InternalDistributedMemberWrapper)obj).mbr; - return mbr.compareTo(other, false, false) == 0; - } - - @Override - public String toString() { - return "InternalDistrubtedMemberWrapper [mbr=" + mbr + "]"; - } - } + } protected PeerEncryptor getPeerEncryptor(InternalDistributedMember member) throws Exception { Map<InternalDistributedMember, PeerEncryptor> m = getPeerEncryptorMap(); @@ -309,14 +278,14 @@ public class GMSEncrypt implements Cloneable { private ClusterEncryptor getClusterEncryptor() { int h = Math.abs(Thread.currentThread().getName().hashCode() % numberOfPeerEncryptorCopies); - ClusterEncryptor c = clusterEncryptors[h]; + ClusterEncryptor c = copyOfClusterEncryptors[h]; if(c == null) { - synchronized (copyOfPeerEncryptors) { - c = clusterEncryptors[h]; + synchronized (copyOfClusterEncryptors) { + c = copyOfClusterEncryptors[h]; if(c == null) { c = new ClusterEncryptor(getClusterSecretKey()); - clusterEncryptors[h] = c; + copyOfClusterEncryptors[h] = c; } } } @@ -592,7 +561,6 @@ public class GMSEncrypt implements Cloneable { */ protected class ClusterEncryptor{ byte[] secretBytes; - //TODO: need to look this is thread safe Cipher encrypt; Cipher decrypt; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java index f43c98d..ca23639 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java @@ -16,7 +16,6 @@ */ package com.gemstone.gemfire.distributed.internal.membership.gms.messenger; -import com.gemstone.gemfire.*; import static com.gemstone.gemfire.distributed.internal.membership.gms.GMSUtil.replaceStrings; import static com.gemstone.gemfire.internal.DataSerializableFixedID.JOIN_REQUEST; import static com.gemstone.gemfire.internal.DataSerializableFixedID.JOIN_RESPONSE; @@ -26,7 +25,6 @@ import static com.gemstone.gemfire.internal.DataSerializableFixedID.FIND_COORDIN import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -39,15 +37,15 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; -import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; import org.apache.logging.log4j.Logger; import org.jgroups.Address; @@ -103,30 +101,6 @@ import com.gemstone.gemfire.internal.tcp.MemberShunnedException; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import org.apache.logging.log4j.Logger; -import org.jgroups.*; -import org.jgroups.Message.Flag; -import org.jgroups.Message.TransientFlag; -import org.jgroups.conf.ClassConfigurator; -import org.jgroups.protocols.UDP; -import org.jgroups.protocols.pbcast.NAKACK2; -import org.jgroups.stack.IpAddress; -import org.jgroups.util.Digest; -import org.jgroups.util.UUID; - -import java.io.*; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.UnknownHostException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.*; - -import static com.gemstone.gemfire.distributed.internal.membership.gms.GMSUtil.replaceStrings; -import static com.gemstone.gemfire.internal.DataSerializableFixedID.JOIN_REQUEST; -import static com.gemstone.gemfire.internal.DataSerializableFixedID.JOIN_RESPONSE; @SuppressWarnings("StatementWithEmptyBody") public class JGroupsMessenger implements Messenger { @@ -747,8 +721,7 @@ public class JGroupsMessenger implements Messenger { Int2ObjectOpenHashMap<Message> messages = new Int2ObjectOpenHashMap<>(); long startSer = theStats.startMsgSerialization(); boolean firstMessage = true; - for (Iterator<GMSMember> it=calculatedMembers.iterator(); it.hasNext(); ) { - GMSMember mbr = it.next(); + for (GMSMember mbr : calculatedMembers ) { short version = mbr.getVersionOrdinal(); if ( !messages.containsKey(version) ) { Message jmsg = createJGMessage(msg, local, version); @@ -765,7 +738,7 @@ public class JGroupsMessenger implements Messenger { for (GMSMember mbr: calculatedMembers) { JGAddress to = new JGAddress(mbr); short version = mbr.getVersionOrdinal(); - Message jmsg = (Message)messages.get(version); + Message jmsg = messages.get(version); Exception problem = null; try { Message tmp = (i < (calculatedLen-1)) ? jmsg.copy(true) : jmsg; @@ -841,7 +814,6 @@ public class JGroupsMessenger implements Messenger { setMessageFlags(gfmsg, msg); try { long start = services.getStatistics().startMsgSerialization(); - byte[] messageBytes = null; HeapDataOutputStream out_stream = new HeapDataOutputStream(Version.fromOrdinalOrCurrent(version)); Version.CURRENT.writeOrdinal(out_stream, true); if(encrypt != null) { @@ -940,9 +912,8 @@ public class JGroupsMessenger implements Messenger { } byte[] serializeMessage(DistributionMessage gfmsg, HeapDataOutputStream out_stream) throws IOException { - - //DataSerializer.writeObject(this.localAddress.getShallowNetMember(), out_stream); - GMSMember.writeShallowNetMember((GMSMember)this.localAddress.getNetMember(), out_stream); + GMSMember m = (GMSMember)this.localAddress.getNetMember(); + m.writeEssentialData(out_stream); DataSerializer.writeObject(gfmsg, out_stream); return out_stream.toByteArray(); @@ -1054,8 +1025,6 @@ public class JGroupsMessenger implements Messenger { int requestId = dis.readInt(); long start = services.getStatistics().startUDPMsgDecryption(); try { - // TODO seems like we don't need this, just set bit that PK is appended - logger.debug("readEncryptedMessage Reading Request id " + dfsid + " and requestid is " + requestId + " myid " + this.localAddress); InternalDistributedMember pkMbr = null; boolean readPK = false; @@ -1104,13 +1073,6 @@ public class JGroupsMessenger implements Messenger { DistributionMessage result = deserializeMessage(in, ordinal); if (pk != null) { - - /*InternalDistributedMember mbr = null; - if (result instanceof JoinRequestMessage) { - mbr = ((JoinRequestMessage)result).getMemberID(); - } else { - mbr = ((FindCoordinatorRequest)result).getMemberID(); - }*/ logger.info("Setting public key for " + result.getSender() + " len " + pk.length); setPublicKey(pk, result.getSender()); } @@ -1126,8 +1088,8 @@ public class JGroupsMessenger implements Messenger { } DistributionMessage deserializeMessage(DataInputStream in, short ordinal) throws ClassNotFoundException, IOException { - GMSMember m = GMSMember.readShallowNetMember(in); - + GMSMember m = new GMSMember(); + m.readEssentialData(in); DistributionMessage result = (DistributionMessage) DataSerializer.readObject(in); setSender(result, m, ordinal); @@ -1352,7 +1314,7 @@ public class JGroupsMessenger implements Messenger { } @Override - public byte[] getPublickey(InternalDistributedMember mbr) { + public byte[] getPublicKey(InternalDistributedMember mbr) { if (encrypt != null) { return encrypt.getPublicKey(mbr); } @@ -1362,7 +1324,7 @@ public class JGroupsMessenger implements Messenger { @Override public void setPublicKey(byte[] publickey, InternalDistributedMember mbr) { if (encrypt != null) { - logger.debug("Setting pK for member " + mbr); + logger.debug("Setting PK for member " + mbr); encrypt.setPublicKey(publickey, mbr); } } @@ -1383,11 +1345,10 @@ public class JGroupsMessenger implements Messenger { return null; } - private Random randomId = new Random(); + private AtomicInteger requestId = new AtomicInteger((new Random().nextInt())); private HashMap<Integer, InternalDistributedMember> requestIdVsRecipients = new HashMap<>(); InternalDistributedMember getRequestedMember(int requestId) { - //TODO: what if we don't get response, need to remove this otherwise it will be leak return requestIdVsRecipients.remove(requestId); } @@ -1397,7 +1358,7 @@ public class JGroupsMessenger implements Messenger { @Override public int getRequestId() { - return randomId.nextInt(); + return requestId.incrementAndGet(); } @Override http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java index 00c9e32..ac19010 100755 --- a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java @@ -936,7 +936,7 @@ public class JGroupsMessengerJUnitTest { messenger.setPublicKey(otherMbrEncrptor.getPublicKeyBytes(), otherMbr); messenger.initClusterKey(); - FindCoordinatorRequest gfmsg = new FindCoordinatorRequest(messenger.getMemberID(), new ArrayList<InternalDistributedMember>(2), 1, messenger.getPublickey(messenger.getMemberID()), 1, ""); + FindCoordinatorRequest gfmsg = new FindCoordinatorRequest(messenger.getMemberID(), new ArrayList<InternalDistributedMember>(2), 1, messenger.getPublicKey(messenger.getMemberID()), 1, ""); Set<InternalDistributedMember> recipients = new HashSet<>(); recipients.add(otherMbr); gfmsg.setRecipients(recipients); @@ -967,7 +967,7 @@ public class JGroupsMessengerJUnitTest { NetView v = createView(otherMbr); GMSEncrypt otherMbrEncrptor = new GMSEncrypt(services); - otherMbrEncrptor.setPublicKey(messenger.getPublickey(messenger.getMemberID()), messenger.getMemberID()); + otherMbrEncrptor.setPublicKey(messenger.getPublicKey(messenger.getMemberID()), messenger.getMemberID()); messenger.setPublicKey(otherMbrEncrptor.getPublicKeyBytes(), otherMbr); messenger.initClusterKey(); @@ -1037,7 +1037,7 @@ public class JGroupsMessengerJUnitTest { NetView v = createView(otherMbr); GMSEncrypt otherMbrEncrptor = new GMSEncrypt(services); - otherMbrEncrptor.setPublicKey(messenger.getPublickey(messenger.getMemberID()), messenger.getMemberID()); + otherMbrEncrptor.setPublicKey(messenger.getPublicKey(messenger.getMemberID()), messenger.getMemberID()); messenger.setPublicKey(otherMbrEncrptor.getPublicKeyBytes(), otherMbr); messenger.initClusterKey(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/5cb50091/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt ---------------------------------------------------------------------- diff --git a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt index 9fc642d..059477c 100644 --- a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt +++ b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt @@ -290,7 +290,7 @@ fromDataPre_GFE_7_1_0_0,292,2bb8009d4d2bb9009e01003e2a2bb8008ab500062ab200039900 fromDataPre_GFE_9_0_0_0,296,2bb8009d4d2bb9009e01003e2a2bb8008ab500062ab2000399000e2c2ab40006b8009fa700072cb60007b500062bb900a0010036041504047e99000704a700040336051504057e99000704a700040336062a1504077e99000704a7000403b5003a2a2bb9009e0100b500112a2bb9009e0100b500022a2bb900a00100b500132a2bb8008cb500202a2bb8008ab500182ab40013100da0000e2a2bb8008ab50019a700172bb8008a3a071907c6000c2a1907b800a1b500142bb8008a3a072bb8008db6008e36082abb008f5919071508b70090b5001e2a15042bb70091bb0034592ab400112ab400022ab400132ab400142ab400182ab400202ab4001eb700353a092a2c1d150515062ab4001b1909b80028b500292ab7000b2ab400139e000704a7000403b80043b1 toData,29,2a2bb600962ab4001bb20092b60072a1000d2ab600972bb900860200b1 toDataPre_GFE_7_1_0_0,226,2ab400139e000704a7000403b800432ab600502bb800982b2ab6004fb9009902002ab400062bb8007d033d2ab40029b9007e01009900071c04803d2ab40029b9006d01009900071c05803d2ab4003a9900071c07803d2b1c1100ff7e91b9009a02002b2ab40011b9009902002b2ab40002b9009902002b2ab40013b9009a02002ab400202bb800802ab400182bb8007d2ab40013100da0000e2ab400192bb8007da7000e2ab40014b8009b2bb8007d2ab4001ec700081247a7000a2ab4001eb600812bb8007d2ab4001ec7000911012ca7000a2ab4001eb60082b800832bb80084b1 -toDataPre_GFE_9_0_0_0,240,2ab400139e000704a7000403b800432ab600502bb800982b2ab6004fb9009902002ab400062bb8007d033d2ab40029b9007e01009900071c04803d2ab40029b9006d01009900071c05803d2ab4003a9900071c07803d1c1008803d2b1c1100ff7e91b9009a02002b2ab40011b9009902002b2ab40002b9009902002b2ab40013b9009a02002ab400202bb800802ab400182bb8007d2ab40013100da0000e2ab400192bb8007da7000e2ab40014b8009b2bb8007d2ab4001ec700081247a7000a2ab4001eb600812bb8007d2ab4001ec7000911012ca7000a2ab4001eb60082b800832bb800842b2ab4001b04b80085b1 +toDataPre_GFE_9_0_0_0,225,2ab600502bb800982b2ab6004fb9009902002ab400062bb8007d033d2ab40029b9007e01009900071c04803d2ab40029b9006d01009900071c05803d2ab4003a9900071c07803d1c1008803d2b1c1100ff7e91b9009a02002b2ab40011b9009902002b2ab40002b9009902002b2ab40013b9009a02002ab400202bb800802ab400182bb8007d2ab40013100da0000e2ab400192bb8007da7000e2ab40014b8009b2bb8007d2ab4001ec700081247a7000a2ab4001eb600812bb8007d2ab4001ec7000911012ca7000a2ab4001eb60082b800832bb800842b2ab4001b04b80085b1 com/gemstone/gemfire/distributed/internal/membership/NetView,2 fromData,98,2a2bb8006ec0002bb500112a2bb9006f0100b500062a2bb80070b50009b200409a00122ab40009c7000bbb004159b70042bf2abb000a592ab40009b7000bb5000c2a2bb80071b5000e2a2bb80071b500102a2bb80072b500052a2bb80073b50004b1 @@ -989,8 +989,8 @@ fromData,17,2a2bb80005b500022a2bb80005b50003b1 toData,17,2ab400022bb800042ab400032bb80004b1 com/gemstone/gemfire/internal/cache/EntryEventImpl,2 -fromData,216,2a2bb80013c00014b500152bb800134d2bb800134e2abb0016592c2d01b70017b500182a2bb900190100b8001ab5001b2a2bb9001c0100b500082ab400182bb80013b6001d2a2bb80013c0001eb500092bb9001f0100990013b200209a003cbb0021591222b70023bf2bb9001f01009900212a2bb80024b500252a2ab40025b500062a2ab40025b80026b50005a7000b2a2bb80013b500052bb9001f01009900192a2bb80024b500272a2ab40027b80026b50007a7000b2a2bb80013b500072a2bb80028b500292a2bb8002ab5000a2a2bb8002bb50011b1 -toData,279,2ab400152bb801452ab600882bb801452ab40018b601722bb801452b2ab4001bb40173b9017402002b2ab4000811c03f7eb9017502002ab600462bb801452ab400092bb801452b03b9017602002ab6003c4d2cc1007d3e1d99000d2cc0007db900a801003e2b1db9017602001d99003b2ab40025c6000e2ab400252bb80177a7002e2ab40006c6000e2ab400062bb80177a7001c2cc0007d3a041904b900b601002bb80178a700082c2bb801452ab7003e4d2cc1007d3e1d99000d2cc0007db900a801003e2b1db9017602001d9900292ab40027c6000e2ab400272bb80177a7001c2cc0007d3a041904b900b601002bb80178a700082c2bb801452ab40029c001792bb8017a2ab600542bb801452ab400112bb8017bb1 +fromData,216,2a2bb80016c00017b500182bb800164d2bb800164e2abb0019592c2d01b7001ab5001b2a2bb9001c0100b8001db5001e2a2bb9001f0100b500082ab4001b2bb80016b600202a2bb80016c00021b500092bb900220100990013b200239a003cbb0024591225b70026bf2bb9002201009900212a2bb80027b500282a2ab40028b500062a2ab40028b80029b50005a7000b2a2bb80016b500052bb9002201009900192a2bb80027b5002a2a2ab4002ab80029b50007a7000b2a2bb80016b500072a2bb8002bb5002c2a2bb8002db5000a2a2bb8002eb50013b1 +toData,279,2ab400182bb801482ab600892bb801482ab4001bb601752bb801482b2ab4001eb40176b9017702002b2ab4000811c03f7eb9017802002ab600492bb801482ab400092bb801482b03b9017902002ab6003f4d2cc100803e1d99000d2cc00080b900a901003e2b1db9017902001d99003b2ab40028c6000e2ab400282bb8017aa7002e2ab40006c6000e2ab400062bb8017aa7001c2cc000803a041904b900b701002bb8017ba700082c2bb801482ab700414d2cc100803e1d99000d2cc00080b900a901003e2b1db9017902001d9900292ab4002ac6000e2ab4002a2bb8017aa7001c2cc000803a041904b900b701002bb8017ba700082c2bb801482ab4002cc0017c2bb8017d2ab600572bb801482ab400132bb8017eb1 com/gemstone/gemfire/internal/cache/EntrySnapshot,2 fromData,50,2a03b500052bb9004101003d1c9900112abb000759b70042b50004a7000e2abb000359b70043b500042ab400042bb60044b1
