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/09/29 23:55:22 UTC

[1/5] git commit: track coordinator latency and use that instead of local for read speculation; fix round-trip of percentile through string

Updated Branches:
  refs/heads/cassandra-2.0 c3b7669d0 -> d7bf566ae
  refs/heads/trunk ee4b50ca8 -> e9cfc64b1


track coordinator latency and use that instead of local for read speculation; fix round-trip of percentile through string


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

Branch: refs/heads/cassandra-2.0
Commit: 8693a26e42851b99716317f8c44d571f674fb697
Parents: c3b7669
Author: Jonathan Ellis <jb...@apache.org>
Authored: Fri Sep 27 17:38:00 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Sun Sep 29 16:38:14 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/config/CFMetaData.java |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java  | 14 +++++++-----
 .../cassandra/metrics/ColumnFamilyMetrics.java  | 24 ++++++++++++--------
 .../cassandra/metrics/LatencyMetrics.java       | 13 ++++-------
 .../cassandra/service/AbstractReadExecutor.java |  9 ++++----
 .../apache/cassandra/service/StorageProxy.java  | 12 +++++++---
 6 files changed, 42 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 29df8c3..51865c2 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -345,7 +345,8 @@ public final class CFMetaData
             switch (type)
             {
             case PERCENTILE:
-                return value + "PERCENTILE";
+                // TODO switch to BigDecimal so round-tripping isn't lossy
+                return (value * 100) + "PERCENTILE";
             case CUSTOM:
                 return value + "ms";
             default:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index c3bb81b..719e90f 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -109,7 +109,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
     private final AtomicLong liveRatioComputedAt = new AtomicLong(32);
 
     public final ColumnFamilyMetrics metric;
-    public volatile long sampleLatency = Long.MAX_VALUE;
+    public volatile long sampleLatencyNanos;
 
     public void reload()
     {
@@ -244,6 +244,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         this.indexManager = new SecondaryIndexManager(this);
         this.metric = new ColumnFamilyMetrics(this);
         fileIndexGenerator.set(generation);
+        sampleLatencyNanos = DatabaseDescriptor.getReadRpcTimeout() / 2;
 
         Caching caching = metadata.getCaching();
 
@@ -300,19 +301,20 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
                 {
                     case PERCENTILE:
                         // get percentile in nanos
-                        assert metric.readLatency.latency.durationUnit() == TimeUnit.MICROSECONDS;
-                        sampleLatency = (long) (metric.readLatency.latency.getSnapshot().getValue(retryPolicy.value) * 1000d);
+                        assert metric.coordinatorReadLatency.durationUnit() == TimeUnit.MICROSECONDS;
+                        logger.info("retryPolicy is {}", retryPolicy.value);
+                        sampleLatencyNanos = (long) (metric.coordinatorReadLatency.getSnapshot().getValue(retryPolicy.value) * 1000d);
                         break;
                     case CUSTOM:
                         // convert to nanos, since configuration is in millisecond
-                        sampleLatency = (long) (retryPolicy.value * 1000d * 1000d);
+                        sampleLatencyNanos = (long) (retryPolicy.value * 1000d * 1000d);
                         break;
                     default:
-                        sampleLatency = Long.MAX_VALUE;
+                        sampleLatencyNanos = Long.MAX_VALUE;
                         break;
                 }
             }
-        }, 30, 30, TimeUnit.SECONDS);
+        }, DatabaseDescriptor.getReadRpcTimeout(), DatabaseDescriptor.getReadRpcTimeout(), TimeUnit.MILLISECONDS);
     }
 
     /** call when dropping or renaming a CF. Performs mbean housekeeping and invalidates CFS to other operations */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
index b63bbfb..7265c7b 100644
--- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
@@ -17,11 +17,10 @@
  */
 package org.apache.cassandra.metrics;
 
+import java.util.concurrent.TimeUnit;
+
 import com.yammer.metrics.Metrics;
