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 2010/10/18 22:41:46 UTC
svn commit: r1024000 - in /cassandra/trunk: CHANGES.txt
src/java/org/apache/cassandra/db/ColumnFamilyStore.java
test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
Author: jbellis
Date: Mon Oct 18 20:41:46 2010
New Revision: 1024000
URL: http://svn.apache.org/viewvc?rev=1024000&view=rev
Log:
fix potential infinite loop in 2ary index queries
patch by jbellis; tested by Jason Tanner for CASSANDRA-1623
Modified:
cassandra/trunk/CHANGES.txt
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1024000&r1=1023999&r2=1024000&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Mon Oct 18 20:41:46 2010
@@ -42,6 +42,7 @@ dev
* Make memtable flush thresholds per-CF instead of global (CASSANDRA-1007)
* add cli support for binary data without CfDef hints (CASSANDRA-1603)
* fix building SSTable statistics post-stream (CASSANDRA-1620)
+ * fix potential infinite loop in 2ary index queries (CASSANDRA-1623)
0.7-beta2
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1024000&r1=1023999&r2=1024000&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Mon Oct 18 20:41:46 2010
@@ -1353,9 +1353,9 @@ public class ColumnFamilyStore implement
if (rows.size() == clause.count)
break outer;
}
- startKey = dataKey;
- if (n < clause.count)
+ if (n < clause.count || Arrays.equals(startKey, dataKey))
break;
+ startKey = dataKey;
}
return rows;
Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=1024000&r1=1023999&r2=1024000&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Mon Oct 18 20:41:46 2010
@@ -182,12 +182,20 @@ public class ColumnFamilyStoreTest exten
assert rows.get(0).cf.getColumnCount() == 1 : rows.get(0).cf;
// once more, this time with a slice rowset that needs to be expanded
- SliceQueryFilter sqf = new SliceQueryFilter(ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, false, 0);
- rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").scan(clause, range, sqf);
+ SliceQueryFilter emptyFilter = new SliceQueryFilter(ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, false, 0);
+ rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").scan(clause, range, emptyFilter);
assert rows.size() == 1 : StringUtils.join(rows, ",");
assert Arrays.equals("k3".getBytes(), rows.get(0).key.key);
assert rows.get(0).cf.getColumnCount() == 0;
+
+ // query with index hit but rejected by secondary clause, with a small enough count that just checking count
+ // doesn't tell the scan loop that it's done
+ IndexExpression expr3 = new IndexExpression("notbirthdate".getBytes("UTF8"), IndexOperator.EQ, FBUtilities.toByteArray(-1L));
+ clause = new IndexClause(Arrays.asList(expr, expr3), ArrayUtils.EMPTY_BYTE_ARRAY, 1);
+ rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").scan(clause, range, filter);
+
+ assert rows.isEmpty();
}
@Test