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 2019/03/28 20:34:12 UTC
[geode] branch feature/GEODE-6570 created (now 522da6d)
This is an automated email from the ASF dual-hosted git repository.
bschuchardt pushed a change to branch feature/GEODE-6570
in repository https://gitbox.apache.org/repos/asf/geode.git.
at 522da6d GEODE-6570 processing of cached join request delays view installation
This branch includes the following new commits:
new 522da6d GEODE-6570 processing of cached join request delays view installation
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[geode] 01/01: GEODE-6570 processing of cached join request delays
view installation
Posted by bs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
bschuchardt pushed a commit to branch feature/GEODE-6570
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 522da6dc84fb2b0d945830a9514192cd9812f09b
Author: Bruce Schuchardt <bs...@pivotal.io>
AuthorDate: Thu Mar 28 13:31:44 2019 -0700
GEODE-6570 processing of cached join request delays view installation
Ignore join requests from a member that's already joined. Also, never
overwrite an established vmViewID in a member's ID because the member
knows about the old vmViewID and will ignore the newly assigned number.
---
.../gms/membership/GMSJoinLeaveJUnitTest.java | 29 ++++++++++++++++++++++
.../membership/gms/membership/GMSJoinLeave.java | 13 +++++++---
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
index d5f090c..6273c14 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
@@ -44,6 +44,7 @@ import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.Timer;
+import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Assert;
@@ -725,6 +726,34 @@ public class GMSJoinLeaveJUnitTest {
await().until(() -> gmsJoinLeave.getView().size() == 1);
}
+ /**
+ * Given a view with [A, B, C, D] where C is coordinator, a failed availability check on A
+ * and a pending join request from E show that B becomes coordinator when C sends it a
+ * Leave request and that E is allowed into the system and retains its view ID.
+ * See GEODE-6570
+ */
+ @Test
+ public void testBecomeCoordinatorAndAcceptMemberWithViewID() throws Exception {
+ initMocks();
+ InternalDistributedMember A = mockMembers[0],
+ B = gmsJoinLeaveMemberId,
+ C = mockMembers[1],
+ D = mockMembers[2],
+ E = mockMembers[3];
+ prepareAndInstallView(C, createMemberList(A, B, C, D));
+ when(healthMonitor.getMembersFailingAvailabilityCheck()).thenReturn(Collections.singleton(A));
+ E.setVmViewId(1);
+ gmsJoinLeave.processMessage(new JoinRequestMessage(B, E, null, 1, 1));
+ LeaveRequestMessage msg = new LeaveRequestMessage(B, C, "leaving for test");
+ msg.setSender(C);
+ gmsJoinLeave.processMessage(msg);
+ assertTrue("Expected becomeCoordinator to be invoked", gmsJoinLeave.isCoordinator());
+ await().atMost(15, TimeUnit.SECONDS).until(() -> {
+ NetView preparedView = gmsJoinLeave.getPreparedView();
+ return preparedView != null && preparedView.contains(E);
+ });
+ }
+
@Test
public void testBecomeCoordinatorThroughViewChange() throws Exception {
initMocks();
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 1eb5082..e529c9e 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
@@ -2465,8 +2465,13 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
mbr = jmsg.getMemberID();
int port = jmsg.getFailureDetectionPort();
if (!joinReqs.contains(mbr)) {
- joinReqs.add(mbr);
- joinPorts.put(mbr, port);
+ if (mbr.getVmViewId() >= 0 && oldMembers.contains(mbr)) {
+ // already joined in a previous view
+ logger.info("Ignoring join request from member {} who has already joined", mbr);
+ } else {
+ joinReqs.add(mbr);
+ joinPorts.put(mbr, port);
+ }
}
break;
case LEAVE_REQUEST_MESSAGE:
@@ -2553,7 +2558,9 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler {
}
for (InternalDistributedMember mbr : joinReqs) {
- mbr.setVmViewId(newView.getViewId());
+ if (mbr.getVmViewId() < 0) {
+ mbr.setVmViewId(newView.getViewId());
+ }
}
if (isShutdown()) {