git commit: Fix sometimes skipping range tombstones during reverse queries

2013-07-01 Thread slebresne
Updated Branches:
  refs/heads/cassandra-1.2 8c2a28050 - 1a8f7230a


Fix sometimes skipping range tombstones during reverse queries

patch by slebresne; reviewed by jbellis for CASSANDRA-5712


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

Branch: refs/heads/cassandra-1.2
Commit: 1a8f7230a1b56d8e58c33ef2922f4460e7b6f913
Parents: 8c2a280
Author: Sylvain Lebresne sylv...@datastax.com
Authored: Mon Jul 1 09:29:48 2013 +0200
Committer: Sylvain Lebresne sylv...@datastax.com
Committed: Mon Jul 1 09:32:21 2013 +0200

--
 CHANGES.txt |  3 +-
 .../db/columniterator/IndexedSliceReader.java   | 28 ++-
 .../apache/cassandra/db/RangeTombstoneTest.java | 37 
 3 files changed, 66 insertions(+), 2 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a8f7230/CHANGES.txt
--
diff --git a/CHANGES.txt b/CHANGES.txt
index 1b9634c..843bb53 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -3,8 +3,9 @@
  * Fix serialization of the LEFT gossip value (CASSANDRA-5696)
  * Pig: support for cql3 tables (CASSANDRA-5234)
  * cqlsh: Don't show 'null' in place of empty values (CASSANDRA-5675)
- * Race condition in detecting version on a mixed 1.1/1.2 cluster 
+ * Race condition in detecting version on a mixed 1.1/1.2 cluster
(CASSANDRA-5692)
+ * Fix skipping range tombstones with reverse queries (CASSANDRA-5712)
 
 
 1.2.6

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a8f7230/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
--
diff --git 
a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java 
b/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
index 4ca0ea5..21eb48b 100644
--- a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
+++ b/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
@@ -29,6 +29,7 @@ import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.DeletionInfo;
 import org.apache.cassandra.db.OnDiskAtom;
+import org.apache.cassandra.db.RangeTombstone;
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.db.filter.ColumnSlice;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -60,6 +61,9 @@ class IndexedSliceReader extends AbstractIteratorOnDiskAtom 
implements OnDiskA
 private final DequeOnDiskAtom blockColumns = new 
ArrayDequeOnDiskAtom();
 private final AbstractType? comparator;
 
+// Holds range tombstone in reverse queries. See addColumn()
+private final DequeOnDiskAtom rangeTombstonesReversed;
+
 /**
  * This slice reader assumes that slices are sorted correctly, e.g. that 
for forward lookup slices are in
  * lexicographic order of start elements and that for reverse lookup they 
are in reverse lexicographic order of
@@ -74,6 +78,7 @@ class IndexedSliceReader extends AbstractIteratorOnDiskAtom 
implements OnDiskA
 this.reversed = reversed;
 this.slices = slices;
 this.comparator = sstable.metadata.comparator;
+this.rangeTombstonesReversed = reversed ? new ArrayDequeOnDiskAtom() 
: null;
 
 try
 {
@@ -147,6 +152,14 @@ class IndexedSliceReader extends 
AbstractIteratorOnDiskAtom implements OnDiskA
 {
 while (true)
 {
+if (reversed)
+{
+// Return all tombstone for the block first (see addColumn() 
below)
+OnDiskAtom column = rangeTombstonesReversed.poll();
+if (column != null)
+return column;
+}
+
 OnDiskAtom column = blockColumns.poll();
 if (column == null)
 {
@@ -169,9 +182,22 @@ class IndexedSliceReader extends 
AbstractIteratorOnDiskAtom implements OnDiskA
 protected void addColumn(OnDiskAtom col)
 {
 if (reversed)
-blockColumns.addFirst(col);
+{
+/*
+ * We put range tomstone markers at the beginning of the range 
they delete. But for reversed queries,
+ * the caller still need to know about a RangeTombstone before it 
sees any column that it covers.
+ * To make that simple, we keep said tombstones separate and 
return them all before any column for
+ * a given block.
+ */
+if (col instanceof RangeTombstone)
+rangeTombstonesReversed.addFirst(col);
+else
+ 

