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)