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 2013/12/18 11:24:02 UTC

[1/5] git commit: Allow executing CREATE statement multiple times

Updated Branches:
  refs/heads/trunk 6635cde3a -> 1a5ebd6a7


Allow executing CREATE statement multiple times

patch by slebresne; reviewed by jbellis for CASSANDRA-6471


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

Branch: refs/heads/trunk
Commit: 079f1e81166579c5da0bdde76be7c9201d2e1711
Parents: 1b4c9b4
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 11:13:54 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 11:13:54 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                        | 3 +++
 src/java/org/apache/cassandra/cql3/CFPropDefs.java | 5 +++++
 src/java/org/apache/cassandra/cql3/KSPropDefs.java | 5 +++++
 3 files changed, 13 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/079f1e81/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 22a121e..5086440 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,6 @@
+1.2.14
+ * Allow executing CREATE statements multiple times (CASSANDRA-6471)
+
 1.2.13
  * Improved error message on bad properties in DDL queries (CASSANDRA-6453)
  * Randomize batchlog candidates selection (CASSANDRA-6481)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/079f1e81/src/java/org/apache/cassandra/cql3/CFPropDefs.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
index 8ad29fd..d60b60c 100644
--- a/src/java/org/apache/cassandra/cql3/CFPropDefs.java
+++ b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
@@ -76,6 +76,11 @@ public class CFPropDefs extends PropertyDefinitions
 
     public void validate() throws ConfigurationException, SyntaxException
     {
+        // Skip validation if the comapction strategy class is already set as it means we've alreayd
+        // prepared (and redoing it would set strategyClass back to null, which we don't want)
+        if (compactionStrategyClass != null)
+            return;
+
         validate(keywords, obsoleteKeywords);
 
         Map<String, String> compactionOptions = getCompactionOptions();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/079f1e81/src/java/org/apache/cassandra/cql3/KSPropDefs.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/KSPropDefs.java b/src/java/org/apache/cassandra/cql3/KSPropDefs.java
index 70df622..e2b0de8 100644
--- a/src/java/org/apache/cassandra/cql3/KSPropDefs.java
+++ b/src/java/org/apache/cassandra/cql3/KSPropDefs.java
@@ -44,6 +44,11 @@ public class KSPropDefs extends PropertyDefinitions
 
     public void validate() throws ConfigurationException, SyntaxException
     {
+        // Skip validation if the strategy class is already set as it means we've alreayd
+        // prepared (and redoing it would set strategyClass back to null, which we don't want)
+        if (strategyClass != null)
+            return;
+
         validate(keywords, obsoleteKeywords);
 
         Map<String, String> replicationOptions = getReplicationOptions();


[5/5] git commit: Fix merge

Posted by sl...@apache.org.
Fix merge


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

Branch: refs/heads/trunk
Commit: 1a5ebd6a7d65af8393c9d5c67e7de8088bbb1d0f
Parents: 1273476
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 11:23:44 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 11:23:44 2013 +0100

----------------------------------------------------------------------
 src/java/org/apache/cassandra/service/pager/SliceQueryPager.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a5ebd6a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
index 9d8d62c..fbc36e0 100644
--- a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.service.pager;
 
+import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.List;
 


[4/5] git commit: Merge branch 'cassandra-2.0' into trunk

Posted by sl...@apache.org.
Merge branch 'cassandra-2.0' into trunk


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

Branch: refs/heads/trunk
Commit: 1273476f95447a0661ddc7789067cc9a0e085f5b
Parents: 6635cde 7c32ffb
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 11:19:39 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 11:19:39 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../org/apache/cassandra/cql3/CFPropDefs.java   |  5 ++
 .../org/apache/cassandra/cql3/KSPropDefs.java   |  5 ++
 .../service/pager/AbstractQueryPager.java       |  6 +-
 .../service/pager/MultiPartitionPager.java      | 89 +++++++++++++-------
 .../service/pager/NamesQueryPager.java          |  5 +-
 .../cassandra/service/pager/QueryPagers.java    |  5 +-
 .../service/pager/SinglePartitionPager.java     |  3 +
 .../service/pager/SliceQueryPager.java          |  5 ++
 9 files changed, 87 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


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

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1273476f/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1273476f/src/java/org/apache/cassandra/service/pager/QueryPagers.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1273476f/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
----------------------------------------------------------------------


[2/5] git commit: Merge branch 'cassandra-1.2' into cassandra-2.0

Posted by sl...@apache.org.
Merge branch 'cassandra-1.2' into cassandra-2.0

Conflicts:
	CHANGES.txt


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

Branch: refs/heads/trunk
Commit: f7255b5ffa2edb30e909220ccc3f7308b9f65475
Parents: 53af91e 079f1e8
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 11:15:30 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 11:15:30 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                        | 1 +
 src/java/org/apache/cassandra/cql3/CFPropDefs.java | 5 +++++
 src/java/org/apache/cassandra/cql3/KSPropDefs.java | 5 +++++
 3 files changed, 11 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f7255b5f/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index b8757d7,5086440..80ed481
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -29,45 -22,9 +29,46 @@@ Merged from 1.2
     (CASSANDRA-6413)
   * (Hadoop) add describe_local_ring (CASSANDRA-6268)
   * Fix handling of concurrent directory creation failure (CASSANDRA-6459)
++ * Allow executing CREATE statements multiple times (CASSANDRA-6471)
  
  
 -1.2.12
 +2.0.3
 + * Fix FD leak on slice read path (CASSANDRA-6275)
 + * Cancel read meter task when closing SSTR (CASSANDRA-6358)
 + * free off-heap IndexSummary during bulk (CASSANDRA-6359)
 + * Recover from IOException in accept() thread (CASSANDRA-6349)
 + * Improve Gossip tolerance of abnormally slow tasks (CASSANDRA-6338)
 + * Fix trying to hint timed out counter writes (CASSANDRA-6322)
 + * Allow restoring specific columnfamilies from archived CL (CASSANDRA-4809)
 + * Avoid flushing compaction_history after each operation (CASSANDRA-6287)
 + * Fix repair assertion error when tombstones expire (CASSANDRA-6277)
 + * Skip loading corrupt key cache (CASSANDRA-6260)
 + * Fixes for compacting larger-than-memory rows (CASSANDRA-6274)
 + * Compact hottest sstables first and optionally omit coldest from
 +   compaction entirely (CASSANDRA-6109)
 + * Fix modifying column_metadata from thrift (CASSANDRA-6182)
 + * cqlsh: fix LIST USERS output (CASSANDRA-6242)
 + * Add IRequestSink interface (CASSANDRA-6248)
 + * Update memtable size while flushing (CASSANDRA-6249)
 + * Provide hooks around CQL2/CQL3 statement execution (CASSANDRA-6252)
 + * Require Permission.SELECT for CAS updates (CASSANDRA-6247)
 + * New CQL-aware SSTableWriter (CASSANDRA-5894)
 + * Reject CAS operation when the protocol v1 is used (CASSANDRA-6270)
 + * Correctly throw error when frame too large (CASSANDRA-5981)
 + * Fix serialization bug in PagedRange with 2ndary indexes (CASSANDRA-6299)
 + * Fix CQL3 table validation in Thrift (CASSANDRA-6140)
 + * Fix bug missing results with IN clauses (CASSANDRA-6327)
 + * Fix paging with reversed slices (CASSANDRA-6343)
 + * Set minTimestamp correctly to be able to drop expired sstables (CASSANDRA-6337)
 + * Support NaN and Infinity as float literals (CASSANDRA-6003)
 + * Remove RF from nodetool ring output (CASSANDRA-6289)
 + * Fix attempting to flush empty rows (CASSANDRA-6374)
 + * Fix potential out of bounds exception when paging (CASSANDRA-6333)
 +Merged from 1.2:
 + * Optimize FD phi calculation (CASSANDRA-6386)
 + * Improve initial FD phi estimate when starting up (CASSANDRA-6385)
 + * Don't list CQL3 table in CLI describe even if named explicitely 
 +   (CASSANDRA-5750)
   * Invalidate row cache when dropping CF (CASSANDRA-6351)
   * add non-jamm path for cached statements (CASSANDRA-6293)
   * (Hadoop) Require CFRR batchSize to be at least 2 (CASSANDRA-6114)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f7255b5f/src/java/org/apache/cassandra/cql3/CFPropDefs.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f7255b5f/src/java/org/apache/cassandra/cql3/KSPropDefs.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/cql3/KSPropDefs.java
index c10a79b,e2b0de8..12fbc51
--- a/src/java/org/apache/cassandra/cql3/KSPropDefs.java
+++ b/src/java/org/apache/cassandra/cql3/KSPropDefs.java
@@@ -40,8 -42,13 +40,13 @@@ public class KSPropDefs extends Propert
  
      private String strategyClass;
  
 -    public void validate() throws ConfigurationException, SyntaxException
 +    public void validate() throws SyntaxException
      {
+         // Skip validation if the strategy class is already set as it means we've alreayd
+         // prepared (and redoing it would set strategyClass back to null, which we don't want)
+         if (strategyClass != null)
+             return;
+ 
          validate(keywords, obsoleteKeywords);
  
          Map<String, String> replicationOptions = getReplicationOptions();


[3/5] git commit: Fix infinite loop when paging queries with IN

Posted by sl...@apache.org.
Fix infinite loop when paging queries with IN

patch by slebresne; reviewed by iamaleksey for CASSANDRA-6464


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

Branch: refs/heads/trunk
Commit: 7c32ffbbfae9959edc89ec5fcf9fced1b75c495b
Parents: f7255b5
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 11:18:30 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 11:18:30 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../service/pager/AbstractQueryPager.java       |  6 +-
 .../service/pager/MultiPartitionPager.java      | 89 +++++++++++++-------
 .../service/pager/NamesQueryPager.java          |  5 +-
 .../cassandra/service/pager/QueryPagers.java    |  5 +-
 .../service/pager/SinglePartitionPager.java     |  3 +
 .../service/pager/SliceQueryPager.java          |  5 ++
 7 files changed, 76 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 80ed481..5a124ab 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -12,6 +12,7 @@
  * Expose a total memtable size metric for a CF (CASSANDRA-6391)
  * cqlsh: handle symlinks properly (CASSANDRA-6425)
  * Don't resubmit counter mutation runnables internally (CASSANDRA-6427)
+ * Fix potential infinite loop when paging query with IN (CASSANDRA-6464)
 Merged from 1.2:
  * Improved error message on bad properties in DDL queries (CASSANDRA-6453)
  * Randomize batchlog candidates selection (CASSANDRA-6481)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java b/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
index 9372665..6f6772c 100644
--- a/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
@@ -40,9 +40,9 @@ abstract class AbstractQueryPager implements QueryPager
     protected final IDiskAtomFilter columnFilter;
     private final long timestamp;
 
-    private volatile int remaining;
-    private volatile boolean exhausted;
-    private volatile boolean lastWasRecorded;
+    private int remaining;
+    private boolean exhausted;
+    private boolean lastWasRecorded;
 
     protected AbstractQueryPager(ConsistencyLevel consistencyLevel,
                                  int toFetch,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/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 2615e9b..35d6752 100644
--- a/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
+++ b/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
@@ -43,44 +43,72 @@ class MultiPartitionPager implements QueryPager
     private final SinglePartitionPager[] pagers;
     private final long timestamp;
 
-    private volatile int current;
-
-    MultiPartitionPager(List<ReadCommand> commands, ConsistencyLevel consistencyLevel, boolean localQuery)
-    {
-        this(commands, consistencyLevel, localQuery, null);
-    }
+    private int remaining;
+    private int current;
 
     MultiPartitionPager(List<ReadCommand> commands, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state)
     {
-        this.pagers = new SinglePartitionPager[commands.size()];
+        int i = 0;
+        // If it's not the beginning (state != null), we need to find where we were and skip previous commands
+        // since they are done.
+        if (state != null)
+            for (; i < commands.size(); i++)
+                if (commands.get(i).key.equals(state.partitionKey))
+                    break;
+
+        if (i >= commands.size())
+        {
+            pagers = null;
+            timestamp = -1;
+            return;
+        }
+
+        pagers = new SinglePartitionPager[commands.size() - i];
+        // 'i' is on the first non exhausted pager for the previous page (or the first one)
+        pagers[0] = makePager(commands.get(i), consistencyLevel, localQuery, state);
+        timestamp = commands.get(i).timestamp;
 
-        long tstamp = -1;
-        for (int i = 0; i < commands.size(); i++)
+        // Following ones haven't been started yet
+        for (int j = i + 1; j < commands.size(); j++)
         {
-            ReadCommand command = commands.get(i);
-            if (tstamp == -1)
-                tstamp = command.timestamp;
-            else if (tstamp != command.timestamp)
+            ReadCommand command = commands.get(j);
+            if (command.timestamp != timestamp)
                 throw new IllegalArgumentException("All commands must have the same timestamp or weird results may happen.");
-
-            PagingState tmpState = state != null && command.key.equals(state.partitionKey) ? state : null;
-            pagers[i] = command instanceof SliceFromReadCommand
-                      ? new SliceQueryPager((SliceFromReadCommand)command, consistencyLevel, localQuery, tmpState)
-                      : new NamesQueryPager((SliceByNamesReadCommand)command, consistencyLevel, localQuery, tmpState);
+            pagers[j - i] = makePager(command, consistencyLevel, localQuery, null);
         }
-        timestamp = tstamp;
+        remaining = state == null ? computeRemaining(pagers) : state.remaining;
+    }
+
+    private static SinglePartitionPager makePager(ReadCommand command, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state)
+    {
+        return command instanceof SliceFromReadCommand
+             ? new SliceQueryPager((SliceFromReadCommand)command, consistencyLevel, localQuery, state)
+             : 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
+        if (isExhausted())
+            return null;
+
         PagingState state = pagers[current].state();
-        return state == null
-             ? null
-             : new PagingState(state.partitionKey, state.cellName, maxRemaining());
+        return new PagingState(pagers[current].key(), state == null ? null : state.cellName, remaining);
     }
 
     public boolean isExhausted()
     {
+        if (remaining <= 0 || pagers == null)
+            return true;
+
         while (current < pagers.length)
         {
             if (!pagers[current].isExhausted())
@@ -93,18 +121,20 @@ class MultiPartitionPager implements QueryPager
 
     public List<Row> fetchPage(int pageSize) throws RequestValidationException, RequestExecutionException
     {
-        int remaining = pageSize;
         List<Row> result = new ArrayList<Row>();
 
-        while (!isExhausted() && remaining > 0)
+        int remainingThisQuery = pageSize;
+        while (remainingThisQuery > 0 && !isExhausted())
         {
-            // Exhausted also sets us on the first non-exhausted pager
-            List<Row> page = pagers[current].fetchPage(remaining);
+            // isExhausted has set us on the first non-exhausted pager
+            List<Row> page = pagers[current].fetchPage(remainingThisQuery);
             if (page.isEmpty())
                 continue;
 
             Row row = page.get(0);
-            remaining -= pagers[current].columnCounter().countAll(row.cf).live();
+            int fetched = pagers[current].columnCounter().countAll(row.cf).live();
+            remaining -= fetched;
+            remainingThisQuery -= fetched;
             result.add(row);
         }
 
@@ -113,10 +143,7 @@ class MultiPartitionPager implements QueryPager
 
     public int maxRemaining()
     {
-        int max = 0;
-        for (int i = current; i < pagers.length; i++)
-            max += pagers[i].maxRemaining();
-        return max;
+        return remaining;
     }
 
     public long timestamp()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/src/java/org/apache/cassandra/service/pager/NamesQueryPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/NamesQueryPager.java b/src/java/org/apache/cassandra/service/pager/NamesQueryPager.java
index ede1e91..663db22 100644
--- a/src/java/org/apache/cassandra/service/pager/NamesQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/NamesQueryPager.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.service.pager;
 
+import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.List;
 
@@ -55,9 +56,9 @@ public class NamesQueryPager implements SinglePartitionPager
         this.localQuery = localQuery;
     }
 
-    NamesQueryPager(SliceByNamesReadCommand command, ConsistencyLevel consistencyLevel, boolean localQuery, PagingState state)
+    public ByteBuffer key()
     {
-        this(command, consistencyLevel, localQuery);
+        return command.key;
     }
 
     public ColumnCounter columnCounter()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/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 1601ff6..c353536 100644
--- a/src/java/org/apache/cassandra/service/pager/QueryPagers.java
+++ b/src/java/org/apache/cassandra/service/pager/QueryPagers.java
@@ -57,7 +57,8 @@ public class QueryPagers
         {
             List<ReadCommand> commands = ((Pageable.ReadCommands)command).commands;
 
-            int maxQueried = 0;
+            // Using long on purpose, as we could overflow otherwise
+            long maxQueried = 0;
             for (ReadCommand readCmd : commands)
                 maxQueried += maxQueried(readCmd);
 
@@ -78,7 +79,7 @@ public class QueryPagers
     private static QueryPager pager(ReadCommand command, ConsistencyLevel consistencyLevel, boolean local, PagingState state)
     {
         if (command instanceof SliceByNamesReadCommand)
-            return new NamesQueryPager((SliceByNamesReadCommand)command, consistencyLevel, local, state);
+            return new NamesQueryPager((SliceByNamesReadCommand)command, consistencyLevel, local);
         else
             return new SliceQueryPager((SliceFromReadCommand)command, consistencyLevel, local, state);
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/src/java/org/apache/cassandra/service/pager/SinglePartitionPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/SinglePartitionPager.java b/src/java/org/apache/cassandra/service/pager/SinglePartitionPager.java
index 693a20e..51bbf90 100644
--- a/src/java/org/apache/cassandra/service/pager/SinglePartitionPager.java
+++ b/src/java/org/apache/cassandra/service/pager/SinglePartitionPager.java
@@ -17,6 +17,8 @@
  */
 package org.apache.cassandra.service.pager;
 
+import java.nio.ByteBuffer;
+
 import org.apache.cassandra.db.filter.ColumnCounter;
 
 /**
@@ -26,5 +28,6 @@ import org.apache.cassandra.db.filter.ColumnCounter;
  */
 public interface SinglePartitionPager extends QueryPager
 {
+    public ByteBuffer key();
     public ColumnCounter columnCounter();
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7c32ffbb/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
index e3825a9..cd0c069 100644
--- a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
@@ -54,6 +54,11 @@ public class SliceQueryPager extends AbstractQueryPager implements SinglePartiti
         }
     }
 
+    public ByteBuffer key()
+    {
+        return command.key;
+    }
+
     public PagingState state()
     {
         return lastReturned == null