diff --git a/CHANGES.txt b/CHANGES.txt index 1d827cf63e..e5e9035dc7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -33,7 +33,7 @@ * add scheduler JMX metrics (CASSANDRA-2962) * add block level checksum for compressed data (CASSANDRA-1717) * make column family backed column map pluggable and introduce unsynchronized - ArrayList backed one to speedup reads (CASSANDRA-2843, 3165) + ArrayList backed one to speedup reads (CASSANDRA-2843, 3165, 3205) * refactoring of the secondary index api (CASSANDRA-2982) * make CL > ONE reads wait for digest reconciliation before returning (CASSANDRA-2494) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index 71c72135ef..3657cddfd6 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -82,6 +82,11 @@ public class ArrayBackedSortedColumns extends ArrayList implements ISor return new ArrayBackedSortedColumns(this, comparator, reversed); } + public boolean isInsertReversed() + { + return reversed; + } + private int compare(ByteBuffer name1, ByteBuffer name2) { if (reversed) diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java index 38bc0d78e3..cb715dea43 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamily.java +++ b/src/java/org/apache/cassandra/db/ColumnFamily.java @@ -81,9 +81,9 @@ public class ColumnFamily extends AbstractColumnContainer this.cfm = cfm; } - public ColumnFamily cloneMeShallow(ISortedColumns.Factory factory) + public ColumnFamily cloneMeShallow(ISortedColumns.Factory factory, boolean reversedInsertOrder) { - ColumnFamily cf = ColumnFamily.create(cfm, factory); + ColumnFamily cf = ColumnFamily.create(cfm, factory, reversedInsertOrder); // since deletion info is immutable, aliasing it is fine cf.deletionInfo.set(deletionInfo.get()); return cf; @@ -91,7 +91,7 @@ public class ColumnFamily extends AbstractColumnContainer public ColumnFamily cloneMeShallow() { - return cloneMeShallow(columns.getFactory()); + return cloneMeShallow(columns.getFactory(), columns.isInsertReversed()); } public AbstractType getSubComparator() diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 33cafbbd80..a98213a7d8 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1194,7 +1194,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean IColumn sc = cached.getColumn(filter.path.superColumnName); if (sc == null || sliceFilter.count >= sc.getSubColumns().size()) { - ColumnFamily cf = cached.cloneMeShallow(ArrayBackedSortedColumns.factory()); + ColumnFamily cf = cached.cloneMeShallow(ArrayBackedSortedColumns.factory(), filter.filter.isReversed()); if (sc != null) cf.addColumn(sc, HeapAllocator.instance); return removeDeleted(cf, gcBefore); @@ -1213,7 +1213,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean } IColumnIterator ci = filter.getMemtableColumnIterator(cached, null, getComparator()); - ColumnFamily cf = ci.getColumnFamily().cloneMeShallow(ArrayBackedSortedColumns.factory()); + ColumnFamily cf = ci.getColumnFamily().cloneMeShallow(ArrayBackedSortedColumns.factory(), filter.filter.isReversed()); filter.collateColumns(cf, Collections.singletonList(ci), getComparator(), gcBefore); // TODO this is necessary because when we collate supercolumns together, we don't check // their subcolumns for relevance, so we need to do a second prune post facto here. diff --git a/src/java/org/apache/cassandra/db/ISortedColumns.java b/src/java/org/apache/cassandra/db/ISortedColumns.java index 624dec7113..9f66ed04d6 100644 --- a/src/java/org/apache/cassandra/db/ISortedColumns.java +++ b/src/java/org/apache/cassandra/db/ISortedColumns.java @@ -124,6 +124,11 @@ public interface ISortedColumns extends IIterableColumns */ public Iterator reverseIterator(); + /** + * Returns if this map only support inserts in reverse order. + */ + public boolean isInsertReversed(); + public interface Factory { /** diff --git a/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java b/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java index 13a111ad3b..1b2f9d3fd5 100644 --- a/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java @@ -72,6 +72,11 @@ public class ThreadSafeSortedColumns extends ConcurrentSkipListMap imp return new TreeMapBackedSortedColumns(this); } + public boolean isInsertReversed() + { + return false; + } + /* * If we find an old column that has the same name * the ask it to resolve itself else add the new column