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/08 18:17:17 UTC

[1/6] git commit: Trace index selection patch by Lyuben Todorov and jbellis for CASSANDRA-6001

Updated Branches:
  refs/heads/cassandra-1.2 fe56518d9 -> 241c70a37
  refs/heads/cassandra-2.0 690dac3c2 -> 21ab8f81a
  refs/heads/trunk cfac7fbc1 -> c8434acf7


Trace index selection
patch by Lyuben Todorov and jbellis for CASSANDRA-6001


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

Branch: refs/heads/cassandra-1.2
Commit: 241c70a37a89334657c9983736b35db0611fb874
Parents: fe56518
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 09:52:42 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 10:00:25 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                         |  1 +
 .../db/index/composites/CompositesSearcher.java     | 16 ++++++++++++++--
 .../cassandra/db/index/keys/KeysSearcher.java       | 16 ++++++++++++++--
 3 files changed, 29 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 35bd832..adbae91 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@
  * Fix skipping columns with multiple slices (CASSANDRA-6119)
  * Expose connected thrift + native client counts (CASSANDRA-5084)
  * Optimize auth setup (CASSANDRA-6122)
+ * Trace index selection (CASSANDRA-6001)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index 1e9d59d..82e227f 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@ -36,7 +36,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 
 public class CompositesSearcher extends SecondaryIndexSearcher
 {
@@ -54,22 +56,32 @@ public class CompositesSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index 4be7988..7d23e6c 100644
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@ -32,7 +32,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.HeapAllocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,22 +52,32 @@ public class KeysSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 


[3/6] git commit: Trace index selection patch by Lyuben Todorov and jbellis for CASSANDRA-6001

Posted by jb...@apache.org.
Trace index selection
patch by Lyuben Todorov and jbellis for CASSANDRA-6001


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

Branch: refs/heads/trunk
Commit: 241c70a37a89334657c9983736b35db0611fb874
Parents: fe56518
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 09:52:42 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 10:00:25 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                         |  1 +
 .../db/index/composites/CompositesSearcher.java     | 16 ++++++++++++++--
 .../cassandra/db/index/keys/KeysSearcher.java       | 16 ++++++++++++++--
 3 files changed, 29 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 35bd832..adbae91 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@
  * Fix skipping columns with multiple slices (CASSANDRA-6119)
  * Expose connected thrift + native client counts (CASSANDRA-5084)
  * Optimize auth setup (CASSANDRA-6122)
+ * Trace index selection (CASSANDRA-6001)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index 1e9d59d..82e227f 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@ -36,7 +36,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 
 public class CompositesSearcher extends SecondaryIndexSearcher
 {
@@ -54,22 +56,32 @@ public class CompositesSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index 4be7988..7d23e6c 100644
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@ -32,7 +32,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.HeapAllocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,22 +52,32 @@ public class KeysSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 


[5/6] git commit: merge from 1.2

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


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

Branch: refs/heads/cassandra-2.0
Commit: 21ab8f81a2adde9be27728c22e8b5733079aee9b
Parents: 690dac3 241c70a
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 10:55:31 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 10:55:31 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  1 +
 .../db/index/SecondaryIndexSearcher.java          | 18 +++++++++++++++---
 .../db/index/composites/CompositesSearcher.java   |  5 ++++-
 .../cassandra/db/index/keys/KeysSearcher.java     | 15 ++++++++-------
 4 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index fef5243,adbae91..1877a85
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -39,43 -15,10 +39,44 @@@ Merged from 1.2
   * Fix skipping columns with multiple slices (CASSANDRA-6119)
   * Expose connected thrift + native client counts (CASSANDRA-5084)
   * Optimize auth setup (CASSANDRA-6122)
+  * Trace index selection (CASSANDRA-6001)
  
  
 -1.2.10
 +2.0.1
 + * Fix bug that could allow reading deleted data temporarily (CASSANDRA-6025)
 + * Improve memory use defaults (CASSANDRA-5069)
 + * Make ThriftServer more easlly extensible (CASSANDRA-6058)
 + * Remove Hadoop dependency from ITransportFactory (CASSANDRA-6062)
 + * add file_cache_size_in_mb setting (CASSANDRA-5661)
 + * Improve error message when yaml contains invalid properties (CASSANDRA-5958)
 + * Improve leveled compaction's ability to find non-overlapping L0 compactions
 +   to work on concurrently (CASSANDRA-5921)
 + * Notify indexer of columns shadowed by range tombstones (CASSANDRA-5614)
 + * Log Merkle tree stats (CASSANDRA-2698)
 + * Switch from crc32 to adler32 for compressed sstable checksums (CASSANDRA-5862)
 + * Improve offheap memcpy performance (CASSANDRA-5884)
 + * Use a range aware scanner for cleanup (CASSANDRA-2524)
 + * Cleanup doesn't need to inspect sstables that contain only local data
 +   (CASSANDRA-5722)
 + * Add ability for CQL3 to list partition keys (CASSANDRA-4536)
 + * Improve native protocol serialization (CASSANDRA-5664)
 + * Upgrade Thrift to 0.9.1 (CASSANDRA-5923)
 + * Require superuser status for adding triggers (CASSANDRA-5963)
 + * Make standalone scrubber handle old and new style leveled manifest
 +   (CASSANDRA-6005)
 + * Fix paxos bugs (CASSANDRA-6012, 6013, 6023)
 + * Fix paged ranges with multiple replicas (CASSANDRA-6004)
 + * Fix potential AssertionError during tracing (CASSANDRA-6041)
 + * Fix NPE in sstablesplit (CASSANDRA-6027)
 + * Migrate pre-2.0 key/value/column aliases to system.schema_columns
 +   (CASSANDRA-6009)
 + * Paging filter empty rows too agressively (CASSANDRA-6040)
 + * Support variadic parameters for IN clauses (CASSANDRA-4210)
 + * cqlsh: return the result of CAS writes (CASSANDRA-5796)
 + * Fix validation of IN clauses with 2ndary indexes (CASSANDRA-6050)
 + * Support named bind variables in CQL (CASSANDRA-6033)
 +Merged from 1.2:
 + * Allow cache-keys-to-save to be set at runtime (CASSANDRA-5980)
   * Avoid second-guessing out-of-space state (CASSANDRA-5605)
   * Tuning knobs for dealing with large blobs and many CFs (CASSANDRA-5982)
   * (Hadoop) Fix CQLRW for thrift tables (CASSANDRA-6002)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
index d28afc0,a8c1dde..f3e993d
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
@@@ -21,13 -21,13 +21,15 @@@ import java.nio.ByteBuffer
  import java.util.*;
  
  import org.apache.cassandra.db.*;
 -import org.apache.cassandra.db.filter.IDiskAtomFilter;
 -import org.apache.cassandra.dht.AbstractBounds;
 +import org.apache.cassandra.db.filter.ExtendedFilter;
  import org.apache.cassandra.thrift.IndexExpression;
 +import org.apache.cassandra.thrift.IndexOperator;
++import org.apache.cassandra.tracing.Tracing;
++import org.apache.cassandra.utils.FBUtilities;
  
  public abstract class SecondaryIndexSearcher
  {
--    protected final SecondaryIndexManager    indexManager;
++    protected final SecondaryIndexManager indexManager;
      protected final Set<ByteBuffer> columns;
      protected final ColumnFamilyStore baseCfs;
  
@@@ -43,31 -43,15 +45,41 @@@
      /**
       * @return true this index is able to handle given clauses.
       */
 -    public abstract boolean isIndexing(List<IndexExpression> clause);
 -    
 -    protected boolean isIndexValueStale(ColumnFamily liveData, ByteBuffer indexedColumnName, ByteBuffer indexedValue)
 +    public boolean isIndexing(List<IndexExpression> clause)
      {
 -        IColumn liveColumn = liveData.getColumn(indexedColumnName);
 -        if (liveColumn == null || liveColumn.isMarkedForDelete())
 -            return true;
 -        
 -        ByteBuffer liveValue = liveColumn.value();
 -        return 0 != liveData.metadata().getValueValidator(indexedColumnName).compare(indexedValue, liveValue);
 +        return highestSelectivityPredicate(clause) != null;
 +    }
 +
 +    protected IndexExpression highestSelectivityPredicate(List<IndexExpression> clause)
 +    {
 +        IndexExpression best = null;
 +        int bestMeanCount = Integer.MAX_VALUE;
++        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
++
 +        for (IndexExpression expression : clause)
 +        {
-             //skip columns belonging to a different index type
-             if(!columns.contains(expression.column_name))
++            // skip columns belonging to a different index type
++            if (!columns.contains(expression.column_name))
 +                continue;
 +
 +            SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
 +            if (index == null || (expression.op != IndexOperator.EQ))
 +                continue;
 +            int columns = index.getIndexCfs().getMeanColumns();
++            candidates.put(index, columns);
 +            if (columns < bestMeanCount)
 +            {
 +                best = expression;
 +                bestMeanCount = columns;
 +            }
 +        }
++
++        if (best == null)
++            Tracing.trace("No applicable indexes found");
++        else
++            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
++                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
++
 +        return best;
      }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index 0242fd2,82e227f..aa35605
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@@ -24,9 -24,11 +24,12 @@@ import java.util.*
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
 +import org.apache.cassandra.cql3.ColumnNameBuilder;
  import org.apache.cassandra.db.*;
--import org.apache.cassandra.db.filter.*;
 -import org.apache.cassandra.db.index.AbstractSimplePerColumnSecondaryIndex;
 -import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
 -import org.apache.cassandra.db.index.SecondaryIndex;
++import org.apache.cassandra.db.filter.ExtendedFilter;
++import org.apache.cassandra.db.filter.IDiskAtomFilter;
++import org.apache.cassandra.db.filter.QueryFilter;
++import org.apache.cassandra.db.filter.SliceQueryFilter;
  import org.apache.cassandra.db.index.SecondaryIndexManager;
  import org.apache.cassandra.db.index.SecondaryIndexSearcher;
  import org.apache.cassandra.db.marshal.CompositeType;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index 205efb7,7d23e6c..e14f865
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@@ -19,18 -19,15 +19,19 @@@ package org.apache.cassandra.db.index.k
  
  import java.io.IOException;
  import java.nio.ByteBuffer;
--import java.util.*;
++import java.util.Collection;
++import java.util.Iterator;
++import java.util.List;
++import java.util.Set;
 +
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  
  import org.apache.cassandra.db.*;
--import org.apache.cassandra.db.filter.*;
--import org.apache.cassandra.db.index.AbstractSimplePerColumnSecondaryIndex;
--import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
--import org.apache.cassandra.db.index.SecondaryIndex;
--import org.apache.cassandra.db.index.SecondaryIndexManager;
--import org.apache.cassandra.db.index.SecondaryIndexSearcher;
++import org.apache.cassandra.db.filter.ExtendedFilter;
++import org.apache.cassandra.db.filter.IDiskAtomFilter;
++import org.apache.cassandra.db.filter.QueryFilter;
++import org.apache.cassandra.db.index.*;
  import org.apache.cassandra.dht.AbstractBounds;
  import org.apache.cassandra.dht.Range;
  import org.apache.cassandra.thrift.IndexExpression;


[2/6] git commit: Trace index selection patch by Lyuben Todorov and jbellis for CASSANDRA-6001

Posted by jb...@apache.org.
Trace index selection
patch by Lyuben Todorov and jbellis for CASSANDRA-6001


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

Branch: refs/heads/cassandra-2.0
Commit: 241c70a37a89334657c9983736b35db0611fb874
Parents: fe56518
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 09:52:42 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 10:00:25 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                         |  1 +
 .../db/index/composites/CompositesSearcher.java     | 16 ++++++++++++++--
 .../cassandra/db/index/keys/KeysSearcher.java       | 16 ++++++++++++++--
 3 files changed, 29 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 35bd832..adbae91 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@
  * Fix skipping columns with multiple slices (CASSANDRA-6119)
  * Expose connected thrift + native client counts (CASSANDRA-5084)
  * Optimize auth setup (CASSANDRA-6122)
+ * Trace index selection (CASSANDRA-6001)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index 1e9d59d..82e227f 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@ -36,7 +36,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 
 public class CompositesSearcher extends SecondaryIndexSearcher
 {
@@ -54,22 +56,32 @@ public class CompositesSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/241c70a3/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index 4be7988..7d23e6c 100644
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@ -32,7 +32,9 @@ import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.thrift.IndexExpression;
 import org.apache.cassandra.thrift.IndexOperator;
+import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.HeapAllocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,22 +52,32 @@ public class KeysSearcher extends SecondaryIndexSearcher
     {
         IndexExpression best = null;
         int bestMeanCount = Integer.MAX_VALUE;
+        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+
         for (IndexExpression expression : clause)
         {
-            //skip columns belonging to a different index type
-            if(!columns.contains(expression.column_name))
+            // skip columns belonging to a different index type
+            if (!columns.contains(expression.column_name))
                 continue;
 
             SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
             if (index == null || (expression.op != IndexOperator.EQ))
                 continue;
             int columns = index.getIndexCfs().getMeanColumns();
+            candidates.put(index, columns);
             if (columns < bestMeanCount)
             {
                 best = expression;
                 bestMeanCount = columns;
             }
         }
+
+        if (best == null)
+            Tracing.trace("No applicable indexes found");
+        else
+            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
+                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
+
         return best;
     }
 


[4/6] git commit: merge from 1.2

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


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

Branch: refs/heads/trunk
Commit: 21ab8f81a2adde9be27728c22e8b5733079aee9b
Parents: 690dac3 241c70a
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 10:55:31 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 10:55:31 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  1 +
 .../db/index/SecondaryIndexSearcher.java          | 18 +++++++++++++++---
 .../db/index/composites/CompositesSearcher.java   |  5 ++++-
 .../cassandra/db/index/keys/KeysSearcher.java     | 15 ++++++++-------
 4 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index fef5243,adbae91..1877a85
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -39,43 -15,10 +39,44 @@@ Merged from 1.2
   * Fix skipping columns with multiple slices (CASSANDRA-6119)
   * Expose connected thrift + native client counts (CASSANDRA-5084)
   * Optimize auth setup (CASSANDRA-6122)
+  * Trace index selection (CASSANDRA-6001)
  
  
 -1.2.10
 +2.0.1
 + * Fix bug that could allow reading deleted data temporarily (CASSANDRA-6025)
 + * Improve memory use defaults (CASSANDRA-5069)
 + * Make ThriftServer more easlly extensible (CASSANDRA-6058)
 + * Remove Hadoop dependency from ITransportFactory (CASSANDRA-6062)
 + * add file_cache_size_in_mb setting (CASSANDRA-5661)
 + * Improve error message when yaml contains invalid properties (CASSANDRA-5958)
 + * Improve leveled compaction's ability to find non-overlapping L0 compactions
 +   to work on concurrently (CASSANDRA-5921)
 + * Notify indexer of columns shadowed by range tombstones (CASSANDRA-5614)
 + * Log Merkle tree stats (CASSANDRA-2698)
 + * Switch from crc32 to adler32 for compressed sstable checksums (CASSANDRA-5862)
 + * Improve offheap memcpy performance (CASSANDRA-5884)
 + * Use a range aware scanner for cleanup (CASSANDRA-2524)
 + * Cleanup doesn't need to inspect sstables that contain only local data
 +   (CASSANDRA-5722)
 + * Add ability for CQL3 to list partition keys (CASSANDRA-4536)
 + * Improve native protocol serialization (CASSANDRA-5664)
 + * Upgrade Thrift to 0.9.1 (CASSANDRA-5923)
 + * Require superuser status for adding triggers (CASSANDRA-5963)
 + * Make standalone scrubber handle old and new style leveled manifest
 +   (CASSANDRA-6005)
 + * Fix paxos bugs (CASSANDRA-6012, 6013, 6023)
 + * Fix paged ranges with multiple replicas (CASSANDRA-6004)
 + * Fix potential AssertionError during tracing (CASSANDRA-6041)
 + * Fix NPE in sstablesplit (CASSANDRA-6027)
 + * Migrate pre-2.0 key/value/column aliases to system.schema_columns
 +   (CASSANDRA-6009)
 + * Paging filter empty rows too agressively (CASSANDRA-6040)
 + * Support variadic parameters for IN clauses (CASSANDRA-4210)
 + * cqlsh: return the result of CAS writes (CASSANDRA-5796)
 + * Fix validation of IN clauses with 2ndary indexes (CASSANDRA-6050)
 + * Support named bind variables in CQL (CASSANDRA-6033)
 +Merged from 1.2:
 + * Allow cache-keys-to-save to be set at runtime (CASSANDRA-5980)
   * Avoid second-guessing out-of-space state (CASSANDRA-5605)
   * Tuning knobs for dealing with large blobs and many CFs (CASSANDRA-5982)
   * (Hadoop) Fix CQLRW for thrift tables (CASSANDRA-6002)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
index d28afc0,a8c1dde..f3e993d
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
@@@ -21,13 -21,13 +21,15 @@@ import java.nio.ByteBuffer
  import java.util.*;
  
  import org.apache.cassandra.db.*;
 -import org.apache.cassandra.db.filter.IDiskAtomFilter;
 -import org.apache.cassandra.dht.AbstractBounds;
 +import org.apache.cassandra.db.filter.ExtendedFilter;
  import org.apache.cassandra.thrift.IndexExpression;
 +import org.apache.cassandra.thrift.IndexOperator;
++import org.apache.cassandra.tracing.Tracing;
++import org.apache.cassandra.utils.FBUtilities;
  
  public abstract class SecondaryIndexSearcher
  {
--    protected final SecondaryIndexManager    indexManager;
++    protected final SecondaryIndexManager indexManager;
      protected final Set<ByteBuffer> columns;
      protected final ColumnFamilyStore baseCfs;
  
@@@ -43,31 -43,15 +45,41 @@@
      /**
       * @return true this index is able to handle given clauses.
       */
 -    public abstract boolean isIndexing(List<IndexExpression> clause);
 -    
 -    protected boolean isIndexValueStale(ColumnFamily liveData, ByteBuffer indexedColumnName, ByteBuffer indexedValue)
 +    public boolean isIndexing(List<IndexExpression> clause)
      {
 -        IColumn liveColumn = liveData.getColumn(indexedColumnName);
 -        if (liveColumn == null || liveColumn.isMarkedForDelete())
 -            return true;
 -        
 -        ByteBuffer liveValue = liveColumn.value();
 -        return 0 != liveData.metadata().getValueValidator(indexedColumnName).compare(indexedValue, liveValue);
 +        return highestSelectivityPredicate(clause) != null;
 +    }
 +
 +    protected IndexExpression highestSelectivityPredicate(List<IndexExpression> clause)
 +    {
 +        IndexExpression best = null;
 +        int bestMeanCount = Integer.MAX_VALUE;
++        Map<SecondaryIndex, Integer> candidates = new HashMap<>();
++
 +        for (IndexExpression expression : clause)
 +        {
-             //skip columns belonging to a different index type
-             if(!columns.contains(expression.column_name))
++            // skip columns belonging to a different index type
++            if (!columns.contains(expression.column_name))
 +                continue;
 +
 +            SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
 +            if (index == null || (expression.op != IndexOperator.EQ))
 +                continue;
 +            int columns = index.getIndexCfs().getMeanColumns();
++            candidates.put(index, columns);
 +            if (columns < bestMeanCount)
 +            {
 +                best = expression;
 +                bestMeanCount = columns;
 +            }
 +        }
++
++        if (best == null)
++            Tracing.trace("No applicable indexes found");
++        else
++            Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
++                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
++
 +        return best;
      }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index 0242fd2,82e227f..aa35605
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@@ -24,9 -24,11 +24,12 @@@ import java.util.*
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
 +import org.apache.cassandra.cql3.ColumnNameBuilder;
  import org.apache.cassandra.db.*;
--import org.apache.cassandra.db.filter.*;
 -import org.apache.cassandra.db.index.AbstractSimplePerColumnSecondaryIndex;
 -import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
 -import org.apache.cassandra.db.index.SecondaryIndex;
++import org.apache.cassandra.db.filter.ExtendedFilter;
++import org.apache.cassandra.db.filter.IDiskAtomFilter;
++import org.apache.cassandra.db.filter.QueryFilter;
++import org.apache.cassandra.db.filter.SliceQueryFilter;
  import org.apache.cassandra.db.index.SecondaryIndexManager;
  import org.apache.cassandra.db.index.SecondaryIndexSearcher;
  import org.apache.cassandra.db.marshal.CompositeType;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/21ab8f81/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index 205efb7,7d23e6c..e14f865
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@@ -19,18 -19,15 +19,19 @@@ package org.apache.cassandra.db.index.k
  
  import java.io.IOException;
  import java.nio.ByteBuffer;
--import java.util.*;
++import java.util.Collection;
++import java.util.Iterator;
++import java.util.List;
++import java.util.Set;
 +
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  
  import org.apache.cassandra.db.*;
--import org.apache.cassandra.db.filter.*;
--import org.apache.cassandra.db.index.AbstractSimplePerColumnSecondaryIndex;
--import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
--import org.apache.cassandra.db.index.SecondaryIndex;
--import org.apache.cassandra.db.index.SecondaryIndexManager;
--import org.apache.cassandra.db.index.SecondaryIndexSearcher;
++import org.apache.cassandra.db.filter.ExtendedFilter;
++import org.apache.cassandra.db.filter.IDiskAtomFilter;
++import org.apache.cassandra.db.filter.QueryFilter;
++import org.apache.cassandra.db.index.*;
  import org.apache.cassandra.dht.AbstractBounds;
  import org.apache.cassandra.dht.Range;
  import org.apache.cassandra.thrift.IndexExpression;


[6/6] 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/c8434acf
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c8434acf
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c8434acf

Branch: refs/heads/trunk
Commit: c8434acf75880a5bc273dd8e288a0de01fb90e27
Parents: cfac7fb 21ab8f8
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Oct 8 11:17:13 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Oct 8 11:17:13 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  1 +
 .../db/index/SecondaryIndexSearcher.java          | 18 +++++++++++++++---
 .../db/index/composites/CompositesSearcher.java   |  5 ++++-
 .../cassandra/db/index/keys/KeysSearcher.java     | 15 ++++++++-------
 4 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c8434acf/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c8434acf/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
index 1f72f62,f3e993d..f18357b
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java
@@@ -22,6 -22,10 +22,8 @@@ import java.util.*
  
  import org.apache.cassandra.db.*;
  import org.apache.cassandra.db.filter.ExtendedFilter;
 -import org.apache.cassandra.thrift.IndexExpression;
 -import org.apache.cassandra.thrift.IndexOperator;
+ import org.apache.cassandra.tracing.Tracing;
+ import org.apache.cassandra.utils.FBUtilities;
  
  public abstract class SecondaryIndexSearcher
  {
@@@ -56,22 -54,32 +58,32 @@@
      {
          IndexExpression best = null;
          int bestMeanCount = Integer.MAX_VALUE;
+         Map<SecondaryIndex, Integer> candidates = new HashMap<>();
+ 
          for (IndexExpression expression : clause)
          {
-             //skip columns belonging to a different index type
-             if(!columns.contains(expression.column))
+             // skip columns belonging to a different index type
 -            if (!columns.contains(expression.column_name))
++            if (!columns.contains(expression.column))
                  continue;
  
 -            SecondaryIndex index = indexManager.getIndexForColumn(expression.column_name);
 -            if (index == null || (expression.op != IndexOperator.EQ))
 +            SecondaryIndex index = indexManager.getIndexForColumn(expression.column);
 +            if (index == null || expression.operator != IndexExpression.Operator.EQ)
                  continue;
              int columns = index.getIndexCfs().getMeanColumns();
+             candidates.put(index, columns);
              if (columns < bestMeanCount)
              {
                  best = expression;
                  bestMeanCount = columns;
              }
          }
+ 
+         if (best == null)
+             Tracing.trace("No applicable indexes found");
+         else
+             Tracing.trace("Candidate index mean cardinalities are {}. Scanning with {}.",
 -                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column_name).getIndexName());
++                          FBUtilities.toString(candidates), indexManager.getIndexForColumn(best.column).getIndexName());
+ 
          return best;
      }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c8434acf/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c8434acf/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index eefef0c,e14f865..3740e24
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@@ -25,14 -28,13 +28,12 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import org.apache.cassandra.db.*;
- import org.apache.cassandra.db.filter.*;
- import org.apache.cassandra.db.index.AbstractSimplePerColumnSecondaryIndex;
- import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
- import org.apache.cassandra.db.index.SecondaryIndex;
- import org.apache.cassandra.db.index.SecondaryIndexManager;
- import org.apache.cassandra.db.index.SecondaryIndexSearcher;
+ import org.apache.cassandra.db.filter.ExtendedFilter;
+ import org.apache.cassandra.db.filter.IDiskAtomFilter;
+ import org.apache.cassandra.db.filter.QueryFilter;
+ import org.apache.cassandra.db.index.*;
  import org.apache.cassandra.dht.AbstractBounds;
  import org.apache.cassandra.dht.Range;
 -import org.apache.cassandra.thrift.IndexExpression;
  import org.apache.cassandra.utils.ByteBufferUtil;
  import org.apache.cassandra.utils.HeapAllocator;