Skip to content

Commit

Permalink
Fixed the Cluster .equals() since it didn't take zone into consideration
Browse files Browse the repository at this point in the history
  • Loading branch information
rsumbaly committed Feb 16, 2011
1 parent 3d6209e commit 36393a6
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/java/voldemort/cluster/Cluster.java
Expand Up @@ -153,16 +153,38 @@ public boolean equals(Object second) {
return false;

Cluster secondCluster = (Cluster) second;
if(this.getZones().size() != secondCluster.getZones().size()) {
return false;
}

if(this.getNodes().size() != secondCluster.getNodes().size()) {
return false;
}

for(Zone zoneA: this.getZones()) {
Zone zoneB = secondCluster.getZoneById(zoneA.getId());

if(zoneB == null || zoneB.getProximityList().size() != zoneA.getProximityList().size()) {
return false;
}

for(int index = 0; index < zoneA.getProximityList().size(); index++) {
if(zoneA.getProximityList().get(index) != zoneB.getProximityList().get(index)) {
return false;
}
}
}
for(Node nodeA: this.getNodes()) {
Node nodeB = secondCluster.getNodeById(nodeA.getId());

if(nodeA.getNumberOfPartitions() != nodeB.getNumberOfPartitions()) {
return false;
}

if(nodeA.getZoneId() != nodeB.getZoneId()) {
return false;
}

if(!Sets.newHashSet(nodeA.getPartitionIds())
.equals(Sets.newHashSet(nodeB.getPartitionIds())))
return false;
Expand Down
65 changes: 65 additions & 0 deletions test/unit/voldemort/xml/ClusterMapperTest.java
Expand Up @@ -17,15 +17,21 @@
package voldemort.xml;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import junit.framework.TestCase;
import voldemort.ServerTestUtils;
import voldemort.VoldemortTestConstants;
import voldemort.cluster.Cluster;
import voldemort.cluster.Node;
import voldemort.cluster.Zone;

import com.google.common.collect.Lists;

public class ClusterMapperTest extends TestCase {

public void testClusterMapperValues() {
Expand Down Expand Up @@ -60,4 +66,63 @@ public void testOtherClusters() {
assertEquals(zone.getProximityList().size(), 2);
}
}

public void testClusterEquals() {
List<Zone> zones2 = ServerTestUtils.getZones(2);
List<Zone> zones3 = ServerTestUtils.getZones(3);

Cluster cluster1 = ServerTestUtils.getLocalCluster(4, 10, 2);
Cluster cluster2 = new Cluster("cluster2", Lists.newArrayList(cluster1.getNodes()), zones3);

// Test different number of zones
assertFalse(cluster1.equals(cluster2));

// Test proximity size not same
List<Zone> modifiedZones2 = Lists.newArrayList();
modifiedZones2.add(zones2.get(0));
LinkedList<Integer> newProximityList = Lists.newLinkedList(zones2.get(1).getProximityList());
newProximityList.add(100);
modifiedZones2.add(new Zone(zones2.get(1).getId(), newProximityList));

cluster1 = new Cluster("cluster1", new ArrayList<Node>(), zones2);
cluster2 = new Cluster("cluster2", new ArrayList<Node>(), modifiedZones2);
assertFalse(cluster1.equals(cluster2));

// Test proximity list different order
List<Zone> modifiedZones3 = Lists.newArrayList();
for(int zoneId = 0; zoneId < 3; zoneId++) {
LinkedList<Integer> proximityList = Lists.newLinkedList(zones3.get(zoneId)
.getProximityList());
Collections.shuffle(proximityList);
modifiedZones3.add(new Zone(zones3.get(zoneId).getId(), proximityList));
}

cluster1 = new Cluster("cluster1", new ArrayList<Node>(), zones3);
cluster2 = new Cluster("cluster2", new ArrayList<Node>(), modifiedZones3);
assertFalse(cluster1.equals(cluster2));

// Test nodes in different zones

cluster1 = ServerTestUtils.getLocalCluster(4, 10, 2);

List<Node> newNodes = Lists.newArrayList();
for(Node node: cluster1.getNodes()) {
newNodes.add(new Node(node.getId(),
node.getHost(),
node.getHttpPort(),
node.getSocketPort(),
node.getAdminPort(),
0,
node.getPartitionIds()));
}
cluster2 = new Cluster("cluster2", newNodes, Lists.newArrayList(cluster1.getZones()));
assertFalse(cluster1.equals(cluster2));

// Test equality

cluster2 = new Cluster("cluster2",
Lists.newArrayList(cluster1.getNodes()),
Lists.newArrayList(cluster1.getZones()));
assertTrue(cluster1.equals(cluster2));
}
}

0 comments on commit 36393a6

Please sign in to comment.