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


Reply via email to