fix memorySize bugs and cleanup patch by Carl Yeksigian and jbellis for CASSANDRA-5564
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/fe10ba7d Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/fe10ba7d Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/fe10ba7d Branch: refs/heads/cassandra-1.2 Commit: fe10ba7df361c80d17a11aeed68d8b1c39ec1ae9 Parents: 3b41d21 Author: Jonathan Ellis <[email protected]> Authored: Mon May 13 16:28:48 2013 -0500 Committer: Jonathan Ellis <[email protected]> Committed: Mon May 13 16:28:48 2013 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/cache/KeyCacheKey.java | 7 ++- .../org/apache/cassandra/cache/RowCacheKey.java | 7 ++- .../apache/cassandra/cache/RowCacheSentinel.java | 3 +- .../org/apache/cassandra/db/RowIndexEntry.java | 18 +++++-- .../apache/cassandra/io/sstable/IndexHelper.java | 9 +++- .../org/apache/cassandra/utils/ObjectSizes.java | 38 ++++++++++++--- 6 files changed, 62 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/cache/KeyCacheKey.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/KeyCacheKey.java b/src/java/org/apache/cassandra/cache/KeyCacheKey.java index 9741c7f..3b2077c 100644 --- a/src/java/org/apache/cassandra/cache/KeyCacheKey.java +++ b/src/java/org/apache/cassandra/cache/KeyCacheKey.java @@ -52,8 +52,11 @@ public class KeyCacheKey implements CacheKey public long memorySize() { - long fields = ObjectSizes.getReferenceSize() + ObjectSizes.getSizeWithRef(key); - return ObjectSizes.getFieldSize(fields); + return ObjectSizes.getFieldSize(// desc + ObjectSizes.getReferenceSize() + + // key + ObjectSizes.getReferenceSize()) + + ObjectSizes.getArraySize(key); } @Override http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/cache/RowCacheKey.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/RowCacheKey.java b/src/java/org/apache/cassandra/cache/RowCacheKey.java index d7dab35..33e2065 100644 --- a/src/java/org/apache/cassandra/cache/RowCacheKey.java +++ b/src/java/org/apache/cassandra/cache/RowCacheKey.java @@ -52,8 +52,11 @@ public class RowCacheKey implements CacheKey, Comparable<RowCacheKey> public long memorySize() { - long fields = ObjectSizes.getReferenceSize() + ObjectSizes.getSizeWithRef(key); - return ObjectSizes.getFieldSize(fields); + return ObjectSizes.getFieldSize(// cfId + ObjectSizes.getReferenceSize() + + // key + ObjectSizes.getReferenceSize()) + + ObjectSizes.getArraySize(key); } @Override http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/cache/RowCacheSentinel.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/RowCacheSentinel.java b/src/java/org/apache/cassandra/cache/RowCacheSentinel.java index d7da6ce..9a014dc 100644 --- a/src/java/org/apache/cassandra/cache/RowCacheSentinel.java +++ b/src/java/org/apache/cassandra/cache/RowCacheSentinel.java @@ -19,6 +19,7 @@ package org.apache.cassandra.cache; import java.util.concurrent.atomic.AtomicLong; +import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.utils.ObjectSizes; import com.google.common.base.Objects; @@ -60,6 +61,6 @@ public class RowCacheSentinel implements IRowCacheEntry public long memorySize() { // Only long reference. - return ObjectSizes.getFieldSize(8); + return ObjectSizes.getFieldSize(TypeSizes.NATIVE.sizeof(sentinelId)); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/db/RowIndexEntry.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/RowIndexEntry.java b/src/java/org/apache/cassandra/db/RowIndexEntry.java index c53e52f..b3904d4 100644 --- a/src/java/org/apache/cassandra/db/RowIndexEntry.java +++ b/src/java/org/apache/cassandra/db/RowIndexEntry.java @@ -88,8 +88,7 @@ public class RowIndexEntry implements IMeasurableMemory public long memorySize() { - long fields = TypeSizes.NATIVE.sizeof(position) + ObjectSizes.getReferenceSize(); - return ObjectSizes.getFieldSize(fields); + return ObjectSizes.getFieldSize(TypeSizes.NATIVE.sizeof(position)); } public static class Serializer @@ -200,13 +199,20 @@ public class RowIndexEntry implements IMeasurableMemory return (int)size; } + @Override public long memorySize() { - long internal = 0; + long entrySize = 0; for (IndexHelper.IndexInfo idx : columnsIndex) - internal += idx.memorySize(); - long listSize = ObjectSizes.getFieldSize(ObjectSizes.getArraySize(columnsIndex.size(), internal) + 4); - return ObjectSizes.getFieldSize(deletionTime.memorySize() + listSize); + entrySize += idx.memorySize(); + + return ObjectSizes.getSuperClassFieldSize(TypeSizes.NATIVE.sizeof(position)) + + ObjectSizes.getFieldSize(// deletionTime + ObjectSizes.getReferenceSize() + + // columnsIndex + ObjectSizes.getReferenceSize()) + + deletionTime.memorySize() + + ObjectSizes.getArraySize(columnsIndex.size(), ObjectSizes.getReferenceSize()) + entrySize + 4; } } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/io/sstable/IndexHelper.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java index b93c019..b74e48b 100644 --- a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java +++ b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java @@ -189,8 +189,13 @@ public class IndexHelper public long memorySize() { - long fields = ObjectSizes.getSize(firstName) + ObjectSizes.getSize(lastName) + 8 + 8; - return ObjectSizes.getFieldSize(fields); + return ObjectSizes.getFieldSize(// firstName + ObjectSizes.getReferenceSize() + + // lastName + ObjectSizes.getReferenceSize() + + TypeSizes.NATIVE.sizeof(offset) + + TypeSizes.NATIVE.sizeof(width)) + + ObjectSizes.getSize(firstName) + ObjectSizes.getSize(lastName); } } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/fe10ba7d/src/java/org/apache/cassandra/utils/ObjectSizes.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/ObjectSizes.java b/src/java/org/apache/cassandra/utils/ObjectSizes.java index 66ec501..acee919 100644 --- a/src/java/org/apache/cassandra/utils/ObjectSizes.java +++ b/src/java/org/apache/cassandra/utils/ObjectSizes.java @@ -56,26 +56,52 @@ public class ObjectSizes int getSuperclassFieldPadding(); } + /** + * Memory a class consumes, including the object header and the size of the fields. + * @param fieldsSize Total size of the primitive fields of a class + * @return Total in-memory size of the class + */ public static long getFieldSize(long fieldsSize) { return roundTo(SPEC.getObjectHeaderSize() + fieldsSize, SPEC.getObjectPadding()); } + /** + * Memory a super class consumes, given the primitive field sizes + * @param fieldsSize Total size of the primitive fields of the super class + * @return Total additional in-memory that the super class takes up + */ public static long getSuperClassFieldSize(long fieldsSize) { return roundTo(fieldsSize, SPEC.getSuperclassFieldPadding()); } + /** + * Memory an array will consume + * @param length Number of elements in the array + * @param elementSize In-memory size of each element's primitive stored + * @return In-memory size of the array + */ public static long getArraySize(int length, long elementSize) { return roundTo(SPEC.getArrayHeaderSize() + length * elementSize, SPEC.getObjectPadding()); } - public static long getSizeWithRef(byte[] bytes) + /** + * Memory a byte array consumes + * @param bytes byte array to get memory size + * @return In-memory size of the array + */ + public static long getArraySize(byte[] bytes) { - return SPEC.getReferenceSize() + getArraySize(bytes.length, 1); + return getArraySize(bytes.length, 1); } + /** + * Memory a byte buffer consumes + * @param buffer ByteBuffer to calculate in memory size + * @return Total in-memory size of the byte buffer + */ public static long getSize(ByteBuffer buffer) { long size = 0; @@ -93,16 +119,14 @@ public class ObjectSizes return size; } - public static long getSizeWithRef(ByteBuffer buffer) - { - return SPEC.getReferenceSize() + getSize(buffer); - } - public static long roundTo(long x, int multiple) { return ((x + multiple - 1) / multiple) * multiple; } + /** + * @return Memory a reference consumes on the current architecture. + */ public static int getReferenceSize() { return SPEC.getReferenceSize();
