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 2012/07/04 00:24:40 UTC
[2/2] git commit: implement addAllWithSizeDelta for
ThreadSafeSortedColumns (used in Memtable for supercolumns); see #4399
implement addAllWithSizeDelta for ThreadSafeSortedColumns (used in Memtable for supercolumns); see #4399
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/587ed053
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/587ed053
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/587ed053
Branch: refs/heads/trunk
Commit: 587ed053e9159dd3660283df2aa5a89e7f2464d8
Parents: d2b60f2
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Jul 3 12:29:24 2012 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Jul 3 17:23:42 2012 -0500
----------------------------------------------------------------------
.../db/AbstractThreadUnsafeSortedColumns.java | 10 +----
.../cassandra/db/ArrayBackedSortedColumns.java | 3 +-
.../apache/cassandra/db/AtomicSortedColumns.java | 19 ++-------
.../cassandra/db/ThreadSafeSortedColumns.java | 30 ++++++++++++---
.../cassandra/db/TreeMapBackedSortedColumns.java | 3 +-
5 files changed, 33 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/587ed053/src/java/org/apache/cassandra/db/AbstractThreadUnsafeSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AbstractThreadUnsafeSortedColumns.java b/src/java/org/apache/cassandra/db/AbstractThreadUnsafeSortedColumns.java
index 90fa9b4..0e71cb3 100644
--- a/src/java/org/apache/cassandra/db/AbstractThreadUnsafeSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/AbstractThreadUnsafeSortedColumns.java
@@ -90,21 +90,13 @@ public abstract class AbstractThreadUnsafeSortedColumns implements ISortedColumn
}
}
- // Implementations should implement this rather than addAll to avoid
- // having to care about the deletion infos
- protected abstract void addAllColumns(ISortedColumns columns, Allocator allocator, Function<IColumn, IColumn> transformation);
-
public long addAllWithSizeDelta(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
{
// sizeDelta is only needed by memtable updates which should not be using thread-unsafe containers
throw new UnsupportedOperationException();
}
- public void addAll(ISortedColumns columns, Allocator allocator, Function<IColumn, IColumn> transformation)
- {
- addAllColumns(columns, allocator, transformation);
- delete(columns.getDeletionInfo());
- }
+ public abstract void addAll(ISortedColumns columns, Allocator allocator, Function<IColumn, IColumn> transformation);
public boolean isEmpty()
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/587ed053/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
index 4dc1e3e..d76b443 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -207,8 +207,9 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
return -mid - (result < 0 ? 1 : 2);
}
- protected void addAllColumns(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
+ public void addAll(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
{
+ delete(cm.getDeletionInfo());
if (cm.isEmpty())
return;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/587ed053/src/java/org/apache/cassandra/db/AtomicSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AtomicSortedColumns.java b/src/java/org/apache/cassandra/db/AtomicSortedColumns.java
index c8f5f3a..f1629ab 100644
--- a/src/java/org/apache/cassandra/db/AtomicSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/AtomicSortedColumns.java
@@ -338,41 +338,30 @@ public class AtomicSortedColumns implements ISortedColumns
long addColumn(IColumn column, Allocator allocator)
{
ByteBuffer name = column.name();
- IColumn oldColumn;
- long sizeDelta = 0;
while (true)
{
- oldColumn = map.putIfAbsent(name, column);
+ IColumn oldColumn = map.putIfAbsent(name, column);
if (oldColumn == null)
- {
- sizeDelta += column.dataSize();
- break;
- }
+ return column.dataSize();
if (oldColumn instanceof SuperColumn)
{
assert column instanceof SuperColumn;
long previousSize = oldColumn.dataSize();
((SuperColumn) oldColumn).putColumn((SuperColumn)column, allocator);
- sizeDelta += oldColumn.dataSize() - previousSize;
- break; // Delegated to SuperColumn
+ return oldColumn.dataSize() - previousSize;
}
else
{
// calculate reconciled col from old (existing) col and new col
IColumn reconciledColumn = column.reconcile(oldColumn, allocator);
if (map.replace(name, oldColumn, reconciledColumn))
- {
- sizeDelta += reconciledColumn.dataSize() - oldColumn.dataSize();
- break;
- }
+ return reconciledColumn.dataSize() - oldColumn.dataSize();
// We failed to replace column due to a concurrent update or a concurrent removal. Keep trying.
// (Currently, concurrent removal should not happen (only updates), but let us support that anyway.)
}
}
-
- return sizeDelta;
}
void retainAll(ISortedColumns columns)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/587ed053/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java b/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
index beb33ac..0a32b1c 100644
--- a/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
@@ -88,22 +88,31 @@ public class ThreadSafeSortedColumns extends AbstractThreadUnsafeSortedColumns i
*/
public void addColumn(IColumn column, Allocator allocator)
{
+ addColumnInternal(column, allocator);
+ }
+
+ private long addColumnInternal(IColumn column, Allocator allocator)
+ {
ByteBuffer name = column.name();
- IColumn oldColumn;
- while ((oldColumn = map.putIfAbsent(name, column)) != null)
+ while (true)
{
+ IColumn oldColumn = map.putIfAbsent(name, column);
+ if (oldColumn == null)
+ return column.dataSize();
+
if (oldColumn instanceof SuperColumn)
{
assert column instanceof SuperColumn;
+ long previousSize = oldColumn.dataSize();
((SuperColumn) oldColumn).putColumn((SuperColumn)column, allocator);
- break; // Delegated to SuperColumn
+ return oldColumn.dataSize() - previousSize;
}
else
{
// calculate reconciled col from old (existing) col and new col
IColumn reconciledColumn = column.reconcile(oldColumn, allocator);
if (map.replace(name, oldColumn, reconciledColumn))
- break;
+ return reconciledColumn.dataSize() - oldColumn.dataSize();
// We failed to replace column due to a concurrent update or a concurrent removal. Keep trying.
// (Currently, concurrent removal should not happen (only updates), but let us support that anyway.)
@@ -114,10 +123,19 @@ public class ThreadSafeSortedColumns extends AbstractThreadUnsafeSortedColumns i
/**
* We need to go through each column in the column container and resolve it before adding
*/
- protected void addAllColumns(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
+ public void addAll(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
+ {
+ addAllWithSizeDelta(cm, allocator, transformation);
+ }
+
+ @Override
+ public long addAllWithSizeDelta(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
{
+ delete(cm.getDeletionInfo());
+ long sizeDelta = 0;
for (IColumn column : cm.getSortedColumns())
- addColumn(transformation.apply(column), allocator);
+ sizeDelta += addColumnInternal(transformation.apply(column), allocator);
+ return sizeDelta;
}
public boolean replace(IColumn oldColumn, IColumn newColumn)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/587ed053/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java b/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
index 51779e3..96e1e5d 100644
--- a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
@@ -117,8 +117,9 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
/**
* We need to go through each column in the column container and resolve it before adding
*/
- protected void addAllColumns(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
+ public void addAll(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation)
{
+ delete(cm.getDeletionInfo());
for (IColumn column : cm.getSortedColumns())
addColumn(transformation.apply(column), allocator);
}