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