Ver Fonte

ZOOKEEPER-1219. LeaderElectionSupport recipe is unnecessarily dispatching the READY_START event even if the ELECTED node stopped/expired simultaneously. (Rakesh R via michim)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1583083 13f79535-47bb-0310-9956-ffa450edef68
Michi Mutsuzaki há 11 anos atrás
pai
commit
d30292be3c

+ 4 - 0
CHANGES.txt

@@ -819,6 +819,10 @@ IMPROVEMENTS:
 
 
   ZOOKEEPER-1408. CLI: sort output of ls command (Hartmut Lang via michim)
   ZOOKEEPER-1408. CLI: sort output of ls command (Hartmut Lang via michim)
 
 
+  ZOOKEEPER-1219. LeaderElectionSupport recipe is unnecessarily dispatching the
+  READY_START event even if the ELECTED node stopped/expired simultaneously.
+  (Rakesh R via michim)
+
 headers
 headers
 
 
 Release 3.4.0 - 
 Release 3.4.0 - 

+ 1 - 1
src/recipes/election/src/java/org/apache/zookeeper/recipes/leader/LeaderElectionSupport.java

@@ -235,7 +235,6 @@ public class LeaderElectionSupport implements Watcher {
 
 
   private void becomeReady(LeaderOffer neighborLeaderOffer)
   private void becomeReady(LeaderOffer neighborLeaderOffer)
       throws KeeperException, InterruptedException {
       throws KeeperException, InterruptedException {
-    dispatchEvent(EventType.READY_START);
 
 
     logger.info("{} not elected leader. Watching node:{}",
     logger.info("{} not elected leader. Watching node:{}",
         leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath());
         leaderOffer.getNodePath(), neighborLeaderOffer.getNodePath());
@@ -247,6 +246,7 @@ public class LeaderElectionSupport implements Watcher {
     Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this);
     Stat stat = zooKeeper.exists(neighborLeaderOffer.getNodePath(), this);
 
 
     if (stat != null) {
     if (stat != null) {
+      dispatchEvent(EventType.READY_START);
       logger.debug(
       logger.debug(
           "We're behind {} in line and they're alive. Keeping an eye on them.",
           "We're behind {} in line and they're alive. Keeping an eye on them.",
           neighborLeaderOffer.getNodePath());
           neighborLeaderOffer.getNodePath());

+ 49 - 0
src/recipes/election/test/org/apache/zookeeper/recipes/leader/LeaderElectionSupportTest.java

@@ -29,6 +29,7 @@ import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.recipes.leader.LeaderElectionSupport.EventType;
 import org.apache.zookeeper.test.ClientBase;
 import org.apache.zookeeper.test.ClientBase;
 import org.junit.After;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Before;
@@ -202,6 +203,54 @@ public class LeaderElectionSupportTest extends ClientBase {
     electionSupport.stop();
     electionSupport.stop();
   }
   }
 
 
+  @Test
+  public void testReadyOffer() throws Exception {
+      final ArrayList<EventType> events = new ArrayList<EventType>();
+      final CountDownLatch electedComplete = new CountDownLatch(1);
+
+      final LeaderElectionSupport electionSupport1 = createLeaderElectionSupport();
+      electionSupport1.start();
+      LeaderElectionSupport electionSupport2 = createLeaderElectionSupport();
+      LeaderElectionAware listener = new LeaderElectionAware() {
+          boolean stoppedElectedNode = false;
+          @Override
+          public void onElectionEvent(EventType eventType) {
+              events.add(eventType);
+              if (!stoppedElectedNode
+                      && eventType == EventType.DETERMINE_COMPLETE) {
+                  stoppedElectedNode = true;
+                  try {
+                      // stopping the ELECTED node, so re-election will happen.
+                      electionSupport1.stop();
+                  } catch (Exception e) {
+                      logger.error("Unexpected error", e);
+                  }
+              }
+              if (eventType == EventType.ELECTED_COMPLETE) {
+                  electedComplete.countDown();
+              }
+          }
+      };
+      electionSupport2.addListener(listener);
+      electionSupport2.start();
+      // waiting for re-election.
+      electedComplete.await(CONNECTION_TIMEOUT / 3, TimeUnit.MILLISECONDS);
+
+      final ArrayList<EventType> expectedevents = new ArrayList<EventType>();
+      expectedevents.add(EventType.START);
+      expectedevents.add(EventType.OFFER_START);
+      expectedevents.add(EventType.OFFER_COMPLETE);
+      expectedevents.add(EventType.DETERMINE_START);
+      expectedevents.add(EventType.DETERMINE_COMPLETE);
+      expectedevents.add(EventType.DETERMINE_START);
+      expectedevents.add(EventType.DETERMINE_COMPLETE);
+      expectedevents.add(EventType.ELECTED_START);
+      expectedevents.add(EventType.ELECTED_COMPLETE);
+      Assert.assertEquals("Events has failed to executed in the order",
+              expectedevents, events);
+      electionSupport2.stop();
+  }
+  
   private LeaderElectionSupport createLeaderElectionSupport() {
   private LeaderElectionSupport createLeaderElectionSupport() {
     LeaderElectionSupport electionSupport = new LeaderElectionSupport();
     LeaderElectionSupport electionSupport = new LeaderElectionSupport();