-import com.yammer.metrics.core.Counter;
-import com.yammer.metrics.core.Gauge;
-import com.yammer.metrics.core.Histogram;
-import com.yammer.metrics.core.MetricName;
+import com.yammer.metrics.core.*;
 import com.yammer.metrics.util.RatioGauge;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -49,9 +48,9 @@ public class ColumnFamilyMetrics
     public final Gauge<long[]> estimatedColumnCountHistogram;
     /** Histogram of the number of sstable data files accessed per read */
     public final Histogram sstablesPerReadHistogram;
-    /** Read metrics */
+    /** (Local) read metrics */
     public final LatencyMetrics readLatency;
-    /** Write metrics */
+    /** (Local) write metrics */
     public final LatencyMetrics writeLatency;
     /** Estimated number of tasks pending for this column family */
     public final Gauge<Integer> pendingTasks;
@@ -84,9 +83,12 @@ public class ColumnFamilyMetrics
     /** Live cells scanned in queries on this CF */
     public final Histogram liveScannedHistogram;
 
+    public final Timer coordinatorReadLatency;
+    public final Timer coordinatorScanLatency;
+
     private final MetricNameFactory factory;
 
-    public final Counter speculativeRetry;
+    public final Counter speculativeRetries;
 
     // for backward compatibility
     @Deprecated public final EstimatedHistogram sstablesPerRead = new EstimatedHistogram(35);
@@ -159,7 +161,7 @@ public class ColumnFamilyMetrics
                         total++;
                     }
                 }
-                return total != 0 ? (double)sum/total: 0;
+                return total != 0 ? (double) sum / total : 0;
             }
         });
         readLatency = new LatencyMetrics(factory, "Read");
@@ -283,7 +285,7 @@ public class ColumnFamilyMetrics
                 return total;
             }
         });
-        speculativeRetry = Metrics.newCounter(factory.createMetricName("SpeculativeRetry"));
+        speculativeRetries = Metrics.newCounter(factory.createMetricName("SpeculativeRetries"));
         keyCacheHitRate = Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge()
         {
             protected double getNumerator()
@@ -304,6 +306,8 @@ public class ColumnFamilyMetrics
         });
         tombstoneScannedHistogram = Metrics.newHistogram(factory.createMetricName("TombstoneScannedHistogram"));
         liveScannedHistogram = Metrics.newHistogram(factory.createMetricName("LiveScannedHistogram"));
+        coordinatorReadLatency = Metrics.newTimer(factory.createMetricName("CoordinatorReadLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS);
+        coordinatorScanLatency = Metrics.newTimer(factory.createMetricName("CoordinatorScanLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS);
     }
 
     public void updateSSTableIterated(int count)
@@ -343,6 +347,8 @@ public class ColumnFamilyMetrics
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("SpeculativeRetry"));
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("TombstoneScannedHistogram"));
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveScannedHistogram"));
+        Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorReadLatency"));
+        Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorScanLatency"));
     }
 
     class ColumnFamilyMetricNameFactory implements MetricNameFactory

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
index 01ba997..b53449c 100644
--- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
@@ -85,15 +85,10 @@ public class LatencyMetrics
     public void addNano(long nanos)
     {
         // convert to microseconds. 1 millionth
-        addMicro(nanos / 1000);
-    }
-
-    public void addMicro(long micros)
-    {
-        latency.update(micros, TimeUnit.MICROSECONDS);
-        totalLatency.inc(micros);
-        totalLatencyHistogram.add(micros);
-        recentLatencyHistogram.add(micros);
+        latency.update(nanos, TimeUnit.NANOSECONDS);
+        totalLatency.inc(nanos / 1000);
+        totalLatencyHistogram.add(nanos / 1000);
+        recentLatencyHistogram.add(nanos / 1000);
     }
 
     public void release()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
