You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2013/10/19 00:30:41 UTC

[2/3] git commit: Update FailureDetector to use nanontime patch by Sankalp Kohli; reviewed by jbellis for CASSANDRA-4925

Update FailureDetector to use nanontime
patch by Sankalp Kohli; reviewed by jbellis for CASSANDRA-4925


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/16bb8981
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/16bb8981
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/16bb8981

Branch: refs/heads/trunk
Commit: 16bb89810df5d1b0d8c7262c1f6c426e36866372
Parents: db275f4
Author: Jonathan Ellis <jb...@apache.org>
Authored: Fri Oct 18 09:50:07 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Fri Oct 18 23:29:03 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/gms/FailureDetector.java   | 25 +++++++++++---------
 .../cassandra/utils/BoundedStatsDeque.java      | 12 +++++-----
 .../apache/cassandra/gms/ArrivalWindowTest.java | 24 +++++++++----------
 .../cassandra/utils/BoundedStatsDequeTest.java  | 20 ++++++++--------
 5 files changed, 43 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/16bb8981/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index cccfc60..f4d6980 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0.2
+ * Update FailureDetector to use nanontime (CASSANDRA-4925)
  * Fix FileCacheService regressions (CASSANDRA-6149)
  * Never return WriteTimeout for CL.ANY (CASSANDRA-6032)
  * Fix race conditions in bulk loader (CASSANDRA-6129)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/16bb8981/src/java/org/apache/cassandra/gms/FailureDetector.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/FailureDetector.java b/src/java/org/apache/cassandra/gms/FailureDetector.java
