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