index 280715a..c56975c 100644
--- a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
+++ b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.service;
 
 import java.net.InetAddress;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -265,10 +264,10 @@ public abstract class AbstractReadExecutor
         public void maybeTryAdditionalReplicas()
         {
             // no latency information, or we're overloaded
-            if (cfs.sampleLatency > TimeUnit.MILLISECONDS.toNanos(command.getTimeout()))
+            if (cfs.sampleLatencyNanos > TimeUnit.MILLISECONDS.toNanos(command.getTimeout()))
                 return;
 
-            if (!handler.await(cfs.sampleLatency, TimeUnit.NANOSECONDS))
+            if (!handler.await(cfs.sampleLatencyNanos, TimeUnit.NANOSECONDS))
             {
                 // Could be waiting on the data, or on enough digests.
                 ReadCommand retryCommand = command;
@@ -283,7 +282,7 @@ public abstract class AbstractReadExecutor
                 MessagingService.instance().sendRR(retryCommand.createMessage(), extraReplica, handler);
                 speculated = true;
 
-                cfs.metric.speculativeRetry.inc();
+                cfs.metric.speculativeRetries.inc();
             }
         }
 
@@ -324,7 +323,7 @@ public abstract class AbstractReadExecutor
             makeDataRequests(targetReplicas.subList(0, targetReplicas.size() > 1 ? 2 : 1));
             if (targetReplicas.size() > 2)
                 makeDigestRequests(targetReplicas.subList(2, targetReplicas.size()));
-            cfs.metric.speculativeRetry.inc();
+            cfs.metric.speculativeRetries.inc();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index ffc65b9..51f171d 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -1181,7 +1181,11 @@ public class StorageProxy implements StorageProxyMBean
         }
         finally
         {
-            readMetrics.addNano(System.nanoTime() - start);
+            long latency = System.nanoTime() - start;
+            readMetrics.addNano(latency);
+            // TODO avoid giving every command the same latency number.  Can fix this in CASSADRA-5329
+            for (ReadCommand command : commands)
+                Keyspace.open(command.ksName).getColumnFamilyStore(command.cfName).metric.coordinatorReadLatency.update(latency, TimeUnit.NANOSECONDS);
         }
         return rows;
     }
@@ -1560,7 +1564,9 @@ public class StorageProxy implements StorageProxyMBean
         }
         finally
         {
-            rangeMetrics.addNano(System.nanoTime() - startTime);
+            long latency = System.nanoTime() - startTime;
+            rangeMetrics.addNano(latency);
+            Keyspace.open(command.keyspace).getColumnFamilyStore(command.columnFamily).metric.coordinatorScanLatency.update(latency, TimeUnit.NANOSECONDS);
         }
         return trim(command, rows);
     }
