Author: slebresne Date: Wed Sep 7 17:29:53 2011 New Revision: 1166283 URL: http://svn.apache.org/viewvc?rev=1166283&view=rev Log: Use TreeMap backed column families for the SSTable simple writers patch by slebresne; reviewed by jbellis for CASSANDRA-3148
Added: cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java Modified: cassandra/trunk/CHANGES.txt cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java cassandra/trunk/src/java/org/apache/cassandra/db/Row.java cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Wed Sep 7 17:29:53 2011 @@ -62,6 +62,8 @@ (CASSANDRA-2901) * make AbstractBounds.normalize support overlapping ranges (CASSANDRA-2641) * fix of the CQL count() behavior (CASSANDRA-3068) + * use TreeMap backed column families for the SSTable simple writers + (CASSANDRA-3148) 0.8.5 * fix NPE when encryption_options is unspecified (CASSANDRA-3007) Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java Wed Sep 7 17:29:53 2011 @@ -35,7 +35,7 @@ public class ArrayBackedSortedColumns ex private final AbstractType<?> comparator; private final boolean reversed; - public static final ISortedColumns.Factory FACTORY = new Factory() + public static final ISortedColumns.Factory factory = new Factory() { public ISortedColumns create(AbstractType<?> comparator, boolean insertReversed) { @@ -50,7 +50,7 @@ public class ArrayBackedSortedColumns ex public static ISortedColumns.Factory factory() { - return FACTORY; + return factory; } private ArrayBackedSortedColumns(AbstractType<?> comparator, boolean reversed) Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java Wed Sep 7 17:29:53 2011 @@ -111,7 +111,7 @@ public class ColumnFamilySerializer impl public ColumnFamily deserialize(DataInput dis) throws IOException { - return deserialize(dis, false, ThreadSafeSortedColumns.FACTORY); + return deserialize(dis, false, ThreadSafeSortedColumns.factory()); } public ColumnFamily deserialize(DataInput dis, boolean fromRemote, ISortedColumns.Factory factory) throws IOException Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java Wed Sep 7 17:29:53 2011 @@ -110,7 +110,7 @@ class ReadResponseSerializer implements if (!isDigest) { // This is coming from a remote host - row = Row.serializer().deserialize(dis, version, true, ArrayBackedSortedColumns.FACTORY); + row = Row.serializer().deserialize(dis, version, true, ArrayBackedSortedColumns.factory()); } return isDigest ? new ReadResponse(ByteBuffer.wrap(digest)) : new ReadResponse(row); Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Row.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/Row.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/Row.java Wed Sep 7 17:29:53 2011 @@ -71,7 +71,7 @@ public class Row public Row deserialize(DataInputStream dis, int version) throws IOException { - return deserialize(dis, version, false, ThreadSafeSortedColumns.FACTORY); + return deserialize(dis, version, false, ThreadSafeSortedColumns.factory()); } } } Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java Wed Sep 7 17:29:53 2011 @@ -401,7 +401,7 @@ public class RowMutation implements IMut for (int i = 0; i < size; ++i) { Integer cfid = Integer.valueOf(dis.readInt()); - ColumnFamily cf = ColumnFamily.serializer().deserialize(dis, fromRemote, ThreadSafeSortedColumns.FACTORY); + ColumnFamily cf = ColumnFamily.serializer().deserialize(dis, fromRemote, ThreadSafeSortedColumns.factory()); modifications.put(cfid, cf); } return new RowMutation(table, key, modifications); Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java Wed Sep 7 17:29:53 2011 @@ -29,7 +29,7 @@ import org.apache.cassandra.utils.Alloca public class ThreadSafeSortedColumns extends ConcurrentSkipListMap<ByteBuffer, IColumn> implements ISortedColumns { - public static final ISortedColumns.Factory FACTORY = new Factory() + public static final ISortedColumns.Factory factory = new Factory() { public ISortedColumns create(AbstractType<?> comparator, boolean insertReversed) { @@ -44,7 +44,7 @@ public class ThreadSafeSortedColumns ext public static ISortedColumns.Factory factory() { - return FACTORY; + return factory; } public AbstractType<?> getComparator() Added: cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java?rev=1166283&view=auto ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java (added) +++ cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java Wed Sep 7 17:29:53 2011 @@ -0,0 +1,165 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cassandra.db; + +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.Iterator; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; + +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.utils.Allocator; + +public class TreeMapBackedSortedColumns extends TreeMap<ByteBuffer, IColumn> implements ISortedColumns +{ + public static final ISortedColumns.Factory factory = new Factory() + { + public ISortedColumns create(AbstractType<?> comparator, boolean insertReversed) + { + return new TreeMapBackedSortedColumns(comparator); + } + + public ISortedColumns fromSorted(SortedMap<ByteBuffer, IColumn> sortedMap, boolean insertReversed) + { + return new TreeMapBackedSortedColumns(sortedMap); + } + }; + + public static ISortedColumns.Factory factory() + { + return factory; + } + + public AbstractType<?> getComparator() + { + return (AbstractType)comparator(); + } + + private TreeMapBackedSortedColumns(AbstractType<?> comparator) + { + super(comparator); + } + + private TreeMapBackedSortedColumns(SortedMap<ByteBuffer, IColumn> columns) + { + super(columns); + } + + public ISortedColumns cloneMe() + { + return new TreeMapBackedSortedColumns(this); + } + + /* + * If we find an old column that has the same name + * the ask it to resolve itself else add the new column + */ + public void addColumn(IColumn column, Allocator allocator) + { + ByteBuffer name = column.name(); + IColumn oldColumn = put(name, column); + if (oldColumn != null) + { + if (oldColumn instanceof SuperColumn) + { + assert column instanceof SuperColumn; + ((SuperColumn) oldColumn).putColumn((SuperColumn)column, allocator); + } + else + { + // calculate reconciled col from old (existing) col and new col + IColumn reconciledColumn = column.reconcile(oldColumn, allocator); + put(name, reconciledColumn); + } + } + } + + /** + * We need to go through each column in the column container and resolve it before adding + */ + public void addAll(ISortedColumns cm, Allocator allocator) + { + for (IColumn column : cm.getSortedColumns()) + addColumn(column, allocator); + } + + public boolean replace(IColumn oldColumn, IColumn newColumn) + { + if (!oldColumn.name().equals(newColumn.name())) + throw new IllegalArgumentException(); + + // We are not supposed to put the newColumn is either there was not + // column or the column was not equal to oldColumn (to be coherent + // with other implementation). We optimize for the common case where + // oldColumn do is present though. + IColumn previous = put(oldColumn.name(), newColumn); + if (previous == null) + { + remove(oldColumn.name()); + return false; + } + if (!previous.equals(oldColumn)) + { + put(oldColumn.name(), previous); + return false; + } + return true; + } + + public IColumn getColumn(ByteBuffer name) + { + return get(name); + } + + public void removeColumn(ByteBuffer name) + { + remove(name); + } + + public Collection<IColumn> getSortedColumns() + { + return values(); + } + + public Collection<IColumn> getReverseSortedColumns() + { + return descendingMap().values(); + } + + public SortedSet<ByteBuffer> getColumnNames() + { + return navigableKeySet(); + } + + public int getEstimatedColumnCount() + { + return size(); + } + + public Iterator<IColumn> iterator() + { + return values().iterator(); + } + + public Iterator<IColumn> reverseIterator() + { + return getReverseSortedColumns().iterator(); + } +} Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java Wed Sep 7 17:29:53 2011 @@ -83,7 +83,7 @@ public class SSTableSimpleUnsortedWriter // If the CF already exist in memory, we'll just continue adding to it if (previous == null) { - previous = ColumnFamily.create(metadata); + previous = ColumnFamily.create(metadata, TreeMapBackedSortedColumns.factory()); keys.put(currentKey, previous); } else Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java Wed Sep 7 17:29:53 2011 @@ -79,6 +79,6 @@ public class SSTableSimpleWriter extends protected ColumnFamily getColumnFamily() { - return ColumnFamily.create(metadata); + return ColumnFamily.create(metadata, TreeMapBackedSortedColumns.factory()); } } Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java Wed Sep 7 17:29:53 2011 @@ -224,7 +224,7 @@ public class SSTableWriter extends SSTab // deserialize each column to obtain maxTimestamp and immediately serialize it. long maxTimestamp = Long.MIN_VALUE; - ColumnFamily cf = ColumnFamily.create(metadata, ArrayBackedSortedColumns.FACTORY); + ColumnFamily cf = ColumnFamily.create(metadata, ArrayBackedSortedColumns.factory()); for (int i = 0; i < columnCount; i++) { // deserialize column with fromRemote false, in order to keep size of streamed column Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java?rev=1166283&r1=1166282&r2=1166283&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java Wed Sep 7 17:29:53 2011 @@ -22,7 +22,7 @@ public class ArrayBackedSortedColumnsTes private void testAddInternal(boolean reversed) { - ISortedColumns map = ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed); + ISortedColumns map = ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed); int[] values = new int[]{ 1, 2, 2, 3 }; for (int i = 0; i < values.length; ++i) @@ -43,8 +43,8 @@ public class ArrayBackedSortedColumnsTes private void testAddAllInternal(boolean reversed) { - ISortedColumns map = ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed); - ISortedColumns map2 = ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed); + ISortedColumns map = ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed); + ISortedColumns map2 = ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed); int[] values1 = new int[]{ 1, 3, 5, 6 }; int[] values2 = new int[]{ 2, 4, 5, 6 }; @@ -75,7 +75,7 @@ public class ArrayBackedSortedColumnsTes private void testGetCollectionInternal(boolean reversed) { - ISortedColumns map = ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed); + ISortedColumns map = ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed); int[] values = new int[]{ 1, 2, 3, 5, 9 }; List<IColumn> sorted = new ArrayList<IColumn>(); @@ -100,7 +100,7 @@ public class ArrayBackedSortedColumnsTes private void testGetNamesInternal(boolean reversed) { - ISortedColumns map = ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed); + ISortedColumns map = ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed); List<ByteBuffer> names = new ArrayList<ByteBuffer>(); int[] values = new int[]{ 1, 2, 3, 5, 9 }; for (int v : values)