[1/2] git commit: Fix sometimes skipping range tombstones during reverse queries

2013-07-01 Thread slebresne
Updated Branches:
  refs/heads/trunk 09ea74620 - 4b8897327


Fix sometimes skipping range tombstones during reverse queries

patch by slebresne; reviewed by jbellis for CASSANDRA-5712


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

Branch: refs/heads/trunk
Commit: 1a8f7230a1b56d8e58c33ef2922f4460e7b6f913
Parents: 8c2a280
Author: Sylvain Lebresne sylv...@datastax.com
Authored: Mon Jul 1 09:29:48 2013 +0200
Committer: Sylvain Lebresne sylv...@datastax.com
Committed: Mon Jul 1 09:32:21 2013 +0200

--
 CHANGES.txt |  3 +-
 .../db/columniterator/IndexedSliceReader.java   | 28 ++-
 .../apache/cassandra/db/RangeTombstoneTest.java | 37 
 3 files changed, 66 insertions(+), 2 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a8f7230/CHANGES.txt
--
diff --git a/CHANGES.txt b/CHANGES.txt
index 1b9634c..843bb53 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -3,8 +3,9 @@
  * Fix serialization of the LEFT gossip value (CASSANDRA-5696)
  * Pig: support for cql3 tables (CASSANDRA-5234)
  * cqlsh: Don't show 'null' in place of empty values (CASSANDRA-5675)
- * Race condition in detecting version on a mixed 1.1/1.2 cluster 
+ * Race condition in detecting version on a mixed 1.1/1.2 cluster
(CASSANDRA-5692)
+ * Fix skipping range tombstones with reverse queries (CASSANDRA-5712)
 
 
 1.2.6

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a8f7230/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
--
diff --git 
a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java 
b/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
index 4ca0ea5..21eb48b 100644
--- a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
+++ b/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java
@@ -29,6 +29,7 @@ import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.DeletionInfo;
 import org.apache.cassandra.db.OnDiskAtom;
+import org.apache.cassandra.db.RangeTombstone;
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.db.filter.ColumnSlice;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -60,6 +61,9 @@ class IndexedSliceReader extends AbstractIteratorOnDiskAtom 
implements OnDiskA
 private final DequeOnDiskAtom blockColumns = new 
ArrayDequeOnDiskAtom();
 private final AbstractType? comparator;
 
+// Holds range tombstone in reverse queries. See addColumn()
+private final DequeOnDiskAtom rangeTombstonesReversed;
+
 /**
  * This slice reader assumes that slices are sorted correctly, e.g. that 
for forward lookup slices are in
  * lexicographic order of start elements and that for reverse lookup they 
are in reverse lexicographic order of
@@ -74,6 +78,7 @@ class IndexedSliceReader extends AbstractIteratorOnDiskAtom 
implements OnDiskA
 this.reversed = reversed;
 this.slices = slices;
 this.comparator = sstable.metadata.comparator;
+this.rangeTombstonesReversed = reversed ? new ArrayDequeOnDiskAtom() 
: null;
 
 try
 {
@@ -147,6 +152,14 @@ class IndexedSliceReader extends 
AbstractIteratorOnDiskAtom implements OnDiskA
 {
 while (true)
 {
+if (reversed)
+{
+// Return all tombstone for the block first (see addColumn() 
below)
+OnDiskAtom column = rangeTombstonesReversed.poll();
+if (column != null)
+return column;
+}
+
 OnDiskAtom column = blockColumns.poll();
 if (column == null)
 {
@@ -169,9 +182,22 @@ class IndexedSliceReader extends 
AbstractIteratorOnDiskAtom implements OnDiskA
 protected void addColumn(OnDiskAtom col)
 {
 if (reversed)
-blockColumns.addFirst(col);
+{
+/*
+ * We put range tomstone markers at the beginning of the range 
they delete. But for reversed queries,
+ * the caller still need to know about a RangeTombstone before it 
sees any column that it covers.
+ * To make that simple, we keep said tombstones separate and 
return them all before any column for
+ * a given block.
+ */
+if (col instanceof RangeTombstone)
+rangeTombstonesReversed.addFirst(col);
+else
+