@@ -1576,7 +1582,7 @@ public class StorageProxy implements StorageProxyMBean
 
     public Map<String, List<String>> getSchemaVersions()
     {
-        return this.describeSchemaVersions();
+        return describeSchemaVersions();
     }
 
     /**


[4/5] git commit: make 99percentile the default speculative retry

Posted by jb...@apache.org.
make 99percentile the default speculative retry


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

Branch: refs/heads/cassandra-2.0
Commit: d7bf566aed0cd8add3707f97aa309b2bba9b28ee
Parents: 8693a26
Author: Jonathan Ellis <jb...@apache.org>
Authored: Sun Sep 29 16:53:45 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Sun Sep 29 16:54:30 2013 -0500

----------------------------------------------------------------------
 NEWS.txt                                             | 10 ++++++++++
 src/java/org/apache/cassandra/config/CFMetaData.java |  2 +-
 2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d7bf566a/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index fc257f4..1f76277 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -13,6 +13,16 @@ restore snapshots created with the previous major version using the
 'sstableloader' tool. You can upgrade the file format of your snapshots
 using the provided 'sstableupgrade' tool.
 
+
+2.0.2
+=====
+
+New features
+------------
+    - Speculative retry defaults to 99th percentile
+      (See blog post at TODO)
+
+
 2.0.1
 =====
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d7bf566a/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 51865c2..8c4075c 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -83,7 +83,7 @@ public final class CFMetaData
     public final static Class<? extends AbstractCompactionStrategy> DEFAULT_COMPACTION_STRATEGY_CLASS = SizeTieredCompactionStrategy.class;
     public final static Caching DEFAULT_CACHING_STRATEGY = Caching.KEYS_ONLY;
     public final static int DEFAULT_DEFAULT_TIME_TO_LIVE = 0;
-    public final static SpeculativeRetry DEFAULT_SPECULATIVE_RETRY = new SpeculativeRetry(SpeculativeRetry.RetryType.NONE, 0);
+    public final static SpeculativeRetry DEFAULT_SPECULATIVE_RETRY = new SpeculativeRetry(SpeculativeRetry.RetryType.PERCENTILE, 0.99);
     public final static int DEFAULT_INDEX_INTERVAL = 128;
     public final static boolean DEFAULT_POPULATE_IO_CACHE_ON_FLUSH = false;
 


[5/5] git commit: merge from 2.0

Posted by jb...@apache.org.
merge from 2.0


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

Branch: refs/heads/trunk
Commit: e9cfc64b16b8bc6fae83bc5869979e1a1a32d07b
Parents: ee4b50c d7bf566
Author: Jonathan Ellis <jb...@apache.org>
Authored: Sun Sep 29 16:55:14 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Sun Sep 29 16:55:14 2013 -0500

----------------------------------------------------------------------
 NEWS.txt                                        |  9 ++++++++
 .../org/apache/cassandra/config/CFMetaData.java |  5 ++--
 .../apache/cassandra/db/ColumnFamilyStore.java  | 14 +++++++-----
 .../cassandra/metrics/ColumnFamilyMetrics.java  | 24 ++++++++++++--------
 .../cassandra/metrics/LatencyMetrics.java       | 13 ++++-------
 .../cassandra/service/AbstractReadExecutor.java |  9 ++++----
 .../apache/cassandra/service/StorageProxy.java  | 12 +++++++---
 7 files changed, 52 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e9cfc64b/NEWS.txt
----------------------------------------------------------------------
diff --cc NEWS.txt
index a7576d2,1f76277..85e95a1
--- a/NEWS.txt
+++ b/NEWS.txt
@@@ -14,18 -14,15 +14,27 @@@ restore snapshots created with the prev
  using the provided 'sstableupgrade' tool.
  
  
 +2.1
 +===
 +
 +Upgrading
 +---------
 +   - Rolling upgrades from anything pre-2.0 is not supported.
 +   - For leveled compaction users, 2.0 must be atleast started before
 +     upgrading to 2.1 due to the fact that the old JSON leveled
 +     manifest is migrated into the sstable metadata files on startup
 +     in 2.0 and this code is gone from 2.1.
 +
 +
+ 2.0.2
+ =====
+ 
+ New features
+ ------------
+     - Speculative retry defaults to 99th percentile
+       (See blog post at TODO)
+ 
+ 
  2.0.1
  =====
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e9cfc64b/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e9cfc64b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e9cfc64b/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------


[3/5] git commit: make 99percentile the default speculative retry

Posted by jb...@apache.org.
make 99percentile the default speculative retry


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

Branch: refs/heads/trunk
Commit: d7bf566aed0cd8add3707f97aa309b2bba9b28ee
Parents: 8693a26
Author: Jonathan Ellis <jb...@apache.org>
Authored: Sun Sep 29 16:53:45 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Sun Sep 29 16:54:30 2013 -0500

----------------------------------------------------------------------
 NEWS.txt                                             | 10 ++++++++++
 src/java/org/apache/cassandra/config/CFMetaData.java |  2 +-
 2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d7bf566a/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index fc257f4..1f76277 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -13,6 +13,16 @@ restore snapshots created with the previous major version using the
 'sstableloader' tool. You can upgrade the file format of your snapshots
 using the provided 'sstableupgrade' tool.
 
+
+2.0.2
+=====
+
+New features
+------------
+    - Speculative retry defaults to 99th percentile
+      (See blog post at TODO)
+
+
 2.0.1
 =====
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d7bf566a/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 51865c2..8c4075c 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -83,7 +83,7 @@ public final class CFMetaData
     public final static Class<? extends AbstractCompactionStrategy> DEFAULT_COMPACTION_STRATEGY_CLASS = SizeTieredCompactionStrategy.class;
     public final static Caching DEFAULT_CACHING_STRATEGY = Caching.KEYS_ONLY;
     public final static int DEFAULT_DEFAULT_TIME_TO_LIVE = 0;
-    public final static SpeculativeRetry DEFAULT_SPECULATIVE_RETRY = new SpeculativeRetry(SpeculativeRetry.RetryType.NONE, 0);
+    public final static SpeculativeRetry DEFAULT_SPECULATIVE_RETRY = new SpeculativeRetry(SpeculativeRetry.RetryType.PERCENTILE, 0.99);
     public final static int DEFAULT_INDEX_INTERVAL = 128;
     public final static boolean DEFAULT_POPULATE_IO_CACHE_ON_FLUSH = false;
 


[2/5] git commit: track coordinator latency and use that instead of local for read speculation; fix round-trip of percentile through string

Posted by jb...@apache.org.
track coordinator latency and use that instead of local for read speculation; fix round-trip of percentile through string


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

Branch: refs/heads/trunk
Commit: 8693a26e42851b99716317f8c44d571f674fb697
Parents: c3b7669
Author: Jonathan Ellis <jb...@apache.org>
Authored: Fri Sep 27 17:38:00 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Sun Sep 29 16:38:14 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/config/CFMetaData.java |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java  | 14 +++++++-----
 .../cassandra/metrics/ColumnFamilyMetrics.java  | 24 ++++++++++++--------
 .../cassandra/metrics/LatencyMetrics.java       | 13 ++++-------
 .../cassandra/service/AbstractReadExecutor.java |  9 ++++----
 .../apache/cassandra/service/StorageProxy.java  | 12 +++++++---
 6 files changed, 42 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 29df8c3..51865c2 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -345,7 +345,8 @@ public final class CFMetaData
             switch (type)
             {
             case PERCENTILE:
-                return value + "PERCENTILE";
+                // TODO switch to BigDecimal so round-tripping isn't lossy
+                return (value * 100) + "PERCENTILE";
             case CUSTOM:
                 return value + "ms";
             default:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index c3bb81b..719e90f 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -109,7 +109,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
     private final AtomicLong liveRatioComputedAt = new AtomicLong(32);
 
     public final ColumnFamilyMetrics metric;
-    public volatile long sampleLatency = Long.MAX_VALUE;
+    public volatile long sampleLatencyNanos;
 
     public void reload()
     {
@@ -244,6 +244,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         this.indexManager = new SecondaryIndexManager(this);
         this.metric = new ColumnFamilyMetrics(this);
         fileIndexGenerator.set(generation);
+        sampleLatencyNanos = DatabaseDescriptor.getReadRpcTimeout() / 2;
 
         Caching caching = metadata.getCaching();
 
@@ -300,19 +301,20 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
                 {
                     case PERCENTILE:
                         // get percentile in nanos
-                        assert metric.readLatency.latency.durationUnit() == TimeUnit.MICROSECONDS;
-                        sampleLatency = (long) (metric.readLatency.latency.getSnapshot().getValue(retryPolicy.value) * 1000d);
+                        assert metric.coordinatorReadLatency.durationUnit() == TimeUnit.MICROSECONDS;
+                        logger.info("retryPolicy is {}", retryPolicy.value);
+                        sampleLatencyNanos = (long) (metric.coordinatorReadLatency.getSnapshot().getValue(retryPolicy.value) * 1000d);
                         break;
                     case CUSTOM:
                         // convert to nanos, since configuration is in millisecond
-                        sampleLatency = (long) (retryPolicy.value * 1000d * 1000d);
+                        sampleLatencyNanos = (long) (retryPolicy.value * 1000d * 1000d);
                         break;
                     default:
-                        sampleLatency = Long.MAX_VALUE;
+                        sampleLatencyNanos = Long.MAX_VALUE;
                         break;
                 }
             }
-        }, 30, 30, TimeUnit.SECONDS);
+        }, DatabaseDescriptor.getReadRpcTimeout(), DatabaseDescriptor.getReadRpcTimeout(), TimeUnit.MILLISECONDS);
     }
 
     /** call when dropping or renaming a CF. Performs mbean housekeeping and invalidates CFS to other operations */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
