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/11/20 19:54:07 UTC

[3/6] git commit: Optimize FD phi calculation patch by jbellis; reviewed by brandonwilliams for CASSANDRA-6386

Optimize FD phi calculation
patch by jbellis; reviewed by brandonwilliams for CASSANDRA-6386


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

Branch: refs/heads/trunk
Commit: b3ae77d7baa16673d749c8ab8beae09e0b319c00
Parents: 5f79f53
Author: Jonathan Ellis <jb...@apache.org>
Authored: Wed Nov 20 12:41:21 2013 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Wed Nov 20 12:41:21 2013 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  4 +++
 .../apache/cassandra/gms/FailureDetector.java   | 12 --------
 src/java/org/apache/cassandra/gms/Gossiper.java |  2 +-
 .../apache/cassandra/gms/IFailureDetector.java  |  6 ----
 .../cassandra/utils/BoundedStatsDeque.java      | 30 +++++++-------------
 .../apache/cassandra/dht/BootStrapperTest.java  |  1 -
 .../cassandra/utils/BoundedStatsDequeTest.java  |  6 ----
 7 files changed, 15 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9c0bc6b..dc56d90 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,7 @@
+1.2.13
+ * Optimize FD phi calculation (CASSANDRA-6386)
+
+
 1.2.12
  * Invalidate row cache when dropping CF (CASSANDRA-6351)
  * add non-jamm path for cached statements (CASSANDRA-6293)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/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 26d78ab..e4ffb88 100644
--- a/src/java/org/apache/cassandra/gms/FailureDetector.java
+++ b/src/java/org/apache/cassandra/gms/FailureDetector.java
@@ -177,13 +177,6 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
         return epState != null && epState.isAlive();
     }
 
-    public void clear(InetAddress ep)
-    {
-        ArrivalWindow heartbeatWindow = arrivalSamples.get(ep);
-        if (heartbeatWindow != null)
-            heartbeatWindow.clear();
-    }
-
     public void report(InetAddress ep)
     {
         if (logger.isTraceEnabled())
@@ -312,11 +305,6 @@ class ArrivalWindow
         return arrivalIntervals.mean();
     }
 
-    void clear()
-    {
-        arrivalIntervals.clear();
-    }
-
     // see CASSANDRA-2597 for an explanation of the math at work here.
     double phi(long tnow)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index cbb7d80..545d26b 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -775,7 +775,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
                 if (!localEndpointState.isAlive())
                 {
                     logger.debug("Clearing interval times for {} due to generation change", endpoint);
-                    fd.clear(endpoint);
+                    fd.remove(endpoint);
                 }
                 fd.report(endpoint);
                 return;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/src/java/org/apache/cassandra/gms/IFailureDetector.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/IFailureDetector.java b/src/java/org/apache/cassandra/gms/IFailureDetector.java
index 444c100..4e9d528 100644
--- a/src/java/org/apache/cassandra/gms/IFailureDetector.java
+++ b/src/java/org/apache/cassandra/gms/IFailureDetector.java
@@ -38,12 +38,6 @@ public interface IFailureDetector
     public boolean isAlive(InetAddress ep);
 
     /**
-     * Clear any existing interval timings for this endpoint
-     * @param ep
-     */
-    public void clear(InetAddress ep);
-
-    /**
      * This method is invoked by any entity wanting to interrogate the status of an endpoint.
      * In our case it would be the Gossiper. The Failure Detector will then calculate Phi and
      * deem an endpoint as suspicious or alive as explained in the Hayashibara paper.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/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..c9aa028 100644
--- a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
+++ b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java
@@ -20,17 +20,22 @@ package org.apache.cassandra.utils;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.util.concurrent.AtomicDouble;
 
 /**
  * bounded threadsafe deque
  */
 public class BoundedStatsDeque implements Iterable<Double>
 {
-    protected final LinkedBlockingDeque<Double> deque;
+    private final LinkedBlockingDeque<Double> deque;
+    private final AtomicDouble sum;
 
     public BoundedStatsDeque(int size)
     {
         deque = new LinkedBlockingDeque<Double>(size);
+        sum = new AtomicDouble(0);
     }
 
     public Iterator<Double> iterator()
@@ -43,35 +48,20 @@ public class BoundedStatsDeque implements Iterable<Double>
         return deque.size();
     }
 
-    public void clear()
-    {
-        deque.clear();
-    }
-
     public void add(double i)
     {
         if (!deque.offer(i))
         {
-            try
-            {
-                deque.remove();
-            }
-            catch (NoSuchElementException e)
-            {
-                // oops, clear() beat us to it
-            }
+            Double removed = deque.remove();
+            sum.addAndGet(-removed);
             deque.offer(i);
         }
+        sum.addAndGet(i);
     }
 
     public double sum()
     {
-        double sum = 0d;
-        for (Double interval : deque)
-        {
-            sum += interval;
-        }
-        return sum;
+        return sum.get();
     }
 
     public double mean()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
index ae7e36c..9931e85 100644
--- a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
+++ b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
@@ -198,7 +198,6 @@ public class BootStrapperTest extends SchemaLoader
             public void unregisterFailureDetectionEventListener(IFailureDetectionEventListener listener) { throw new UnsupportedOperationException(); }
             public void remove(InetAddress ep) { throw new UnsupportedOperationException(); }
             public void forceConviction(InetAddress ep) { throw new UnsupportedOperationException(); }
-            public void clear(InetAddress ep) { throw new UnsupportedOperationException(); }
         };
         s.addSourceFilter(new RangeStreamer.FailureDetectorSourceFilter(mockFailureDetector));
         s.addRanges(table, Table.open(table).getReplicationStrategy().getPendingAddressRanges(tmd, myToken, myEndpoint));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3ae77d7/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..7c4b9f2 100644
--- a/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
+++ b/test/unit/org/apache/cassandra/utils/BoundedStatsDequeTest.java
@@ -29,7 +29,6 @@ import org.junit.Test;
 
 public class BoundedStatsDequeTest
 {
-
     @Test
     public void test()
     {
@@ -63,10 +62,5 @@ public class BoundedStatsDequeTest
         assertEquals(size, bsd.size());
         assertEquals(14, bsd.sum(), 0.001d);
         assertEquals(3.5, bsd.mean(), 0.001d);
-
-        //check that it clears properly
-        bsd.clear();
-        assertFalse(bsd.iterator().hasNext());
     }
-
 }