Bläddra i källkod

ZOOKEEPER-2212: distributed race condition related to QV version
(Akihiro Suda via rgs)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1685685 13f79535-47bb-0310-9956-ffa450edef68

Raúl Gutiérrez Segalés 10 år sedan
förälder
incheckning
6a2f5e3e76

+ 3 - 0
CHANGES.txt

@@ -131,6 +131,9 @@ BUGFIXES:
   ZOOKEEPER-706: Large numbers of watches can cause session re-establishment to fail
   (Chris Thunes via rgs)
 
+  ZOOKEEPER-2212: distributed race condition related to QV version
+  (Akihiro Suda via rgs)
+
 IMPROVEMENTS:
   ZOOKEEPER-1660 Documentation for Dynamic Reconfiguration (Reed Wanderman-Milne via shralex)  
 

+ 13 - 8
src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java

@@ -294,14 +294,19 @@ public class FastLeaderElection implements Election {
                                         LOG.info("{} Received version: {} my version: {}", self.getId(),
                                                 Long.toHexString(rqv.getVersion()),
                                                 Long.toHexString(self.getQuorumVerifier().getVersion()));
-                                        self.processReconfig(rqv, null, null, false);
-                                        if (!rqv.equals(curQV)) {
-                                            LOG.info("restarting leader election");
-                                            self.shuttingDownLE = true;
-                                            self.getElectionAlg().shutdown();
-                                            
-                                            break;
-                                       }
+                                        if (self.getPeerState() == ServerState.LOOKING) {
+                                            LOG.debug("Invoking processReconfig(), state: {}", self.getServerState());
+                                            self.processReconfig(rqv, null, null, false);
+                                            if (!rqv.equals(curQV)) {
+                                                LOG.info("restarting leader election");
+                                                self.shuttingDownLE = true;
+                                                self.getElectionAlg().shutdown();
+
+                                                break;
+                                            }
+                                        } else {
+                                            LOG.debug("Skip processReconfig(), state: {}", self.getServerState());
+                                        }
                                     }
                                 } catch (IOException e) {
                                     LOG.error("Something went wrong while processing config received from {}", response.sid);