index b63bbfb..7265c7b 100644
--- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
@@ -17,11 +17,10 @@
  */
 package org.apache.cassandra.metrics;
 
+import java.util.concurrent.TimeUnit;
+
 import com.yammer.metrics.Metrics;
-import com.yammer.metrics.core.Counter;
-import com.yammer.metrics.core.Gauge;
-import com.yammer.metrics.core.Histogram;
-import com.yammer.metrics.core.MetricName;
+import com.yammer.metrics.core.*;
 import com.yammer.metrics.util.RatioGauge;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -49,9 +48,9 @@ public class ColumnFamilyMetrics
     public final Gauge<long[]> estimatedColumnCountHistogram;
     /** Histogram of the number of sstable data files accessed per read */
     public final Histogram sstablesPerReadHistogram;
-    /** Read metrics */
+    /** (Local) read metrics */
     public final LatencyMetrics readLatency;
-    /** Write metrics */
+    /** (Local) write metrics */
     public final LatencyMetrics writeLatency;
     /** Estimated number of tasks pending for this column family */
     public final Gauge<Integer> pendingTasks;
@@ -84,9 +83,12 @@ public class ColumnFamilyMetrics
     /** Live cells scanned in queries on this CF */
     public final Histogram liveScannedHistogram;
 
+    public final Timer coordinatorReadLatency;
+    public final Timer coordinatorScanLatency;
+
     private final MetricNameFactory factory;
 
