Author: brandonwilliams Date: Sun Aug 15 17:59:15 2010 New Revision: 985724
URL: http://svn.apache.org/viewvc?rev=985724&view=rev Log: fall back to subsnitch on score equality as well as no score at all, fix probability calculation. Patch by jbellis and brandonwilliams, reviewed by brandonwilliams for CASSANDRA-981 Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java cassandra/trunk/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java?rev=985724&r1=985723&r2=985724&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java Sun Aug 15 17:59:15 2010 @@ -118,7 +118,7 @@ public class DynamicEndpointSnitch exten public List<InetAddress> sortByProximity(final InetAddress address, List<InetAddress> addresses) { - assert address == FBUtilities.getLocalAddress(); // we only know about ourself + assert address.equals(FBUtilities.getLocalAddress()); // we only know about ourself Collections.sort(addresses, new Comparator<InetAddress>() { public int compare(InetAddress a1, InetAddress a2) @@ -134,14 +134,12 @@ public class DynamicEndpointSnitch exten Double scored1 = scores.get(a1); Double scored2 = scores.get(a2); - if (scored1 == null || scored2 == null) + if (scored1 == null || scored2 == null || scored1.equals(scored2)) return subsnitch.compareEndpoints(target, a1, a2); - if (scored1.equals(scored2)) - return 0; if (scored1 < scored2) - return 1; - else return -1; + else + return 1; } public void receiveTiming(InetAddress host, Double latency) // this is cheap @@ -234,7 +232,7 @@ class AdaptiveLatencyTracker extends Abs { double mean = mean(); double exponent = (-1) * (t) / mean; - return Math.pow( Math.E, exponent); + return 1 - Math.pow( Math.E, exponent); } double score() Modified: cassandra/trunk/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java?rev=985724&r1=985723&r2=985724&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java Sun Aug 15 17:59:15 2010 @@ -25,9 +25,6 @@ import java.util.ArrayList; import org.junit.Test; -import static org.junit.Assert.*; -import org.apache.cassandra.locator.DynamicEndpointSnitch; -import org.apache.cassandra.locator.SimpleSnitch; import org.apache.cassandra.utils.FBUtilities; public class DynamicEndpointSnitchTest @@ -35,6 +32,7 @@ public class DynamicEndpointSnitchTest @Test public void testSnitch() throws UnknownHostException, InterruptedException { + int sleeptime = 150; DynamicEndpointSnitch dsnitch = new DynamicEndpointSnitch(new SimpleSnitch()); InetAddress self = FBUtilities.getLocalAddress(); ArrayList<InetAddress> order = new ArrayList<InetAddress>(); @@ -50,34 +48,31 @@ public class DynamicEndpointSnitchTest dsnitch.receiveTiming(host3, 1.0); } - Thread.sleep(1500); + Thread.sleep(sleeptime); order.add(host1); order.add(host2); order.add(host3); - assert dsnitch.getSortedListByProximity(self, order).equals(order); // make host1 a little worse dsnitch.receiveTiming(host1, 2.0); - Thread.sleep(1500); - order.clear(); + Thread.sleep(sleeptime); + order.clear(); order.add(host2); order.add(host3); order.add(host1); - assert dsnitch.getSortedListByProximity(self, order).equals(order); - // make host2 a little worse + // make host2 as bad as host1 dsnitch.receiveTiming(host2, 2.0); - Thread.sleep(1500); - order.clear(); + Thread.sleep(sleeptime); + order.clear(); order.add(host3); - order.add(host2); order.add(host1); - + order.add(host2); assert dsnitch.getSortedListByProximity(self, order).equals(order); // make host3 the worst @@ -85,25 +80,25 @@ public class DynamicEndpointSnitchTest { dsnitch.receiveTiming(host3, 2.0); } - Thread.sleep(1500); - order.clear(); + Thread.sleep(sleeptime); - order.add(host2); + order.clear(); order.add(host1); + order.add(host2); order.add(host3); + assert dsnitch.getSortedListByProximity(self, order).equals(order); // make host3 equal to the others for (int i = 0; i < 2; i++) { dsnitch.receiveTiming(host3, 1.0); } - Thread.sleep(1500); - order.clear(); + Thread.sleep(sleeptime); + order.clear(); order.add(host1); order.add(host2); order.add(host3); - assert dsnitch.getSortedListByProximity(self, order).equals(order); } }
