Author: mahadev
Date: Mon Aug  3 22:29:42 2009
New Revision: 800598

URL: http://svn.apache.org/viewvc?rev=800598&view=rev
Log:
ZOOKEEPER-479.  QuorumHierarchical does not count groups correctly (flavio via 
mahadev)

Modified:
    hadoop/zookeeper/branches/branch-3.2/CHANGES.txt
    
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java
    
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java
    
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java
    
hadoop/zookeeper/branches/branch-3.2/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java

Modified: hadoop/zookeeper/branches/branch-3.2/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.2/CHANGES.txt?rev=800598&r1=800597&r2=800598&view=diff
==============================================================================
--- hadoop/zookeeper/branches/branch-3.2/CHANGES.txt (original)
+++ hadoop/zookeeper/branches/branch-3.2/CHANGES.txt Mon Aug  3 22:29:42 2009
@@ -26,6 +26,9 @@
 
   ZOOKEEPER-481. Add lastMessageSent to QuorumCnxManager. (flavio via mahadev)
 
+  ZOOKEEPER-479.  QuorumHierarchical does not count groups correctly (flavio
+via mahadev)
+
 IMPROVEMENTS:
 
 NEW FEATURES:

Modified: 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java?rev=800598&r1=800597&r2=800598&view=diff
==============================================================================
--- 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java
 (original)
+++ 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumHierarchical.java
 Mon Aug  3 22:29:42 2009
@@ -104,12 +104,15 @@
         LOG.info(serverWeight.size() + ", " + serverGroup.size() + ", " + 
groupWeight.size());
     }
     
-    /**
-     * This contructor takes the two hash maps needed to enable 
-     * validating quorums. We use it with QuorumPeerConfig. That is,
-     * we declare weights and groups in the server configuration
-     * file along with the other parameters.
-     */
+   /**
+    *  This contructor takes the two hash maps needed to enable 
+    *  validating quorums. We use it with QuorumPeerConfig. That is,
+    *  we declare weights and groups in the server configuration
+    *  file along with the other parameters.
+    * @param numGroups
+    * @param serverWeight
+    * @param serverGroup
+    */
     public QuorumHierarchical(int numGroups,
             HashMap<Long, Long> serverWeight,
             HashMap<Long, Long> serverGroup)
@@ -124,6 +127,15 @@
     
     
     /**
+     * Returns the weight of a server.
+     * 
+     * @param id
+     */
+    public long getWeight(long id){
+        return serverWeight.get(id);
+    }
+    
+    /**
      * Reads a configration file. Called from the constructor
      * that takes a file as an input.
      */
@@ -200,9 +212,15 @@
             else {
                 long totalWeight = serverWeight.get(sid) + 
groupWeight.get(gid);
                 groupWeight.put(gid, totalWeight);
-            }
-            
-        }        
+            } 
+        }    
+        
+        /*
+         * Do not consider groups with weight zero
+         */
+        for(long weight: groupWeight.values()){
+            if(weight == 0) numGroups--;
+        }
     }
     
     /**
@@ -230,14 +248,14 @@
         /*
          * Check if all groups have majority
          */
-        boolean majPerGroup = true;
+        int majGroupCounter = 0;
         for(long gid : expansion.keySet()) {
             LOG.info("gid: " + expansion.get(gid));
-            if(expansion.get(gid) <= (groupWeight.get(gid) / 2) )
-                majPerGroup = false;
+            if(expansion.get(gid) > (groupWeight.get(gid) / 2) )
+                majGroupCounter++;
         }
         
-        if((expansion.size() > (numGroups / 2)) && majPerGroup){
+        if((majGroupCounter > (numGroups / 2))){
             LOG.info("Positive set size: " + set.size());
             return true;
         }

Modified: 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java?rev=800598&r1=800597&r2=800598&view=diff
==============================================================================
--- 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java
 (original)
+++ 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumMaj.java
 Mon Aug  3 22:29:42 2009
@@ -31,12 +31,23 @@
     
     /**
      * Defines a majority to avoid computing it every time.
+     * 
+     * @param n number of servers
      */
     public QuorumMaj(int n){
         this.half = n/2;
     }
     
     /**
+     * Returns weight of 1 by default.
+     * 
+     * @param id 
+     */
+    public long getWeight(long id){
+        return (long) 1;
+    }
+    
+    /**
      * Verifies if a set is a majority.
      */
     public boolean containsQuorum(HashSet<Long> set){

Modified: 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java?rev=800598&r1=800597&r2=800598&view=diff
==============================================================================
--- 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java
 (original)
+++ 
hadoop/zookeeper/branches/branch-3.2/src/java/main/org/apache/zookeeper/server/quorum/flexible/QuorumVerifier.java
 Mon Aug  3 22:29:42 2009
@@ -28,5 +28,6 @@
  */
 
 public interface QuorumVerifier {
+    long getWeight(long id);
     boolean containsQuorum(HashSet<Long> set);
 }
\ No newline at end of file

Modified: 
hadoop/zookeeper/branches/branch-3.2/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.2/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java?rev=800598&r1=800597&r2=800598&view=diff
==============================================================================
--- 
hadoop/zookeeper/branches/branch-3.2/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
 (original)
+++ 
hadoop/zookeeper/branches/branch-3.2/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
 Mon Aug  3 22:29:42 2009
@@ -93,6 +93,7 @@
 
     protected void tearDown() throws Exception {
         for(int i = 0; i < threads.size(); i++) {
+            threads.get(i).peer.shutdown();
             ((FastLeaderElection) 
threads.get(i).peer.getElectionAlg()).shutdown();
         }
         LOG.info("FINISHED " + getName());
@@ -144,17 +145,26 @@
 
     @Test
     public void testHierarchicalQuorum() throws Exception {
+        runTest(0);
+    }
+    
+    @Test
+    public void testHierarchicalQuorumPartial() throws Exception {
+        runTest(3);
+    }
+    
+    private void runTest(int delta) throws Exception {
         FastLeaderElection le[] = new FastLeaderElection[count];
 
         LOG.info("TestHierarchicalQuorum: " + getName()+ ", " + count);
         for(int i = 0; i < count; i++) {
-            peers.put(Long.valueOf(i), new QuorumServer(i, new 
InetSocketAddress(baseport+100+i),
-                    new InetSocketAddress(baseLEport+100+i)));
+            peers.put(Long.valueOf(i), new QuorumServer(i, new 
InetSocketAddress(baseport+i),
+                    new InetSocketAddress(baseLEport+i)));
             tmpdir[i] = ClientBase.createTmpDir();
             port[i] = baseport+i;
         }
 
-        for(int i = 0; i < le.length; i++) {
+        for(int i = 0; i < (le.length - delta); i++) {
             QuorumHierarchical hq = new QuorumHierarchical(qp);
             QuorumPeer peer = new QuorumPeer(peers, tmpdir[i], tmpdir[i], 
port[i], 3, i, 2, 2, 2, hq);
             peer.startLeaderElection();


Reply via email to