You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2014/12/19 17:57:25 UTC

cassandra git commit: Fix paging with multi-partition IN queries

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 d8bce5017 -> 621899355


Fix paging with multi-partition IN queries

patch by thobbs; reviewed by slebresne for CASSANDRA-8408


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

Branch: refs/heads/cassandra-2.0
Commit: 621899355a23eca6c503aa2ced2e944ff6a5fe66
Parents: d8bce50
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Fri Dec 19 17:53:46 2014 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Fri Dec 19 17:53:46 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                          |  1 +
 .../cassandra/cql3/statements/SelectStatement.java   |  2 +-
 .../cassandra/service/pager/MultiPartitionPager.java | 15 ++++-----------
 .../org/apache/cassandra/service/pager/Pageable.java |  5 ++++-
 .../apache/cassandra/service/pager/QueryPagers.java  |  7 +------
 .../org/apache/cassandra/service/QueryPagerTest.java |  2 +-
 6 files changed, 12 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bad24e7..516b4a2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0.12:
+ * Fix paging for multi-partition IN queries (CASSANDRA-8408)
  * Fix MOVED_NODE topology event never being emitted when a node
    moves its token (CASSANDRA-8373)
  * Fix validation of indexes in COMPACT tables (CASSANDRA-8156)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index db25716..f08f6b8 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@ -212,7 +212,7 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache
         else
         {
             List<ReadCommand> commands = getSliceCommands(variables, limitForQuery, now);
-            command = commands == null ? null : new Pageable.ReadCommands(commands);
+            command = commands == null ? null : new Pageable.ReadCommands(commands, limitForQuery);
         }
 
         int pageSize = options.getPageSize();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java b/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
index 35d6752..e478d3a 100644
--- a/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
+++ b/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
@@ -46,7 +46,7 @@ class MultiPartitionPager implements QueryPager
     private int remaining;
     private int current;
 
-    MultiPartitionPager(List<ReadCommand> commands, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state)
+    MultiPartitionPager(List<ReadCommand> commands, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state, int limitForQuery)
     {
         int i = 0;
         // If it's not the beginning (state != null), we need to find where we were and skip previous commands
@@ -76,7 +76,8 @@ class MultiPartitionPager implements QueryPager
                 throw new IllegalArgumentException("All commands must have the same timestamp or weird results may happen.");
             pagers[j - i] = makePager(command, consistencyLevel, localQuery, null);
         }
-        remaining = state == null ? computeRemaining(pagers) : state.remaining;
+
+        remaining = state == null ? limitForQuery : state.remaining;
     }
 
     private static SinglePartitionPager makePager(ReadCommand command, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state)
@@ -86,14 +87,6 @@ class MultiPartitionPager implements QueryPager
              : new NamesQueryPager((SliceByNamesReadCommand)command, consistencyLevel, localQuery);
     }
 
-    private static int computeRemaining(SinglePartitionPager[] pagers)
-    {
-        long remaining = 0;
-        for (SinglePartitionPager pager : pagers)
-            remaining += pager.maxRemaining();
-        return remaining > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)remaining;
-    }
-
     public PagingState state()
     {
         // Sets current to the first non-exhausted pager
@@ -123,7 +116,7 @@ class MultiPartitionPager implements QueryPager
     {
         List<Row> result = new ArrayList<Row>();
 
-        int remainingThisQuery = pageSize;
+        int remainingThisQuery = Math.min(remaining, pageSize);
         while (remainingThisQuery > 0 && !isExhausted())
         {
             // isExhausted has set us on the first non-exhausted pager

http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/src/java/org/apache/cassandra/service/pager/Pageable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/Pageable.java b/src/java/org/apache/cassandra/service/pager/Pageable.java
index 3a69bf4..d4986f7 100644
--- a/src/java/org/apache/cassandra/service/pager/Pageable.java
+++ b/src/java/org/apache/cassandra/service/pager/Pageable.java
@@ -30,9 +30,12 @@ public interface Pageable
     {
         public final List<ReadCommand> commands;
 
-        public ReadCommands(List<ReadCommand> commands)
+        public final int limitForQuery;
+
+        public ReadCommands(List<ReadCommand> commands, int limitForQuery)
         {
             this.commands = commands;
+            this.limitForQuery = limitForQuery;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/src/java/org/apache/cassandra/service/pager/QueryPagers.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/QueryPagers.java b/src/java/org/apache/cassandra/service/pager/QueryPagers.java
index 65112aa..72d76fe 100644
--- a/src/java/org/apache/cassandra/service/pager/QueryPagers.java
+++ b/src/java/org/apache/cassandra/service/pager/QueryPagers.java
@@ -98,7 +98,7 @@ public class QueryPagers
             if (commands.size() == 1)
                 return pager(commands.get(0), consistencyLevel, local, state);
 
-            return new MultiPartitionPager(commands, consistencyLevel, local, state);
+            return new MultiPartitionPager(commands, consistencyLevel, local, state, ((Pageable.ReadCommands) command).limitForQuery);
         }
         else if (command instanceof ReadCommand)
         {
@@ -115,11 +115,6 @@ public class QueryPagers
         }
     }
 
-    public static QueryPager pager(Pageable command, ConsistencyLevel consistencyLevel)
-    {
-        return pager(command, consistencyLevel, false, null);
-    }
-
     public static QueryPager pager(Pageable command, ConsistencyLevel consistencyLevel, PagingState state)
     {
         return pager(command, consistencyLevel, false, state);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/62189935/test/unit/org/apache/cassandra/service/QueryPagerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/service/QueryPagerTest.java b/test/unit/org/apache/cassandra/service/QueryPagerTest.java
index 0645433..7dbd7b9 100644
--- a/test/unit/org/apache/cassandra/service/QueryPagerTest.java
+++ b/test/unit/org/apache/cassandra/service/QueryPagerTest.java
@@ -236,7 +236,7 @@ public class QueryPagerTest extends SchemaLoader
         QueryPager pager = QueryPagers.localPager(new Pageable.ReadCommands(new ArrayList<ReadCommand>() {{
             add(sliceQuery("k1", "c2", "c6", 10));
             add(sliceQuery("k4", "c3", "c5", 10));
-        }}));
+        }}, 10));
 
         List<Row> page;