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()) {