This is an automated email from the ASF dual-hosted git repository. bschuchardt pushed a commit to branch feature/GEODE-7760b in repository https://gitbox.apache.org/repos/asf/geode.git
commit 6d82edf5901df9d6e57517cb04162e17ac268a78 Author: Bruce Schuchardt <[email protected]> AuthorDate: Mon Feb 10 09:23:21 2020 -0800 GEODE-7760: fixing LocatorUDPSecurityDUnitTest.testCrashLocatorMultipleTimes This new test exposed a flaw in auto-reconnect where the quorum-checker buffers messages from other members but the new Membership messenger is unable to decrypt them when it starts up due to not having the old encryption keys. The encrypt/decrypt objects from the old Membership are now kept and provided to the new Messenger during auto-reconnect. --- .../distributed/LocatorUDPSecurityDUnitTest.java | 1 + .../gms/messenger/GMSQuorumCheckerJUnitTest.java | 20 ++++++++++---------- .../gms/messenger/JGroupsMessengerJUnitTest.java | 2 +- .../membership/gms/messenger/GMSQuorumChecker.java | 8 ++++++-- .../membership/gms/messenger/JGroupsMessenger.java | 4 +++- .../gms/messenger/MembershipInformationImpl.java | 10 +++++++++- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java index ab778c2..474adc8 100644 --- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java +++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java @@ -36,6 +36,7 @@ public class LocatorUDPSecurityDUnitTest extends LocatorDUnitTest { p.setProperty(SECURITY_UDP_DHALGO, "AES:128"); } + @Test public void testLocatorWithUDPSecurityButServer() { String locators = hostName + "[" + port1 + "]"; diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumCheckerJUnitTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumCheckerJUnitTest.java index e7c2a5c..b514486 100644 --- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumCheckerJUnitTest.java +++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumCheckerJUnitTest.java @@ -76,7 +76,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertTrue(quorum); @@ -96,7 +96,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertTrue(quorum); @@ -111,7 +111,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertFalse(quorum); @@ -125,7 +125,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertFalse(quorum); @@ -152,7 +152,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertTrue(quorum); @@ -182,7 +182,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertTrue(quorum); @@ -215,7 +215,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertFalse(quorum); @@ -246,7 +246,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertFalse(quorum); @@ -270,7 +270,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertTrue(quorum); @@ -295,7 +295,7 @@ public class GMSQuorumCheckerJUnitTest { PingMessageAnswer answerer = new PingMessageAnswer(channel, pongResponders); Mockito.doAnswer(answerer).when(channel).send(any(Message.class)); - GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel); + GMSQuorumChecker qc = new GMSQuorumChecker(view, 51, channel, null); qc.initialize(); boolean quorum = qc.checkForQuorum(500); assertFalse(quorum); diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java index dfec870..0e0748d 100755 --- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java +++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java @@ -883,7 +883,7 @@ public class JGroupsMessengerJUnitTest { initMocks(false, true); ((TestMembershipConfig) membershipConfig).oldMembershipInfo = new MembershipInformationImpl(messenger.myChannel, - new ConcurrentLinkedQueue<>()); + new ConcurrentLinkedQueue<>(), null); JGroupsMessenger newMessenger = new JGroupsMessenger(); newMessenger.init(services); newMessenger.start(); diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumChecker.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumChecker.java index fc8a116..273caf1 100644 --- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumChecker.java +++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSQuorumChecker.java @@ -45,6 +45,8 @@ import org.apache.geode.logging.internal.log4j.api.LogService; */ public class GMSQuorumChecker<ID extends MemberIdentifier> implements QuorumChecker { private static final Logger logger = LogService.getLogger(); + + private final GMSEncrypt encrypt; private boolean isInfoEnabled = false; private Map<SocketAddress, ID> addressConversionMap; private GMSPingPonger pingPonger; @@ -60,10 +62,12 @@ public class GMSQuorumChecker<ID extends MemberIdentifier> implements QuorumChec private final long partitionThreshold; private ConcurrentLinkedQueue<Message> messageQueue = new ConcurrentLinkedQueue<>(); - public GMSQuorumChecker(GMSMembershipView<ID> jgView, int partitionThreshold, JChannel channel) { + public GMSQuorumChecker(GMSMembershipView<ID> jgView, int partitionThreshold, JChannel channel, + GMSEncrypt encrypt) { this.lastView = jgView; this.partitionThreshold = partitionThreshold; this.channel = channel; + this.encrypt = encrypt; } public void initialize() { @@ -119,7 +123,7 @@ public class GMSQuorumChecker<ID extends MemberIdentifier> implements QuorumChec @Override public MembershipInformation getMembershipInfo() { - return new MembershipInformationImpl(channel, messageQueue); + return new MembershipInformationImpl(channel, messageQueue, encrypt); } private boolean calculateQuorum() { diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java index fb77d13..a3c9413 100644 --- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java +++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java @@ -336,6 +336,7 @@ public class JGroupsMessenger<ID extends MemberIdentifier> implements Messenger< MembershipInformationImpl oldInfo = (MembershipInformationImpl) oldDSMembershipInfo; myChannel = oldInfo.getChannel(); queuedMessagesFromReconnect = oldInfo.getQueuedMessages(); + encrypt = oldInfo.getEncrypt(); // scrub the old channel ViewId vid = new ViewId(new JGAddress(), 0); @@ -1248,7 +1249,8 @@ public class JGroupsMessenger<ID extends MemberIdentifier> implements Messenger< } } GMSQuorumChecker<ID> qc = - new GMSQuorumChecker<>(view, services.getConfig().getLossThreshold(), this.myChannel); + new GMSQuorumChecker<>(view, services.getConfig().getLossThreshold(), this.myChannel, + encrypt); qc.initialize(); return qc; } diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/MembershipInformationImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/MembershipInformationImpl.java index c46df62..aa10dcb 100644 --- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/MembershipInformationImpl.java +++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/MembershipInformationImpl.java @@ -28,12 +28,20 @@ import org.apache.geode.distributed.internal.membership.api.MembershipInformatio public class MembershipInformationImpl implements MembershipInformation { private final JChannel channel; private final Queue<Message> queuedMessages; + private final GMSEncrypt encrypt; protected MembershipInformationImpl(JChannel channel, - Queue<Message> queuedMessages) { + Queue<Message> queuedMessages, + GMSEncrypt encrypt) { this.channel = channel; this.queuedMessages = queuedMessages; + this.encrypt = encrypt; + } + + + public GMSEncrypt getEncrypt() { + return encrypt; } public JChannel getChannel() {
