GEODE-3052 Need to reset isCoordinator flag in GMSLocator. isCoordinator flag ensures that this process is becoming the coordinator thus other process should join this process. But when network parttion happens, we were not resetting this flag.
Now we reset isCoordinator flag when viewCreator thread shutdowns. added unit test for it. Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/15a3b5a6 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/15a3b5a6 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/15a3b5a6 Branch: refs/heads/feature/GEM-1483 Commit: 15a3b5a6eb789b01639a03c4318f5d3c10bd2158 Parents: 9905794 Author: Hitesh Khamesra <hkhame...@pivotal.io> Authored: Thu Jul 13 11:47:20 2017 -0700 Committer: Hitesh Khamesra <hkhame...@pivotal.io> Committed: Fri Jul 14 14:27:40 2017 -0700 ---------------------------------------------------------------------- .../membership/gms/locator/GMSLocator.java | 1 + .../membership/gms/membership/GMSJoinLeave.java | 10 ++++---- .../gms/membership/GMSJoinLeaveJUnitTest.java | 26 ++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/15a3b5a6/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java ---------------------------------------------------------------------- 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 2c56f5b..e627452 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 @@ -295,6 +295,7 @@ public class GMSLocator implements Locator, NetLocator { logger.info("This member is becoming coordinator"); v = null; } + logger.debug("this member is becoming coordinator from view {} ", fromView); } byte[] coordPk = null; if (v != null) { http://git-wip-us.apache.org/repos/asf/geode/blob/15a3b5a6/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java ---------------------------------------------------------------------- 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 9591673..40a4254 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 @@ -1541,11 +1541,6 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { if (viewCreator != null && !viewCreator.isShutdown()) { logger.debug("Shutting down ViewCreator"); viewCreator.shutdown(); - org.apache.geode.distributed.internal.membership.gms.interfaces.Locator locator = - services.getLocator(); - if (locator != null) { - locator.setIsCoordinator(false); - } try { viewCreator.join(1000); } catch (InterruptedException e) { @@ -2209,6 +2204,11 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { } finally { shutdown = true; informToPendingJoinRequests(); + org.apache.geode.distributed.internal.membership.gms.interfaces.Locator locator = + services.getLocator(); + if (locator != null) { + locator.setIsCoordinator(false); + } } } http://git-wip-us.apache.org/repos/asf/geode/blob/15a3b5a6/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java ---------------------------------------------------------------------- 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 d8c12e2..2807be3 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 @@ -42,6 +42,7 @@ import org.apache.geode.distributed.internal.membership.gms.Services; import org.apache.geode.distributed.internal.membership.gms.Services.Stopper; import org.apache.geode.distributed.internal.membership.gms.interfaces.Authenticator; import org.apache.geode.distributed.internal.membership.gms.interfaces.HealthMonitor; +import org.apache.geode.distributed.internal.membership.gms.interfaces.Locator; import org.apache.geode.distributed.internal.membership.gms.interfaces.Manager; import org.apache.geode.distributed.internal.membership.gms.interfaces.Messenger; import org.apache.geode.distributed.internal.membership.gms.locator.FindCoordinatorRequest; @@ -99,6 +100,7 @@ public class GMSJoinLeaveJUnitTest { private GMSJoinLeave gmsJoinLeave; private Manager manager; private Stopper stopper; + private TestLocator testLocator; private InternalDistributedMember removeMember = null; private InternalDistributedMember leaveMember = null; @@ -145,6 +147,9 @@ public class GMSJoinLeaveJUnitTest { when(services.getManager()).thenReturn(manager); when(services.getHealthMonitor()).thenReturn(healthMonitor); + testLocator = new TestLocator(); + when(services.getLocator()).thenReturn(testLocator); + Timer t = new Timer(true); when(services.getTimer()).thenReturn(t); @@ -172,6 +177,24 @@ public class GMSJoinLeaveJUnitTest { } } + static class TestLocator implements Locator { + + boolean isCoordinator; + + @Override + public void installView(NetView v) {} + + @Override + public void setIsCoordinator(boolean isCoordinator) { + this.isCoordinator = isCoordinator; + } + + public boolean isCoordinator() { + return isCoordinator; + } + + } + @Test public void testFindCoordinatorInView() throws Exception { initMocks(); @@ -1131,9 +1154,12 @@ public class GMSJoinLeaveJUnitTest { gmsJoinLeave.processMessage(msg); } + assertTrue(testLocator.isCoordinator); + Awaitility.await("waiting for view creator to stop").atMost(5000, MILLISECONDS) .until(() -> !gmsJoinLeave.getViewCreator().isAlive()); assertEquals(1, gmsJoinLeave.getView().getViewId()); + assertFalse(testLocator.isCoordinator); } finally { System.getProperties().remove(GMSJoinLeave.BYPASS_DISCOVERY_PROPERTY);