-    public final Counter speculativeRetry;
+    public final Counter speculativeRetries;
 
     // for backward compatibility
     @Deprecated public final EstimatedHistogram sstablesPerRead = new EstimatedHistogram(35);
@@ -159,7 +161,7 @@ public class ColumnFamilyMetrics
                         total++;
                     }
                 }
-                return total != 0 ? (double)sum/total: 0;
+                return total != 0 ? (double) sum / total : 0;
             }
         });
         readLatency = new LatencyMetrics(factory, "Read");
@@ -283,7 +285,7 @@ public class ColumnFamilyMetrics
                 return total;
             }
         });
-        speculativeRetry = Metrics.newCounter(factory.createMetricName("SpeculativeRetry"));
+        speculativeRetries = Metrics.newCounter(factory.createMetricName("SpeculativeRetries"));
         keyCacheHitRate = Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge()
         {
             protected double getNumerator()
@@ -304,6 +306,8 @@ public class ColumnFamilyMetrics
         });
         tombstoneScannedHistogram = Metrics.newHistogram(factory.createMetricName("TombstoneScannedHistogram"));
         liveScannedHistogram = Metrics.newHistogram(factory.createMetricName("LiveScannedHistogram"));
+        coordinatorReadLatency = Metrics.newTimer(factory.createMetricName("CoordinatorReadLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS);
+        coordinatorScanLatency = Metrics.newTimer(factory.createMetricName("CoordinatorScanLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS);
     }
 
     public void updateSSTableIterated(int count)
@@ -343,6 +347,8 @@ public class ColumnFamilyMetrics
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("SpeculativeRetry"));
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("TombstoneScannedHistogram"));
         Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveScannedHistogram"));
+        Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorReadLatency"));
+        Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorScanLatency"));
     }
 
     class ColumnFamilyMetricNameFactory implements MetricNameFactory

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
index 01ba997..b53449c 100644
--- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
@@ -85,15 +85,10 @@ public class LatencyMetrics
     public void addNano(long nanos)
     {
         // convert to microseconds. 1 millionth
-        addMicro(nanos / 1000);
-    }
-
-    public void addMicro(long micros)
-    {
-        latency.update(micros, TimeUnit.MICROSECONDS);
-        totalLatency.inc(micros);
-        totalLatencyHistogram.add(micros);
-        recentLatencyHistogram.add(micros);
+        latency.update(nanos, TimeUnit.NANOSECONDS);
+        totalLatency.inc(nanos / 1000);
+        totalLatencyHistogram.add(nanos / 1000);
+        recentLatencyHistogram.add(nanos / 1000);
     }
 
     public void release()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