index b82499e..344b1e6 100644
--- a/src/java/org/apache/cassandra/gms/FailureDetector.java
+++ b/src/java/org/apache/cassandra/gms/FailureDetector.java
@@ -188,7 +188,7 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
     {
         if (logger.isTraceEnabled())
             logger.trace("reporting {}", ep);
-        long now = System.currentTimeMillis();
+        long now = System.nanoTime();
         ArrivalWindow heartbeatWindow = arrivalSamples.get(ep);
         if (heartbeatWindow == null)
         {
@@ -205,7 +205,7 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
         {
             return;
         }
-        long now = System.currentTimeMillis();
+        long now = System.nanoTime();
         double phi = hbWnd.phi(now);
         if (logger.isTraceEnabled())
             logger.trace("PHI for " + ep + " : " + phi);
@@ -270,7 +270,7 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
 class ArrivalWindow
 {
     private static final Logger logger = LoggerFactory.getLogger(ArrivalWindow.class);
-    private double tLast = 0L;
+    private long tLast = 0L;
     private final BoundedStatsDeque arrivalIntervals;
 
     // this is useless except to provide backwards compatibility in phi_convict_threshold,
@@ -279,28 +279,31 @@ class ArrivalWindow
     // change.
     private final double PHI_FACTOR = 1.0 / Math.log(10.0);
 
+    private static final long MILLI_TO_NANO = 1000000L;
+
     // in the event of a long partition, never record an interval longer than the rpc timeout,
     // since if a host is regularly experiencing connectivity problems lasting this long we'd
     // rather mark it down quickly instead of adapting
-    private final double MAX_INTERVAL_IN_MS = DatabaseDescriptor.getRpcTimeout();
+    private final long MAX_INTERVAL_IN_NANO = DatabaseDescriptor.getRpcTimeout() * MILLI_TO_NANO;
 
     ArrivalWindow(int size)
     {
         arrivalIntervals = new BoundedStatsDeque(size);
     }
 
-    synchronized void add(double value)
+    synchronized void add(long value)
     {
-        double interArrivalTime;
-        if (tLast > 0L)
+        long interArrivalTime;
+        if (tLast != 0L)
         {
             interArrivalTime = (value - tLast);
         }
         else
         {
-            interArrivalTime = Gossiper.intervalInMillis / 2;
+            interArrivalTime = (Gossiper.intervalInMillis * MILLI_TO_NANO) / 2;
         }
-        if (interArrivalTime <= MAX_INTERVAL_IN_MS)
+
+        if (interArrivalTime <= MAX_INTERVAL_IN_NANO)
             arrivalIntervals.add(interArrivalTime);
         else
             logger.debug("Ignoring interval time of {}", interArrivalTime);
@@ -321,9 +324,9 @@ class ArrivalWindow
     double phi(long tnow)
     {
         int size = arrivalIntervals.size();
-        double t = tnow - tLast;
+        long t = tnow - tLast;
         return (size > 0)
-               ? PHI_FACTOR * t / mean()
+               ? PHI_FACTOR * (t / mean())
                : 0.0;
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/16bb8981/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
index 43d2ce4..a5fefa6 100644
--- a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
+++ b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
@@ -24,16 +24,16 @@ import java.util.concurrent.LinkedBlockingDeque;
 /**
  * bounded threadsafe deque
  */
-public class BoundedStatsDeque implements Iterable<Double>
+public class BoundedStatsDeque implements Iterable<Long>
 {
-    protected final LinkedBlockingDeque<Double> deque;
+    protected final LinkedBlockingDeque<Long> deque;
 
     public BoundedStatsDeque(int size)
     {
-        deque = new LinkedBlockingDeque<Double>(size);
+        deque = new LinkedBlockingDeque<Long>(size);
     }
 
-    public Iterator<Double> iterator()
+    public Iterator<Long> iterator()
     {
         return deque.iterator();
     }
@@ -48,7 +48,7 @@ public class BoundedStatsDeque implements Iterable<Double>
         deque.clear();
     }
 
-    public void add(double i)
+    public void add(long i)
     {
         if (!deque.offer(i))
         {
@@ -67,7 +67,7 @@ public class BoundedStatsDeque implements Iterable<Double>
     public double sum()
     {
         double sum = 0d;
-        for (Double interval : deque)
+        for (Long interval : deque)
         {
             sum += interval;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/16bb8981/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java b/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
index 277cae1..d05ba96 100644
--- a/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
+++ b/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
@@ -27,23 +27,23 @@ import org.junit.Test;
 
 public class ArrivalWindowTest
 {
-
     @Test
-    public void test()
+    public void testWithNanoTime()
     {
-        ArrivalWindow window = new ArrivalWindow(4);
-        //base readings
-        window.add(111);
-        window.add(222);
-        window.add(333);
-        window.add(444);
-        window.add(555);
+        final ArrivalWindow windowWithNano = new ArrivalWindow(4);
+        final long toNano = 1000000L;
+
+        windowWithNano.add(111 * toNano);
+        windowWithNano.add(222 * toNano);
+        windowWithNano.add(333 * toNano);
+        windowWithNano.add(444 * toNano);
+        windowWithNano.add(555 * toNano);
 
-        //all good
-        assertEquals(0.4342, window.phi(666), 0.01);
 
+        assertEquals(0.4342, windowWithNano.phi(666 * toNano), 0.01);
         //oh noes, a much higher timestamp, something went wrong!
-        assertEquals(9.566, window.phi(3000), 0.01);
+        assertEquals(9.566, windowWithNano.phi(3000 * toNano), 0.01);
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/16bb8981/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java b/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
index 2f5b5d6..4739023 100644
--- a/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
+++ b/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
@@ -41,22 +41,22 @@ public class BoundedStatsDequeTest
         assertEquals(0, bsd.sum(), 0.001d);
         assertEquals(0, bsd.mean(), 0.001d);
 
-        bsd.add(1d); //this one falls out, over limit
-        bsd.add(2d);
-        bsd.add(3d);
-        bsd.add(4d);
-        bsd.add(5d);
+        bsd.add(1L); //this one falls out, over limit
+        bsd.add(2L);
+        bsd.add(3L);
+        bsd.add(4L);
+        bsd.add(5L);
 
         //verify that everything is in there
-        Iterator<Double> iter = bsd.iterator();
+        Iterator<Long> iter = bsd.iterator();
         assertTrue(iter.hasNext());
-        assertEquals(2d, iter.next(), 0);
+        assertEquals(2L, iter.next(), 0);
         assertTrue(iter.hasNext());
-        assertEquals(3d, iter.next(), 0);
+        assertEquals(3L, iter.next(), 0);
         assertTrue(iter.hasNext());
-        assertEquals(4d, iter.next(), 0);
+        assertEquals(4L, iter.next(), 0);
         assertTrue(iter.hasNext());
-        assertEquals(5d, iter.next(), 0);
+        assertEquals(5L, iter.next(), 0);
         assertFalse(iter.hasNext());
 
         //check results