Repository: cassandra
Updated Branches:
refs/heads/trunk fcdc4e1d7 -> e017d89a6
Fix paging issues with partitions containing only static columns data
patch by Benjamin Lerer; reviewed by Sylvain Lebresne for CASSANDRA-10381
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/328916d1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/328916d1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/328916d1
Branch: refs/heads/trunk
Commit: 328916d1591be69f217f6519304651d3757d9e1d
Parents: 9b3b1cb
Author: blerer <benjamin.lerer@datastax.com>
Authored: Tue Oct 20 14:33:50 2015 +0200
Committer: blerer <benjamin.lerer@datastax.com>
Committed: Tue Oct 20 14:33:50 2015 +0200
----------------------------------------------------------------------
CHANGES.txt | 2 ++
.../apache/cassandra/service/pager/AbstractQueryPager.java | 6 +++++-
.../cassandra/service/pager/RangeSliceQueryPager.java | 8 ++++++--
.../org/apache/cassandra/service/pager/SliceQueryPager.java | 9 +++++++--
4 files changed, 20 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/328916d1/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index b17929c..dbb3480 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,6 @@
2.1.12
+ * Fix paging issues with partitions containing only static columns data
+ (CASSANDRA-10381)
* Fix conditions on static columns (CASSANDRA-10264)
* AssertionError: attempted to delete non-existing file CommitLog (CASSANDRA-10377)
* Merge range tombstones during compaction (CASSANDRA-7953)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/328916d1/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 a3991ed..6056b9a 100644
--- a/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java
@@ -345,7 +345,11 @@ abstract class AbstractQueryPager implements QueryPager
copy.addColumn(iter.next());
}
}
- return Math.min(counter.live(), toDiscard);
+ int live = counter.live();
+ // We want to take into account the row even if it was containing only static columns
+ if (live == 0 && !staticCells.isEmpty())
+ live = 1;
+ return Math.min(live, toDiscard);
}
private int discardTail(ColumnFamily cf, int toDiscard, ColumnFamily copy, Iterator<Cell>
iter, DeletionInfo.InOrderTester tester)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/328916d1/src/java/org/apache/cassandra/service/pager/RangeSliceQueryPager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/pager/RangeSliceQueryPager.java b/src/java/org/apache/cassandra/service/pager/RangeSliceQueryPager.java
index e02bb46..fd14c82 100644
--- a/src/java/org/apache/cassandra/service/pager/RangeSliceQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/RangeSliceQueryPager.java
@@ -98,10 +98,14 @@ public class RangeSliceQueryPager extends AbstractQueryPager
// Same as SliceQueryPager, we ignore a deleted column
Cell firstCell = isReversed() ? lastCell(first.cf) : firstNonStaticCell(first.cf);
+ // If the row was containing only static columns it has already been returned and
we can skip it.
+ if (firstCell == null)
+ return true;
+
CFMetaData metadata = Schema.instance.getCFMetaData(command.keyspace, command.columnFamily);
return !first.cf.deletionInfo().isDeleted(firstCell)
- && firstCell.isLive(timestamp())
- && firstCell.name().isSameCQL3RowAs(metadata.comparator, lastReturnedName);
+ && firstCell.isLive(timestamp())
+ && firstCell.name().isSameCQL3RowAs(metadata.comparator, lastReturnedName);
}
protected boolean recordLast(Row last)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/328916d1/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 c8572d4..1a2fc6c 100644
--- a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java
@@ -102,12 +102,17 @@ public class SliceQueryPager extends AbstractQueryPager implements SinglePartiti
return false;
Cell firstCell = isReversed() ? lastCell(first.cf) : firstNonStaticCell(first.cf);
+ // If the row was containing only static columns it has already been returned and
we can skip it.
+ if (firstCell == null)
+ return true;
+
CFMetaData metadata = Schema.instance.getCFMetaData(command.getKeyspace(), command.getColumnFamilyName());
// Note: we only return true if the column is the lastReturned *and* it is live.
If it is deleted, it is ignored by the
// rest of the paging code (it hasn't been counted as live in particular) and we
want to act as if it wasn't there.
+
return !first.cf.deletionInfo().isDeleted(firstCell)
- && firstCell.isLive(timestamp())
- && firstCell.name().isSameCQL3RowAs(metadata.comparator, lastReturned);
+ && firstCell.isLive(timestamp())
+ && firstCell.name().isSameCQL3RowAs(metadata.comparator, lastReturned);
}
protected boolean recordLast(Row last)
|