index 280715a..c56975c 100644
--- a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
+++ b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.service;
 
 import java.net.InetAddress;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -265,10 +264,10 @@ public abstract class AbstractReadExecutor
         public void maybeTryAdditionalReplicas()
         {
             // no latency information, or we're overloaded
-            if (cfs.sampleLatency > TimeUnit.MILLISECONDS.toNanos(command.getTimeout()))
+            if (cfs.sampleLatencyNanos > TimeUnit.MILLISECONDS.toNanos(command.getTimeout()))
                 return;
 
-            if (!handler.await(cfs.sampleLatency, TimeUnit.NANOSECONDS))
+            if (!handler.await(cfs.sampleLatencyNanos, TimeUnit.NANOSECONDS))
             {
                 // Could be waiting on the data, or on enough digests.
                 ReadCommand retryCommand = command;
@@ -283,7 +282,7 @@ public abstract class AbstractReadExecutor
                 MessagingService.instance().sendRR(retryCommand.createMessage(), extraReplica, handler);
                 speculated = true;
 
-                cfs.metric.speculativeRetry.inc();
+                cfs.metric.speculativeRetries.inc();
             }
         }
 
@@ -324,7 +323,7 @@ public abstract class AbstractReadExecutor
             makeDataRequests(targetReplicas.subList(0, targetReplicas.size() > 1 ? 2 : 1));
             if (targetReplicas.size() > 2)
                 makeDigestRequests(targetReplicas.subList(2, targetReplicas.size()));
-            cfs.metric.speculativeRetry.inc();
+            cfs.metric.speculativeRetries.inc();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8693a26e/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index ffc65b9..51f171d 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -1181,7 +1181,11 @@ public class StorageProxy implements StorageProxyMBean
         }
         finally
         {
-            readMetrics.addNano(System.nanoTime() - start);
+            long latency = System.nanoTime() - start;
+            readMetrics.addNano(latency);
+            // TODO avoid giving every command the same latency number.  Can fix this in CASSADRA-5329
+            for (ReadCommand command : commands)
+                Keyspace.open(command.ksName).getColumnFamilyStore(command.cfName).metric.coordinatorReadLatency.update(latency, TimeUnit.NANOSECONDS);
         }
         return rows;
     }
@@ -1560,7 +1564,9 @@ public class StorageProxy implements StorageProxyMBean
         }
         finally
         {
-            rangeMetrics.addNano(System.nanoTime() - startTime);
+            long latency = System.nanoTime() - startTime;
+            rangeMetrics.addNano(latency);
+            Keyspace.open(command.keyspace).getColumnFamilyStore(command.columnFamily).metric.coordinatorScanLatency.update(latency, TimeUnit.NANOSECONDS);
         }
         return trim(command, rows);
     }
@@ -1576,7 +1582,7 @@ public class StorageProxy implements StorageProxyMBean
 
     public Map<String, List<String>> getSchemaVersions()
     {
-        return this.describeSchemaVersions();
+        return describeSchemaVersions();
     }
 
     /**