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 2009/08/11 00:52:08 UTC
svn commit: r802950 - in
/incubator/cassandra/trunk/src/java/org/apache/cassandra:
db/filter/SSTableNamesIterator.java utils/BloomFilter.java
Author: jbellis
Date: Mon Aug 10 22:52:08 2009
New Revision: 802950
URL: http://svn.apache.org/viewvc?rev=802950&view=rev
Log:
check column-level bloom filter during name-based slicing.
patch by jbellis; reviewed by Jun Rao for CASSANDRA-325
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java?rev=802950&r1=802949&r2=802950&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java Mon Aug 10 22:52:08 2009
@@ -8,6 +8,7 @@
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.io.*;
import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.utils.BloomFilter;
public class SSTableNamesIterator extends SimpleAbstractColumnIterator
{
@@ -15,10 +16,10 @@
private Iterator<IColumn> iter;
public final SortedSet<byte[]> columns;
- public SSTableNamesIterator(String filename, String key, String cfName, SortedSet<byte[]> columns) throws IOException
+ public SSTableNamesIterator(String filename, String key, String cfName, SortedSet<byte[]> columnNames) throws IOException
{
- assert columns != null;
- this.columns = columns;
+ assert columnNames != null;
+ this.columns = columnNames;
SSTableReader ssTable = SSTableReader.open(filename);
String decoratedKey = ssTable.getPartitioner().decorateKey(key);
@@ -31,13 +32,24 @@
{
file.seek(position);
- /* note the position where the key starts */
String keyInDisk = file.readUTF();
assert keyInDisk.equals(decoratedKey) : keyInDisk;
file.readInt(); // data size
/* Read the bloom filter summarizing the columns */
- IndexHelper.defreezeBloomFilter(file);
+ BloomFilter bf = IndexHelper.defreezeBloomFilter(file);
+ List<byte[]> filteredColumnNames = new ArrayList<byte[]>(columnNames.size());
+ for (byte[] name : columnNames)
+ {
+ if (bf.isPresent(name))
+ {
+ filteredColumnNames.add(name);
+ }
+ }
+ if (filteredColumnNames.isEmpty())
+ {
+ return;
+ }
List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(file);
@@ -47,7 +59,7 @@
/* get the various column ranges we have to read */
AbstractType comparator = DatabaseDescriptor.getComparator(SSTable.parseTableName(filename), cfName);
SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator));
- for (byte[] name : columns)
+ for (byte[] name : filteredColumnNames)
{
int index = IndexHelper.indexFor(name, indexList, comparator, false);
if (index == indexList.size())
@@ -68,7 +80,8 @@
while (file.getFilePointer() < columnBegin + indexInfo.offset + indexInfo.width)
{
final IColumn column = cf.getColumnSerializer().deserialize(file);
- if (columns.contains(column.name()))
+ // we check vs the original Set, not the filtered List, for efficiency
+ if (columnNames.contains(column.name()))
{
cf.addColumn(column);
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java?rev=802950&r1=802949&r2=802950&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java Mon Aug 10 22:52:08 2009
@@ -85,6 +85,18 @@
return true;
}
+ public boolean isPresent(byte[] key)
+ {
+ for (int bucketIndex : getHashBuckets(key))
+ {
+ if (!filter_.get(bucketIndex))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
/*
@param key -- value whose hash is used to fill
the filter_.