This is an automated email from the ASF dual-hosted git repository.
bschuchardt pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new 0afb75b GEODE-4362: view preparation throws uncaught RuntimeException
0afb75b is described below
commit 0afb75bbaef7dfba7bfba70d8de0617c30db99c2
Author: Bruce Schuchardt <[email protected]>
AuthorDate: Tue Feb 27 09:05:47 2018 -0800
GEODE-4362: view preparation throws uncaught RuntimeException
The problem was happening when a new member joined with a coordinator that
suddenly shuts down before other members have been told to install the
new membership view. They've received a "prepare for view change" message
containing the new view but have not been told to commit that change.
Another member then becomes coordinator and sees that there was a new member
in the prepared view. It picks this up and adds it to the new view it
sends out.
The problem was that the public encryption keys of the members weren't
being transferred from the old view to the new view and when looking for
public keys we were fishing them out of GMSEncrypt instead of getting
them from the membership view. This caused an NPE to be thrown when trying
to fish out the public key of the new member - GMSEncrypt didn't know about
this new member because the view containing it was never installed - it
was only prepared.
The fix is to transfer the public keys from the old view to the new one and
to look for public keys in the view instead of GMSEncrypt.
This closes #1520
---
.../membership/InternalDistributedMember.java | 42 +----------
.../membership/gms/locator/GMSLocator.java | 2 +-
.../membership/gms/membership/GMSJoinLeave.java | 20 +++---
.../membership/gms/messenger/GMSEncrypt.java | 81 +++++++++-------------
.../apache/geode/distributed/LocatorDUnitTest.java | 5 --
.../gms/membership/GMSJoinLeaveJUnitTest.java | 67 +++++++++++++++---
.../gms/membership/GMSJoinLeaveTestHelper.java | 15 ++--
.../gms/messenger/GMSEncryptJUnitTest.java | 1 -
8 files changed, 104 insertions(+), 129 deletions(-)
diff --git
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
index f17a766..ebe1e60 100755
---
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
+++
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
@@ -153,7 +153,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
this.hostName = SocketCreator.resolve_dns ?
SocketCreator.getHostName(m.getInetAddress())
: m.getInetAddress().getHostAddress();
- // checkHostName();
short version = m.getVersionOrdinal();
try {
@@ -176,15 +175,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
this.netMbr = m;
}
- // private void checkHostName() {
- // // bug #44858: debug method to find who is putting a host name instead of
addr into an ID
- // if (!SocketCreator.resolve_dns
- // && this.hostName != null && this.hostName.length() > 0
- // && !Character.isDigit(this.hostName.charAt(0))) {
- // throw new RuntimeException("found hostname that doesn't start with a
digit: " + this.hostName);
- // }
- // }
-
/**
* Create a InternalDistributedMember referring to the current host (as
defined by the given
* string).
@@ -467,14 +457,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
}
/**
- * Returns this member's unique tag (such as randomly generated bytes) or
null if no unique tag
- * was created.
- */
- public String getUniqueTag() {
- return this.uniqueTag;
- }
-
- /**
* Returns this client member's durable attributes or null if no durable
attributes were created.
*/
public DurableClientAttributes getDurableClientAttributes() {
@@ -743,11 +725,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
sb.append(":");
sb.append(getPort());
- // if (dcPort > 0 && vmKind != DistributionManager.LONER_DM_TYPE) {
- // sb.append("/");
- // sb.append(Integer.toString(dcPort));
- // }
-
if (vmKind == ClusterDistributionManager.LONER_DM_TYPE) {
// add some more info that was added in 4.2.1 for loner bridge clients
// impact on non-bridge loners is ok
@@ -1168,11 +1145,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
cachedToString = null;
}
- /** drop the cached toString rep of this ID */
- public void dropCachedString() {
- this.cachedToString = null;
- }
-
public String getHost() {
return this.netMbr.getInetAddress().getCanonicalHostName();
}
@@ -1184,18 +1156,6 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
public String getId() {
return toString();
}
- /*
- * if (this.ipAddr == null) { return "<null>"; } else { StringBuffer sb =
new StringBuffer();
- * InetAddress addr = this.ipAddr.getIpAddress();
if(addr.isMulticastAddress()) {
- * sb.append(addr.getHostAddress()); } else {
appendShortName(addr.getHostName(), sb); } if
- * (this.vmPid != 0) { sb.append("("); sb.append(this.vmPid);
sb.append(")"); } sb.append(":");
- * sb.append(this.ipAddr.getPort()); return sb.toString(); } }
- *
- * // Helper method for getId()... copied from IpAddress. private void
appendShortName(String
- * hostname, StringBuffer sb) { if (hostname == null) return; int index =
hostname.indexOf('.');
- * if(index > 0 && !Character.isDigit(hostname.charAt(0))) {
sb.append(hostname.substring(0,
- * index)); } else { sb.append(hostname); } }
- */
public void setVersionObjectForTest(Version v) {
this.versionObj = v;
@@ -1236,7 +1196,7 @@ public class InternalDistributedMember implements
DistributedMember, Externaliza
@Override
public String toString() {
- return "InternalDistrubtedMemberWrapper [mbr=" + mbr + "]";
+ return "InternalDistributedMemberWrapper [mbr=" + mbr + "]";
}
}
}
diff --git
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
index 85570bd..70d5308 100644
---
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
+++
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
@@ -76,7 +76,7 @@ public class GMSLocator implements Locator, NetLocator {
private InternalDistributedMember localAddress;
private final Set<InternalDistributedMember> registrants = new HashSet<>();
- public Map<InternalDistributedMemberWrapper, byte[]> registerMbrVsPK = new
ConcurrentHashMap<>();
+ private Map<InternalDistributedMemberWrapper, byte[]> registerMbrVsPK = new
ConcurrentHashMap<>();
/**
* The current membership view, or one recovered from disk. This is a
copy-on-write variable.
diff --git
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
index 0db5cd6..8ff7596 100644
---
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
+++
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
@@ -38,6 +38,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.TimerTask;
@@ -809,7 +810,7 @@ public class GMSJoinLeave implements JoinLeave,
MessageHandler {
startViewBroadcaster();
} else {
// create and send out a new view
- NetView newView = addMemberToNetView(oldCoordinator);
+ NetView newView = copyCurrentViewAndAddMyAddress(oldCoordinator);
createAndStartViewCreator(newView);
startViewBroadcaster();
}
@@ -829,7 +830,7 @@ public class GMSJoinLeave implements JoinLeave,
MessageHandler {
}
}
- private NetView addMemberToNetView(InternalDistributedMember oldCoordinator)
{
+ private NetView copyCurrentViewAndAddMyAddress(InternalDistributedMember
oldCoordinator) {
boolean testing = unitTesting.contains("noRandomViewChange");
NetView newView;
Set<InternalDistributedMember> leaving = new HashSet<>();
@@ -857,6 +858,7 @@ public class GMSJoinLeave implements JoinLeave,
MessageHandler {
mbrs.removeAll(leaving);
newView = new NetView(this.localAddress, viewNumber, mbrs, leaving,
removals);
newView.setFailureDetectionPorts(currentView);
+ newView.setPublicKeys(currentView);
newView.setFailureDetectionPort(this.localAddress,
services.getHealthMonitor().getFailureDetectionPort());
}
@@ -947,7 +949,7 @@ public class GMSJoinLeave implements JoinLeave,
MessageHandler {
viewReplyProcessor.initialize(id, responders);
viewReplyProcessor.processPendingRequests(pendingLeaves, pendingRemovals);
addPublicKeysToView(view);
- services.getMessenger().send(msg);
+ services.getMessenger().send(msg, view);
// only wait for responses during preparation
if (preparing) {
@@ -978,13 +980,11 @@ public class GMSJoinLeave implements JoinLeave,
MessageHandler {
private void addPublicKeysToView(NetView view) {
String sDHAlgo =
services.getConfig().getDistributionConfig().getSecurityUDPDHAlgo();
if (sDHAlgo != null && !sDHAlgo.isEmpty()) {
- List<InternalDistributedMember> mbrs = view.getMembers();
- Iterator<InternalDistributedMember> itr = mbrs.iterator();
-
- while (itr.hasNext()) {
- InternalDistributedMember mbr = itr.next();
- byte[] pk = services.getMessenger().getPublicKey(mbr);
- view.setPublicKey(mbr, pk);
+ for (InternalDistributedMember mbr : view.getMembers()) {
+ if (Objects.isNull(view.getPublicKey(mbr))) {
+ byte[] pk = services.getMessenger().getPublicKey(mbr);
+ view.setPublicKey(mbr, pk);
+ }
}
}
}
diff --git
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncrypt.java
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncrypt.java
index 3bcb842..76fb1de 100755
---
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncrypt.java
+++
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncrypt.java
@@ -22,8 +22,7 @@ import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
-import java.util.Iterator;
-import java.util.List;
+import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -40,11 +39,7 @@ import
org.apache.geode.distributed.internal.membership.InternalDistributedMembe
import org.apache.geode.distributed.internal.membership.NetView;
import org.apache.geode.distributed.internal.membership.gms.Services;
-public class GMSEncrypt implements Cloneable {
-
- public static long encodingsPerformed;
- public static long decodingsPerformed;
-
+public final class GMSEncrypt implements Cloneable {
// Parameters for the Diffie-Hellman key exchange
private static final BigInteger dhP =
new
BigInteger("13528702063991073999718992897071702177131142188276542919088770094024269"
@@ -74,9 +69,8 @@ public class GMSEncrypt implements Cloneable {
private NetView view;
- public static final int numberOfPeerEncryptorCopies =
- Integer.getInteger("GMSEncrypt.MAX_ENCRYPTORS",
- Math.max(Runtime.getRuntime().availableProcessors() * 4,
16)).intValue();
+ private static final int numberOfPeerEncryptorCopies = Integer.getInteger(
+ "GMSEncrypt.MAX_ENCRYPTORS",
Math.max(Runtime.getRuntime().availableProcessors() * 4, 16));
/**
* Keeps multiple copies for peer
*/
@@ -117,7 +111,7 @@ public class GMSEncrypt implements Cloneable {
this.clusterEncryptor = new ClusterEncryptor(secretBytes);
}
- protected GMSEncrypt() {
+ private GMSEncrypt() {
initEncryptors();
}
@@ -125,20 +119,20 @@ public class GMSEncrypt implements Cloneable {
return services.getPublicKey(mbr);
}
- public GMSEncrypt(Services services) throws Exception {
+ GMSEncrypt(Services services) throws Exception {
this.services = services;
initEncryptors();
initDHKeys(services.getConfig().getDistributionConfig());
}
- public GMSEncrypt(Services services, InternalDistributedMember mbr) throws
Exception {
+ GMSEncrypt(Services services, InternalDistributedMember mbr) throws
Exception {
this.services = services;
this.localMember = mbr;
initEncryptors();
initDHKeys(services.getConfig().getDistributionConfig());
}
- void initEncryptors() {
+ private void initEncryptors() {
copyOfPeerEncryptors = new ConcurrentHashMap[numberOfPeerEncryptorCopies];
copyOfClusterEncryptors = new
ClusterEncryptor[numberOfPeerEncryptorCopies];
}
@@ -183,7 +177,6 @@ public class GMSEncrypt implements Cloneable {
protected void setPublicKey(byte[] publickey, InternalDistributedMember mbr)
{
try {
- // createPeerEncryptor(mbr, publickey);
memberToPeerEncryptor.put(new InternalDistributedMemberWrapper(mbr),
publickey);
synchronized (copyOfPeerEncryptors) {
// remove all the existing keys..
@@ -198,7 +191,7 @@ public class GMSEncrypt implements Cloneable {
}
@Override
- protected GMSEncrypt clone() throws CloneNotSupportedException {
+ protected GMSEncrypt clone() {
try {
GMSEncrypt gmsEncrypt = new GMSEncrypt();
gmsEncrypt.localMember = this.localMember;
@@ -214,7 +207,6 @@ public class GMSEncrypt implements Cloneable {
PKCS8EncodedKeySpec x509KeySpecPKey = new
PKCS8EncodedKeySpec(this.dhPrivateKey.getEncoded());
keyFact = KeyFactory.getInstance("DH");
- // PublicKey pubKey = keyFact.generatePublic(x509KeySpec);
gmsEncrypt.dhPrivateKey = keyFact.generatePrivate(x509KeySpecPKey);
return gmsEncrypt;
@@ -244,7 +236,7 @@ public class GMSEncrypt implements Cloneable {
}
}
- protected PeerEncryptor getPeerEncryptor(InternalDistributedMember member)
throws Exception {
+ private PeerEncryptor getPeerEncryptor(InternalDistributedMember member)
throws Exception {
Map<InternalDistributedMember, PeerEncryptor> m = getPeerEncryptorMap();
PeerEncryptor result = m.get(member);
@@ -252,8 +244,7 @@ public class GMSEncrypt implements Cloneable {
synchronized (this) {
result = m.get(member);
if (result == null) {
- byte[] pk =
- (byte[]) memberToPeerEncryptor.get(new
InternalDistributedMemberWrapper(member));
+ byte[] pk = memberToPeerEncryptor.get(new
InternalDistributedMemberWrapper(member));
if (pk == null) {
pk = getRegisteredPublicKey(member);
}
@@ -274,7 +265,7 @@ public class GMSEncrypt implements Cloneable {
synchronized (copyOfPeerEncryptors) {
m = copyOfPeerEncryptors[h];
if (m == null) {
- m = new ConcurrentHashMap<InternalDistributedMember,
PeerEncryptor>();
+ m = new ConcurrentHashMap<>();
copyOfPeerEncryptors[h] = m;
}
}
@@ -351,18 +342,17 @@ public class GMSEncrypt implements Cloneable {
return blocksize;
}
- public static byte[] encryptBytes(byte[] data, Cipher encrypt) throws
Exception {
+ private static byte[] encryptBytes(byte[] data, Cipher encrypt) throws
Exception {
return encrypt.doFinal(data);
}
- public static byte[] decryptBytes(byte[] data, Cipher decrypt) throws
Exception {
+ private static byte[] decryptBytes(byte[] data, Cipher decrypt) throws
Exception {
return decrypt.doFinal(data);
}
+ private class PeerEncryptor {
- protected class PeerEncryptor {
-
- private PublicKey peerPublicKey = null;
+ private PublicKey peerPublicKey;
private String peerSKAlgo = null;
@@ -370,12 +360,12 @@ public class GMSEncrypt implements Cloneable {
private Cipher decrypt = null;
- protected PeerEncryptor(byte[] peerPublicKeyBytes) throws Exception {
+ private PeerEncryptor(byte[] peerPublicKeyBytes) throws Exception {
this.peerPublicKey = getPublicKey(peerPublicKeyBytes);
}
- public synchronized byte[] encryptBytes(byte[] data) throws Exception {
- String algo = null;
+ private synchronized byte[] encryptBytes(byte[] data) throws Exception {
+ String algo;
if (this.peerSKAlgo != null) {
algo = this.peerSKAlgo;
} else {
@@ -413,7 +403,7 @@ public class GMSEncrypt implements Cloneable {
}
// this needs to synchronize as it uses private key of that member
- protected static synchronized Cipher getEncryptCipher(String dhSKAlgo,
PrivateKey privateKey,
+ private static synchronized Cipher getEncryptCipher(String dhSKAlgo,
PrivateKey privateKey,
PublicKey peerPublicKey) throws Exception {
KeyAgreement ka = KeyAgreement.getInstance("DH");
ka.init(privateKey);
@@ -442,7 +432,7 @@ public class GMSEncrypt implements Cloneable {
return encrypt;
}
- protected static Cipher getEncryptCipher(String dhSKAlgo, byte[]
secretBytes) throws Exception {
+ private static Cipher getEncryptCipher(String dhSKAlgo, byte[] secretBytes)
throws Exception {
Cipher encrypt = null;
@@ -467,7 +457,7 @@ public class GMSEncrypt implements Cloneable {
}
// this needs to synchronize as it uses private key of that member
- protected static synchronized Cipher getDecryptCipher(String dhSKAlgo,
PrivateKey privateKey,
+ private static synchronized Cipher getDecryptCipher(String dhSKAlgo,
PrivateKey privateKey,
PublicKey publicKey) throws Exception {
KeyAgreement ka = KeyAgreement.getInstance("DH");
ka.init(privateKey);
@@ -495,8 +485,8 @@ public class GMSEncrypt implements Cloneable {
return decrypt;
}
- protected static Cipher getDecryptCipher(String dhSKAlgo, byte[]
secretBytes) throws Exception {
- Cipher decrypt = null;
+ private static Cipher getDecryptCipher(String dhSKAlgo, byte[] secretBytes)
throws Exception {
+ Cipher decrypt;
int keysize = getKeySize(dhSKAlgo);
int blocksize = getBlockSize(dhSKAlgo);
@@ -517,7 +507,7 @@ public class GMSEncrypt implements Cloneable {
return decrypt;
}
- protected static byte[] generateSecret(String dhSKAlgo, PrivateKey
privateKey,
+ private static byte[] generateSecret(String dhSKAlgo, PrivateKey privateKey,
PublicKey otherPublicKey) throws Exception {
KeyAgreement ka = KeyAgreement.getInstance("DH");
ka.init(privateKey);
@@ -534,40 +524,31 @@ public class GMSEncrypt implements Cloneable {
}
}
- protected static PublicKey getPublicKey(byte[] publicKeyBytes) throws
Exception {
+ private static PublicKey getPublicKey(byte[] publicKeyBytes) throws
Exception {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFact = KeyFactory.getInstance("DH");
- // PublicKey pubKey = keyFact.generatePublic(x509KeySpec);
return keyFact.generatePublic(x509KeySpec);
}
- protected static void initEncryptCipher(KeyAgreement ka, List<PublicKey>
publicKeys)
- throws Exception {
- Iterator<PublicKey> itr = publicKeys.iterator();
- while (itr.hasNext()) {
- ka.doPhase(itr.next(), !itr.hasNext());
- }
- }
-
/***
* this will hold the common key for cluster
*/
- protected class ClusterEncryptor {
+ private class ClusterEncryptor {
byte[] secretBytes;
Cipher encrypt;
Cipher decrypt;
- public ClusterEncryptor(GMSEncrypt other) throws Exception {
+ private ClusterEncryptor(GMSEncrypt other) throws Exception {
GMSEncrypt mine = new GMSEncrypt(other.services);
this.secretBytes =
GMSEncrypt.generateSecret(mine.dhSKAlgo, mine.dhPrivateKey,
other.dhPublicKey);
}
- public ClusterEncryptor(byte[] sb) {
+ private ClusterEncryptor(byte[] sb) {
this.secretBytes = sb;
}
- public synchronized byte[] encryptBytes(byte[] data) throws Exception {
+ private synchronized byte[] encryptBytes(byte[] data) throws Exception {
String algo = dhSKAlgo;
return GMSEncrypt.encryptBytes(data, getEncryptCipher(algo));
}
@@ -583,7 +564,7 @@ public class GMSEncrypt implements Cloneable {
return encrypt;
}
- public synchronized byte[] decryptBytes(byte[] data) throws Exception {
+ private synchronized byte[] decryptBytes(byte[] data) throws Exception {
String algo = dhSKAlgo;
Cipher c = getDecryptCipher(algo);
return GMSEncrypt.decryptBytes(data, c);
diff --git
a/geode-core/src/test/java/org/apache/geode/distributed/LocatorDUnitTest.java
b/geode-core/src/test/java/org/apache/geode/distributed/LocatorDUnitTest.java
index ff0bb1d..914fece 100644
---
a/geode-core/src/test/java/org/apache/geode/distributed/LocatorDUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/distributed/LocatorDUnitTest.java
@@ -120,11 +120,6 @@ public class LocatorDUnitTest extends
JUnit4DistributedTestCase {
super();
}
- private static final String WAIT2_MS_NAME = "LocatorDUnitTest.WAIT2_MS";
- private static final int WAIT2_MS_DEFAULT = 5000; // 2000 -- see bug 36470
- private static final int WAIT2_MS =
- Integer.getInteger(WAIT2_MS_NAME, WAIT2_MS_DEFAULT).intValue();
-
protected int port1;
private int port2;
diff --git
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
index 9e7b8a2..0443b32 100644
---
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
@@ -31,7 +31,6 @@ import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -102,19 +101,17 @@ public class GMSJoinLeaveJUnitTest {
private InternalDistributedMember removeMember = null;
private InternalDistributedMember leaveMember = null;
- public void initMocks() throws IOException {
+ public void initMocks() {
initMocks(false);
}
- public void initMocks(boolean enableNetworkPartition) throws
UnknownHostException {
+ public void initMocks(boolean enableNetworkPartition) {
initMocks(enableNetworkPartition, false);
}
- public void initMocks(boolean enableNetworkPartition, boolean
useTestGMSJoinLeave)
- throws UnknownHostException {
+ public void initMocks(boolean enableNetworkPartition, boolean
useTestGMSJoinLeave) {
mockDistConfig = mock(DistributionConfig.class);
when(mockDistConfig.getEnableNetworkPartitionDetection()).thenReturn(enableNetworkPartition);
- when(mockDistConfig.getLocators()).thenReturn("localhost[8888]");
when(mockDistConfig.getSecurityUDPDHAlgo()).thenReturn("");
mockConfig = mock(ServiceConfig.class);
when(mockDistConfig.getStartLocator()).thenReturn("localhost[12345]");
@@ -290,7 +287,7 @@ public class GMSJoinLeaveJUnitTest {
verify(messenger).send(isA(JoinResponseMessage.class));
}
- // This test does not test the actual join process but rather that the join
response gets loggedß
+ // This test does not test the actual join process but rather that the join
response gets logged
@Test
public void testProcessJoinResponseIsRecorded() throws IOException {
initMocks();
@@ -332,6 +329,9 @@ public class GMSJoinLeaveJUnitTest {
// prepare the view
NetView netView = new NetView(coordinator, viewId, members);
+ for (InternalDistributedMember member : netView.getMembers()) {
+ netView.setPublicKey(member, member.toString());
+ }
InstallViewMessage installViewMessage = getInstallViewMessage(netView,
credentials, true);
gmsJoinLeave.processMessage(installViewMessage);
verify(messenger).send(isA(ViewAckMessage.class));
@@ -1204,6 +1204,53 @@ public class GMSJoinLeaveJUnitTest {
assertTrue(newView.getViewId() > preparedView.getViewId());
}
+ @Test
+ public void testPublicKeyForNewMemberFromPreparedViewIsInstalledInNewView()
throws Exception {
+ initMocks(false);
+ InternalDistributedMember newMember = mockMembers[1];
+
+ prepareAndInstallView(gmsJoinLeaveMemberId,
+ createMemberList(gmsJoinLeaveMemberId, mockMembers[0]));
+ // a new member is joining
+ NetView preparedView =
+ new NetView(gmsJoinLeave.getView(), gmsJoinLeave.getView().getViewId()
+ 5);
+ for (InternalDistributedMember member : preparedView.getMembers()) {
+ preparedView.setPublicKey(member, member.toString());
+ }
+ newMember.setVmViewId(preparedView.getViewId());
+ preparedView.add(newMember);
+ preparedView.setPublicKey(newMember, newMember.toString());
+
+ InstallViewMessage msg = getInstallViewMessage(preparedView, null, true);
+ gmsJoinLeave.processMessage(msg);
+
+ GMSJoinLeaveTestHelper.becomeCoordinatorForTest(gmsJoinLeave);
+
+ Thread.sleep(2000);
+ ViewCreator vc = gmsJoinLeave.getViewCreator();
+ int viewId = 0;
+ if (gmsJoinLeave.getPreparedView() == null) {
+ viewId = gmsJoinLeave.getView().getViewId();
+ } else {
+ viewId = gmsJoinLeave.getPreparedView().getViewId();
+ }
+ ViewAckMessage vack = new ViewAckMessage(gmsJoinLeaveMemberId, viewId,
true);
+ vack.setSender(mockMembers[0]);
+ gmsJoinLeave.processMessage(vack);
+ vack = new ViewAckMessage(gmsJoinLeaveMemberId, viewId, true);
+ vack.setSender(newMember);
+ gmsJoinLeave.processMessage(vack);
+ vack = new ViewAckMessage(gmsJoinLeaveMemberId, viewId, true);
+ vack.setSender(gmsJoinLeaveMemberId);
+ gmsJoinLeave.processMessage(vack);
+
+ Awaitility.await("view creator finishes").atMost(30, SECONDS).until(() ->
vc.waiting);
+ NetView newView = gmsJoinLeave.getView();
+ System.out.println("new view is " + newView);
+ assertTrue(newView.contains(newMember));
+ assertNotNull(newView.getPublicKey(newMember));
+ }
+
private NetView createView() {
List<InternalDistributedMember> mbrs = new LinkedList<>();
Set<InternalDistributedMember> shutdowns = new HashSet<>();
@@ -1280,7 +1327,7 @@ public class GMSJoinLeaveJUnitTest {
}
class GMSJoinLeaveTest extends GMSJoinLeave {
- public GMSJoinLeaveTest() {
+ GMSJoinLeaveTest() {
super();
}
@@ -1292,7 +1339,7 @@ public class GMSJoinLeaveJUnitTest {
GMSJoinLeaveJUnitTest.this.processRemoveMessage(fmbr);
Thread.sleep(1000000);
}
- } catch (InterruptedException e) {
+ } catch (InterruptedException ignore) {
}
return true;
} else if (leaveMember != null) {
@@ -1301,7 +1348,7 @@ public class GMSJoinLeaveJUnitTest {
GMSJoinLeaveJUnitTest.this.processLeaveMessage(fmbr);
Thread.sleep(1000000);
}
- } catch (InterruptedException e) {
+ } catch (InterruptedException ignore) {
}
return true;
} else {
diff --git
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveTestHelper.java
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveTestHelper.java
index a83f152..7b1693e 100755
---
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveTestHelper.java
+++
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveTestHelper.java
@@ -14,6 +14,8 @@
*/
package org.apache.geode.distributed.internal.membership.gms.membership;
+import static org.junit.Assert.assertNotNull;
+
import org.apache.geode.distributed.Locator;
import org.apache.geode.distributed.internal.DistributionManager;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
@@ -33,17 +35,8 @@ public class GMSJoinLeaveTestHelper {
public static boolean isViewCreator() {
GMSJoinLeave gmsJoinLeave = getGmsJoinLeave();
- if (gmsJoinLeave != null) {
- return
gmsJoinLeave.getView().getCreator().equals(gmsJoinLeave.getMemberID());
- // GMSJoinLeave.ViewCreator viewCreator = gmsJoinLeave.getViewCreator();
- // if (viewCreator != null && !viewCreator.isShutdown()) {
- // return true;
- // } else {
- // return false;
- // }
- }
- throw new RuntimeException(
- "This should not have happened. There should be a JoinLeave for every
DS");
+ assertNotNull("There should be a JoinLeave for every DS", gmsJoinLeave);
+ return
gmsJoinLeave.getView().getCreator().equals(gmsJoinLeave.getMemberID());
}
private static void waitCriterion() {
diff --git
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncryptJUnitTest.java
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncryptJUnitTest.java
index 07be33e..4b1a929 100755
---
a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncryptJUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/GMSEncryptJUnitTest.java
@@ -343,7 +343,6 @@ public class GMSEncryptJUnitTest {
try {
int count = 0;
for (int i = 0; i < runs; i++) {
- // System.out.println("run " + i + " threadid " +
Thread.currentThread().getId());
String ch = "Hello world";
byte[] challenge = ch.getBytes();
byte[] encryptedChallenge = sender.encryptData(challenge);
--
To stop receiving notification emails like this one, please contact
[email protected].