Author: jbellis Date: Fri May 7 20:55:33 2010 New Revision: 942217 URL: http://svn.apache.org/viewvc?rev=942217&view=rev Log: merge from 0.6
Modified: cassandra/trunk/ (props changed) cassandra/trunk/CHANGES.txt cassandra/trunk/README.txt cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed) cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Propchange: cassandra/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6:922689-942119 +/cassandra/branches/cassandra-0.6:922689-942206 /incubator/cassandra/branches/cassandra-0.3:774578-796573 /incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5:888872-915439 Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Fri May 7 20:55:33 2010 @@ -35,6 +35,7 @@ dev * make concurrent_reads, concurrent_writes configurable at runtime via JMX (CASSANDRA-1060) * disable GCInspector on non-Sun JVMs (CASSANDRA-1061) + * fix tombstone handling in sstable rows with no other data (CASSANDRA-1063) 0.6.1 Modified: cassandra/trunk/README.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/README.txt?rev=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/README.txt (original) +++ cassandra/trunk/README.txt Fri May 7 20:55:33 2010 @@ -10,7 +10,7 @@ and the data model from Google's BigTabl eventually consistent. Like BigTable, Cassandra provides a ColumnFamily-based data model richer than typical key/value systems. -For more information see http://incubator.apache.org/cassandra +For more information see http://cassandra.apache.org/ Requirements ------------ @@ -22,8 +22,8 @@ Getting started This short guide will walk you through getting a basic one node cluster up and running, and demonstrate some simple reads and writes. - * tar -zxvf cassandra-$VERSION.tgz - * cd cassandra-$VERSION + * tar -zxvf apache-cassandra-$VERSION.tar.gz + * cd apache-cassandra-$VERSION * sudo mkdir -p /var/log/cassandra * sudo chown -R `whoami` /var/log/cassandra * sudo mkdir -p /var/lib/cassandra @@ -94,7 +94,7 @@ Wondering where to go from here? best source for additional information. * Join us in #cassandra on irc.freenode.net and ask questions. * Subscribe to the Users mailing list by sending a mail to - cassandra-user-subscr...@incubator.apache.org + user-subscr...@cassandra.apache.org Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-942119 +/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-942206 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Cassandra.java:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Cassandra.java:888872-903502 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-942119 +/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-942206 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Column.java:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Column.java:888872-903502 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-942119 +/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-942206 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:888872-903502 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-942119 +/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-942206 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:888872-903502 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 7 20:55:33 2010 @@ -1,4 +1,4 @@ -/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-942119 +/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-942206 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:810145-834239,834349-834350 /incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:888872-903502 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=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Fri May 7 20:55:33 2010 @@ -808,18 +808,15 @@ public class ColumnFamilyStore implement for (SSTableReader sstable : ssTables_) { iter = filter.getSSTableColumnIterator(sstable); - if (iter.hasNext()) // initializes iter.CF + if (iter.getColumnFamily() != null) { returnCF.delete(iter.getColumnFamily()); + iterators.add(iter); } - iterators.add(iter); } Comparator<IColumn> comparator = QueryFilter.getColumnComparator(getComparator()); Iterator collated = IteratorUtils.collatedIterator(comparator, iterators); - if (!collated.hasNext()) - return null; - filter.collectCollatedColumns(returnCF, collated, gcBefore); return returnCF; // caller is responsible for final removeDeleted } Modified: cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java?rev=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java Fri May 7 20:55:33 2010 @@ -60,6 +60,7 @@ public class SSTableNamesIterator extend this.columns = columnNames; this.decoratedKey = key; + // open the sstable file, if we don't have one passed to use from range scan if (file == null) { try @@ -78,19 +79,69 @@ public class SSTableNamesIterator extend } } + // read the requested columns into `cf` try { - List<byte[]> filteredColumnNames = getFilteredColumns(file, columnNames); + /* Read the bloom filter summarizing the columns */ + BloomFilter bf = IndexHelper.defreezeBloomFilter(file); + List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(file); + + // we can stop early if bloom filter says none of the columns actually exist -- but, + // we can't stop before initializing the cf above, in case there's a relevant tombstone + cf = ColumnFamily.serializer().deserializeFromSSTableNoColumns(ssTable.makeColumnFamily(), file); + + List<byte[]> filteredColumnNames1 = new ArrayList<byte[]>(columnNames.size()); + for (byte[] name : columnNames) + { + if (bf.isPresent(name)) + { + filteredColumnNames1.add(name); + } + } + List<byte[]> filteredColumnNames = filteredColumnNames1; if (filteredColumnNames.isEmpty()) return; - getColumns(ssTable, file, columnNames, filteredColumnNames); + file.readInt(); // column count + + /* get the various column ranges we have to read */ + AbstractType comparator = ssTable.getColumnComparator(); + SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator)); + for (byte[] name : filteredColumnNames) + { + int index = IndexHelper.indexFor(name, indexList, comparator, false); + if (index == indexList.size()) + continue; + IndexHelper.IndexInfo indexInfo = indexList.get(index); + if (comparator.compare(name, indexInfo.firstName) < 0) + continue; + ranges.add(indexInfo); + } + + file.mark(); + for (IndexHelper.IndexInfo indexInfo : ranges) + { + file.reset(); + long curOffsert = file.skipBytes((int)indexInfo.offset); + assert curOffsert == indexInfo.offset; + // TODO only completely deserialize columns we are interested in + while (file.bytesPastMark() < indexInfo.offset + indexInfo.width) + { + final IColumn column = cf.getColumnSerializer().deserialize(file); + // we check vs the original Set, not the filtered List, for efficiency + if (columnNames.contains(column.name())) + { + cf.addColumn(column); + } + } + } } catch (IOException e) { throw new IOError(e); } - + + // create an iterator view of the columns we read iter = cf.getSortedColumns().iterator(); } @@ -99,76 +150,6 @@ public class SSTableNamesIterator extend return decoratedKey; } - /** - * Read in the columns we are looking for - * @param ssTable Table to read from - * @param file Read from this file - * @param columnNames Names of all columns we are looking for - * @param filteredColumnNames Names of columns that are thought to exist - * @throws IOException - */ - private void getColumns(SSTableReader ssTable, FileDataInput file, SortedSet<byte[]> columnNames, List<byte[]> filteredColumnNames) throws IOException - { - List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(file); - - cf = ColumnFamily.serializer().deserializeFromSSTableNoColumns(ssTable.makeColumnFamily(), file); - file.readInt(); // column count - - /* get the various column ranges we have to read */ - AbstractType comparator = ssTable.getColumnComparator(); - SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator)); - for (byte[] name : filteredColumnNames) - { - int index = IndexHelper.indexFor(name, indexList, comparator, false); - if (index == indexList.size()) - continue; - IndexHelper.IndexInfo indexInfo = indexList.get(index); - if (comparator.compare(name, indexInfo.firstName) < 0) - continue; - ranges.add(indexInfo); - } - - file.mark(); - for (IndexHelper.IndexInfo indexInfo : ranges) - { - file.reset(); - long curOffsert = file.skipBytes((int)indexInfo.offset); - assert curOffsert == indexInfo.offset; - // TODO only completely deserialize columns we are interested in - while (file.bytesPastMark() < indexInfo.offset + indexInfo.width) - { - final IColumn column = cf.getColumnSerializer().deserialize(file); - // we check vs the original Set, not the filtered List, for efficiency - if (columnNames.contains(column.name())) - { - cf.addColumn(column); - } - } - } - } - - /** - * Check the list of column names against the bloom filter - * @param file File to read bloom filter from - * @param columnNames Column names to filter - * @return List of columns that exist in the bloom filter - * @throws IOException - */ - private List<byte[]> getFilteredColumns(FileDataInput file, SortedSet<byte[]> columnNames) throws IOException - { - /* Read the bloom filter summarizing the columns */ - BloomFilter bf = IndexHelper.defreezeBloomFilter(file); - List<byte[]> filteredColumnNames = new ArrayList<byte[]>(columnNames.size()); - for (byte[] name : columnNames) - { - if (bf.isPresent(name)) - { - filteredColumnNames.add(name); - } - } - return filteredColumnNames; - } - public ColumnFamily getColumnFamily() { return cf; Modified: cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java Fri May 7 20:55:33 2010 @@ -120,7 +120,7 @@ class SSTableSliceIterator extends Abstr public ColumnFamily getColumnFamily() { - return reader.getEmptyColumnFamily(); + return reader == null ? null : reader.getEmptyColumnFamily(); } protected IColumn computeNext() 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=942217&r1=942216&r2=942217&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Fri May 7 20:55:33 2010 @@ -87,9 +87,14 @@ public class ColumnFamilyStoreTest exten public void runMayThrow() throws IOException { QueryFilter sliceFilter = QueryFilter.getSliceFilter(Util.dk("key1"), new QueryPath("Standard2", null, null), ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, null, false, 1); - assertNull(store.getColumnFamily(sliceFilter)); + ColumnFamily cf = store.getColumnFamily(sliceFilter); + assert cf.isMarkedForDelete(); + assert cf.getColumnsMap().isEmpty(); + QueryFilter namesFilter = QueryFilter.getNamesFilter(Util.dk("key1"), new QueryPath("Standard2", null, null), "a".getBytes()); - assertNull(store.getColumnFamily(namesFilter)); + cf = store.getColumnFamily(namesFilter); + assert cf.isMarkedForDelete(); + assert cf.getColumnsMap().isEmpty(); } };