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 2014/01/31 00:09:31 UTC
[6/6] git commit: remove Table.switchlock and introduce
o.a.c.utils.memory package patch by Benedict Elliott Smith;
reviewed by jbellis for CASSANDRA-5549
remove Table.switchlock and introduce o.a.c.utils.memory package
patch by Benedict Elliott Smith; reviewed by jbellis for CASSANDRA-5549
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/4b54b8ac
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/4b54b8ac
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/4b54b8ac
Branch: refs/heads/trunk
Commit: 4b54b8acd21999ad4394feb93deb7cca1de445c0
Parents: 00fc318
Author: Jonathan Ellis <jb...@apache.org>
Authored: Thu Jan 30 17:08:46 2014 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Thu Jan 30 17:09:18 2014 -0600
----------------------------------------------------------------------
build.xml | 6 +-
conf/cassandra-env.sh | 2 +-
conf/cassandra.yaml | 9 +-
lib/jamm-0.2.5.jar | Bin 5792 -> 0 bytes
lib/jamm-0.2.6.jar | Bin 0 -> 13290 bytes
lib/licenses/jamm-0.2.5.txt | 202 --------
lib/licenses/jamm-0.2.6.txt | 202 ++++++++
.../cache/ConcurrentLinkedHashCache.java | 2 +-
.../apache/cassandra/cache/CounterCacheKey.java | 14 +-
.../cassandra/cache/IMeasurableMemory.java | 7 +-
.../org/apache/cassandra/cache/KeyCacheKey.java | 12 +-
.../org/apache/cassandra/cache/RowCacheKey.java | 10 +-
.../cassandra/cache/RowCacheSentinel.java | 6 -
.../org/apache/cassandra/config/Config.java | 4 +-
.../cassandra/config/DatabaseDescriptor.java | 38 +-
.../apache/cassandra/cql3/ColumnIdentifier.java | 32 +-
.../apache/cassandra/cql3/QueryProcessor.java | 35 +-
.../cassandra/db/ArrayBackedSortedColumns.java | 10 +-
.../apache/cassandra/db/AtomicBTreeColumns.java | 174 ++++---
src/java/org/apache/cassandra/db/Cell.java | 21 +-
.../org/apache/cassandra/db/ClockAndCount.java | 8 +-
.../cassandra/db/CollationController.java | 2 +-
.../org/apache/cassandra/db/ColumnFamily.java | 11 +-
.../apache/cassandra/db/ColumnFamilyStore.java | 502 +++++++++++-------
.../cassandra/db/ColumnFamilyStoreMBean.java | 4 +-
.../org/apache/cassandra/db/CounterCell.java | 10 +-
.../apache/cassandra/db/CounterMutation.java | 5 +-
.../apache/cassandra/db/CounterUpdateCell.java | 8 +-
.../org/apache/cassandra/db/DataTracker.java | 182 ++++---
.../org/apache/cassandra/db/DeletedCell.java | 7 +-
.../org/apache/cassandra/db/DeletionInfo.java | 12 +-
.../org/apache/cassandra/db/DeletionTime.java | 10 +-
.../org/apache/cassandra/db/EmptyColumns.java | 6 +-
.../org/apache/cassandra/db/ExpiringCell.java | 5 +-
src/java/org/apache/cassandra/db/Keyspace.java | 42 +-
src/java/org/apache/cassandra/db/Memtable.java | 340 ++++++-------
.../org/apache/cassandra/db/MeteredFlusher.java | 131 -----
.../apache/cassandra/db/RangeTombstoneList.java | 33 +-
.../org/apache/cassandra/db/RowIndexEntry.java | 27 +-
.../db/TreeMapBackedSortedColumns.java | 7 +-
.../apache/cassandra/db/UnsortedColumns.java | 7 +-
.../db/commitlog/AbstractCommitLogService.java | 8 +-
.../cassandra/db/commitlog/CommitLog.java | 21 +-
.../db/commitlog/CommitLogSegment.java | 166 +++---
.../db/commitlog/CommitLogSegmentManager.java | 65 ++-
.../db/commitlog/PeriodicCommitLogService.java | 6 +-
.../cassandra/db/commitlog/ReplayPosition.java | 5 +
.../db/compaction/CompactionManager.java | 9 +-
.../cassandra/db/compaction/CompactionTask.java | 14 +-
.../db/compaction/LazilyCompactedRow.java | 4 +-
.../db/composites/BoundedComposite.java | 19 +-
.../cassandra/db/composites/CellName.java | 6 +-
.../cassandra/db/composites/Composite.java | 6 +-
.../cassandra/db/composites/Composites.java | 13 +-
.../db/composites/CompoundComposite.java | 28 +-
.../db/composites/CompoundDenseCellName.java | 18 +-
.../db/composites/CompoundSparseCellName.java | 37 +-
.../db/composites/SimpleComposite.java | 17 +-
.../db/composites/SimpleDenseCellName.java | 17 +-
.../db/composites/SimpleSparseCellName.java | 26 +-
.../db/composites/SimpleSparseCellNameType.java | 2 +-
.../SimpleSparseInternedCellName.java | 58 +++
.../cassandra/db/context/CounterContext.java | 12 +-
.../apache/cassandra/db/context/IContext.java | 75 +++
.../apache/cassandra/db/filter/ColumnSlice.java | 19 +-
.../apache/cassandra/db/filter/QueryFilter.java | 2 +-
.../AbstractSimplePerColumnSecondaryIndex.java | 41 +-
.../db/index/PerColumnSecondaryIndex.java | 10 +-
.../db/index/PerRowSecondaryIndex.java | 5 +-
.../cassandra/db/index/SecondaryIndex.java | 5 +-
.../db/index/SecondaryIndexManager.java | 117 ++++-
.../db/index/composites/CompositesIndex.java | 23 +-
.../cassandra/db/index/keys/KeysSearcher.java | 14 +-
.../cassandra/dht/ByteOrderedPartitioner.java | 10 +
.../org/apache/cassandra/dht/IPartitioner.java | 7 +
.../apache/cassandra/dht/LocalPartitioner.java | 8 +
.../cassandra/dht/Murmur3Partitioner.java | 8 +
.../dht/OrderPreservingPartitioner.java | 8 +
.../apache/cassandra/dht/RandomPartitioner.java | 8 +
.../io/sstable/AbstractSSTableSimpleWriter.java | 2 +-
.../cassandra/io/sstable/IndexHelper.java | 12 +-
.../apache/cassandra/io/sstable/SSTable.java | 4 +-
.../io/sstable/metadata/MetadataCollector.java | 1 +
.../cassandra/io/util/SequentialWriter.java | 17 +-
.../cassandra/metrics/ColumnFamilyMetrics.java | 61 ++-
.../cassandra/metrics/CommitLogMetrics.java | 9 +
.../cassandra/service/CassandraDaemon.java | 5 -
.../org/apache/cassandra/utils/Allocator.java | 41 --
.../org/apache/cassandra/utils/FBUtilities.java | 12 +-
.../apache/cassandra/utils/HeapAllocator.java | 41 --
.../org/apache/cassandra/utils/ObjectSizes.java | 247 +++------
.../apache/cassandra/utils/SlabAllocator.java | 220 --------
.../org/apache/cassandra/utils/WaitQueue.java | 264 ----------
.../org/apache/cassandra/utils/btree/BTree.java | 48 +-
.../apache/cassandra/utils/btree/BTreeSet.java | 2 +-
.../apache/cassandra/utils/btree/Builder.java | 17 +-
.../cassandra/utils/btree/NodeBuilder.java | 55 +-
.../cassandra/utils/btree/ReplaceFunction.java | 17 -
.../cassandra/utils/btree/UpdateFunction.java | 30 ++
.../cassandra/utils/concurrent/OpOrder.java | 411 +++++++++++++++
.../cassandra/utils/concurrent/WaitQueue.java | 508 +++++++++++++++++++
.../utils/memory/AbstractAllocator.java | 62 +++
.../utils/memory/ContextAllocator.java | 59 +++
.../cassandra/utils/memory/HeapAllocator.java | 38 ++
.../apache/cassandra/utils/memory/HeapPool.java | 16 +
.../utils/memory/HeapPoolAllocator.java | 47 ++
.../utils/memory/HeapSlabAllocator.java | 204 ++++++++
.../cassandra/utils/memory/HeapSlabPool.java | 16 +
.../org/apache/cassandra/utils/memory/Pool.java | 140 +++++
.../cassandra/utils/memory/PoolAllocator.java | 175 +++++++
.../utils/memory/PoolCleanerThread.java | 55 ++
.../cassandra/concurrent/LongOpOrderTest.java | 223 ++++++++
.../cassandra/db/LongFlushMemtableTest.java | 72 +++
.../apache/cassandra/db/MeteredFlusherTest.java | 72 ---
.../apache/cassandra/utils/LongBTreeTest.java | 6 +-
.../cassandra/cache/CacheProviderTest.java | 2 +-
.../apache/cassandra/cache/ObjectSizeTest.java | 105 ----
.../cassandra/concurrent/WaitQueueTest.java | 2 +-
.../db/ArrayBackedSortedColumnsTest.java | 2 +-
.../apache/cassandra/db/ColumnFamilyTest.java | 2 +-
.../org/apache/cassandra/db/CommitLogTest.java | 6 +-
.../apache/cassandra/db/CounterCellTest.java | 10 +-
.../apache/cassandra/db/KeyCollisionTest.java | 6 +
.../apache/cassandra/db/RangeTombstoneTest.java | 16 +-
.../db/SecondaryIndexCellSizeTest.java | 31 +-
.../db/context/CounterContextTest.java | 21 +-
.../db/index/PerRowSecondaryIndexTest.java | 9 +-
.../streaming/StreamingTransferTest.java | 2 +-
128 files changed, 4112 insertions(+), 2373 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index de477aa..a033874 100644
--- a/build.xml
+++ b/build.xml
@@ -357,7 +357,7 @@
</dependency>
<dependency groupId="com.googlecode.json-simple" artifactId="json-simple" version="1.1"/>
<dependency groupId="com.github.stephenc.high-scale-lib" artifactId="high-scale-lib" version="1.1.2"/>
- <dependency groupId="com.github.stephenc" artifactId="jamm" version="0.2.5"/>
+ <dependency groupId="com.github.stephenc" artifactId="jamm" version="0.2.6"/>
<dependency groupId="com.thinkaurelius.thrift" artifactId="thrift-server" version="0.3.3">
<exclusion groupId="org.slf4j" artifactId="slf4j-log4j12"/>
</dependency>
@@ -656,7 +656,7 @@
<pathelement location="${test.conf}"/>
</classpath>
<jvmarg value="-Dstorage-config=${test.conf}"/>
- <jvmarg value="-javaagent:${basedir}/lib/jamm-0.2.5.jar" />
+ <jvmarg value="-javaagent:${basedir}/lib/jamm-0.2.6.jar" />
<jvmarg value="-ea"/>
</java>
</target>
@@ -1051,7 +1051,7 @@
<formatter type="brief" usefile="false"/>
<jvmarg value="-Dstorage-config=${test.conf}"/>
<jvmarg value="-Djava.awt.headless=true"/>
- <jvmarg value="-javaagent:${basedir}/lib/jamm-0.2.5.jar" />
+ <jvmarg value="-javaagent:${basedir}/lib/jamm-0.2.6.jar" />
<jvmarg value="-ea"/>
<jvmarg value="-Xss256k"/>
<optjvmargs/>
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/conf/cassandra-env.sh
----------------------------------------------------------------------
diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh
index 78a39f4..20f26da 100644
--- a/conf/cassandra-env.sh
+++ b/conf/cassandra-env.sh
@@ -165,7 +165,7 @@ JVM_OPTS="$JVM_OPTS -ea"
if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \
|| [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ]
then
- JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.5.jar"
+ JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar"
fi
# enable thread priorities, primarily so we can give periodic tasks
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index 06cb33f..8ddd5e0 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -280,6 +280,10 @@ concurrent_counter_writes: 32
# If omitted, Cassandra will set it to 1/4 of the heap.
# memtable_total_space_in_mb: 2048
+# Ratio of occupied non-flushing memtable size to total permitted size
+# that will trigger a flush of the largest memtable.
+memtable_cleanup_threshold: 0.4
+
# Total space to use for commitlogs. Since commitlog segments are
# mmapped, and hence use up address space, the default size is 32
# on 32-bit JVMs, and 1024 on 64-bit JVMs.
@@ -297,11 +301,6 @@ concurrent_counter_writes: 32
# By default this will be set to the amount of data directories defined.
#memtable_flush_writers: 1
-# the number of full memtables to allow pending flush, that is,
-# waiting for a writer thread. At a minimum, this should be set to
-# the maximum number of secondary indexes created on a single CF.
-memtable_flush_queue_size: 4
-
# A fixed memory pool size in MB for for SSTable index summaries. If left
# empty, this will default to 5% of the heap size. If the memory usage of
# all index summaries exceeds this limit, SSTables with low read rates will
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/lib/jamm-0.2.5.jar
----------------------------------------------------------------------
diff --git a/lib/jamm-0.2.5.jar b/lib/jamm-0.2.5.jar
deleted file mode 100644
index ef8750d..0000000
Binary files a/lib/jamm-0.2.5.jar and /dev/null differ
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/lib/jamm-0.2.6.jar
----------------------------------------------------------------------
diff --git a/lib/jamm-0.2.6.jar b/lib/jamm-0.2.6.jar
new file mode 100644
index 0000000..04e5c2e
Binary files /dev/null and b/lib/jamm-0.2.6.jar differ
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/lib/licenses/jamm-0.2.5.txt
----------------------------------------------------------------------
diff --git a/lib/licenses/jamm-0.2.5.txt b/lib/licenses/jamm-0.2.5.txt
deleted file mode 100644
index d645695..0000000
--- a/lib/licenses/jamm-0.2.5.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed 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.
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/lib/licenses/jamm-0.2.6.txt
----------------------------------------------------------------------
diff --git a/lib/licenses/jamm-0.2.6.txt b/lib/licenses/jamm-0.2.6.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/lib/licenses/jamm-0.2.6.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
index f1e0466..8182447 100644
--- a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
+++ b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
@@ -54,7 +54,7 @@ public class ConcurrentLinkedHashCache<K extends IMeasurableMemory, V extends IM
{
public int weightOf(K key, V value)
{
- long size = key.memorySize() + value.memorySize();
+ long size = key.unsharedHeapSize() + value.unsharedHeapSize();
assert size <= Integer.MAX_VALUE : "Serialized size cannot be more than 2GB/Integer.MAX_VALUE";
return (int) size;
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/cache/CounterCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/CounterCacheKey.java b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
index acbe323..b6920cf 100644
--- a/src/java/org/apache/cassandra/cache/CounterCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
@@ -22,11 +22,17 @@ import java.util.Arrays;
import java.util.UUID;
import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.cql3.ColumnIdentifier;
import org.apache.cassandra.db.composites.CellName;
+import org.apache.cassandra.db.composites.CellNames;
+import org.apache.cassandra.db.composites.SimpleSparseCellName;
import org.apache.cassandra.utils.*;
public class CounterCacheKey implements CacheKey
{
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new CounterCacheKey(null, ByteBufferUtil.EMPTY_BYTE_BUFFER, CellNames.simpleDense(ByteBuffer.allocate(1))))
+ + ObjectSizes.measure(new UUID(0, 0));
+
public final UUID cfId;
public final byte[] partitionKey;
public final byte[] cellName;
@@ -49,11 +55,11 @@ public class CounterCacheKey implements CacheKey
return new PathInfo(cf.left, cf.right, cfId);
}
- public long memorySize()
+ public long unsharedHeapSize()
{
- return ObjectSizes.getFieldSize(3 * ObjectSizes.getReferenceSize())
- + ObjectSizes.getArraySize(partitionKey)
- + ObjectSizes.getArraySize(cellName);
+ return EMPTY_SIZE
+ + ObjectSizes.sizeOfArray(partitionKey)
+ + ObjectSizes.sizeOfArray(cellName);
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/cache/IMeasurableMemory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/IMeasurableMemory.java b/src/java/org/apache/cassandra/cache/IMeasurableMemory.java
index 16ca7c2..149bff6 100644
--- a/src/java/org/apache/cassandra/cache/IMeasurableMemory.java
+++ b/src/java/org/apache/cassandra/cache/IMeasurableMemory.java
@@ -23,5 +23,10 @@ package org.apache.cassandra.cache;
public interface IMeasurableMemory
{
- public long memorySize();
+ /**
+ * @return the amount of on-heap memory retained by the object that might be reclaimed if the object were reclaimed,
+ * i.e. it should try to exclude globally cached data where possible, or counting portions of arrays that are
+ * referenced by the object but used by other objects only (e.g. slabbed byte-buffers), etc.
+ */
+ public long unsharedHeapSize();
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/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 1133d94..5624133 100644
--- a/src/java/org/apache/cassandra/cache/KeyCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/KeyCacheKey.java
@@ -30,6 +30,8 @@ public class KeyCacheKey implements CacheKey
public final UUID cfId;
public final Descriptor desc;
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new KeyCacheKey(null, null, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+
// keeping an array instead of a ByteBuffer lowers the overhead of the key cache working set,
// without extra copies on lookup since client-provided key ByteBuffers will be array-backed already
public final byte[] key;
@@ -52,15 +54,9 @@ public class KeyCacheKey implements CacheKey
return String.format("KeyCacheKey(%s, %s)", desc, ByteBufferUtil.bytesToHex(ByteBuffer.wrap(key)));
}
- public long memorySize()
+ public long unsharedHeapSize()
{
- return ObjectSizes.getFieldSize(// cfId
- ObjectSizes.getReferenceSize() +
- // desc
- ObjectSizes.getReferenceSize() +
- // key
- ObjectSizes.getReferenceSize())
- + ObjectSizes.getArraySize(key);
+ return EMPTY_SIZE + ObjectSizes.sizeOfArray(key);
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/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 fc4a6e0..bbd8591 100644
--- a/src/java/org/apache/cassandra/cache/RowCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/RowCacheKey.java
@@ -33,6 +33,8 @@ public class RowCacheKey implements CacheKey, Comparable<RowCacheKey>
public final UUID cfId;
public final byte[] key;
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new RowCacheKey(null, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+
public RowCacheKey(UUID cfId, DecoratedKey key)
{
this(cfId, key.key);
@@ -51,13 +53,9 @@ public class RowCacheKey implements CacheKey, Comparable<RowCacheKey>
return new PathInfo(cf.left, cf.right, cfId);
}
- public long memorySize()
+ public long unsharedHeapSize()
{
- return ObjectSizes.getFieldSize(// cfId
- ObjectSizes.getReferenceSize() +
- // key
- ObjectSizes.getReferenceSize())
- + ObjectSizes.getArraySize(key);
+ return EMPTY_SIZE + ObjectSizes.sizeOfArray(key);
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/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 9a014dc..01e90c0 100644
--- a/src/java/org/apache/cassandra/cache/RowCacheSentinel.java
+++ b/src/java/org/apache/cassandra/cache/RowCacheSentinel.java
@@ -57,10 +57,4 @@ public class RowCacheSentinel implements IRowCacheEntry
{
return Objects.hashCode(sentinelId);
}
-
- public long memorySize()
- {
- // Only long reference.
- return ObjectSizes.getFieldSize(TypeSizes.NATIVE.sizeof(sentinelId));
- }
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java
index 5a944a2..2eb9b18 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -79,6 +79,7 @@ public class Config
public Integer memtable_flush_writers = null; // will get set to the length of data dirs in DatabaseDescriptor
public Integer memtable_total_space_in_mb;
+ public float memtable_cleanup_threshold = 0.4f;
public Integer storage_port = 7000;
public Integer ssl_storage_port = 7001;
@@ -160,7 +161,6 @@ public class Config
public boolean compaction_preheat_key_cache = true;
public volatile boolean incremental_backups = false;
- public int memtable_flush_queue_size = 4;
public boolean trickle_fsync = false;
public int trickle_fsync_interval_in_kb = 10240;
@@ -187,7 +187,7 @@ public class Config
public boolean inter_dc_tcp_nodelay = true;
- public String memtable_allocator = "SlabAllocator";
+ public String memtable_allocator = "HeapSlabPool";
private static boolean outboundBindAny = false;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index eca8881..2793237 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -49,9 +49,9 @@ import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.scheduler.IRequestScheduler;
import org.apache.cassandra.scheduler.NoScheduler;
import org.apache.cassandra.service.CacheService;
-import org.apache.cassandra.utils.Allocator;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.memory.Pool;
public class DatabaseDescriptor
{
@@ -93,7 +93,7 @@ public class DatabaseDescriptor
private static String localDC;
private static Comparator<InetAddress> localComparator;
- private static Class<? extends Allocator> memtableAllocator;
+ private static Class<? extends Pool> memtablePool;
static
{
@@ -261,8 +261,8 @@ public class DatabaseDescriptor
if (conf.memtable_total_space_in_mb == null)
conf.memtable_total_space_in_mb = (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576));
if (conf.memtable_total_space_in_mb <= 0)
- throw new ConfigurationException("memtable_total_space_in_mb must be positive");
- logger.info("Global memtable threshold is enabled at {}MB", conf.memtable_total_space_in_mb);
+ throw new ConfigurationException("memtable_heap_space_in_mb must be positive");
+ logger.info("Global memtable heap threshold is enabled at {}MB", conf.memtable_total_space_in_mb);
/* Memtable flush writer threads */
if (conf.memtable_flush_writers != null && conf.memtable_flush_writers < 1)
@@ -482,10 +482,10 @@ public class DatabaseDescriptor
conf.server_encryption_options = conf.encryption_options;
}
- String allocatorClass = conf.memtable_allocator;
- if (!allocatorClass.contains("."))
- allocatorClass = "org.apache.cassandra.utils." + allocatorClass;
- memtableAllocator = FBUtilities.classForName(allocatorClass, "allocator");
+ String allocatorPoolClass = conf.memtable_allocator;
+ if (!allocatorPoolClass.contains("."))
+ allocatorPoolClass = "org.apache.cassandra.utils.memory." + allocatorPoolClass;
+ memtablePool = FBUtilities.classForName(allocatorPoolClass, "allocator pool");
// Hardcoded system keyspaces
List<KSMetaData> systemKeyspaces = Arrays.asList(KSMetaData.systemKeyspace());
@@ -1235,23 +1235,11 @@ public class DatabaseDescriptor
conf.incremental_backups = value;
}
- public static int getFlushQueueSize()
- {
- return conf.memtable_flush_queue_size;
- }
-
public static int getFileCacheSizeInMB()
{
return conf.file_cache_size_in_mb;
}
- public static int getTotalMemtableSpaceInMB()
- {
- // should only be called if estimatesRealMemtableSize() is true
- assert conf.memtable_total_space_in_mb > 0;
- return conf.memtable_total_space_in_mb;
- }
-
public static long getTotalCommitlogSpaceInMB()
{
return conf.commitlog_total_space_in_mb;
@@ -1382,15 +1370,17 @@ public class DatabaseDescriptor
return conf.preheat_kernel_page_cache;
}
- public static Allocator getMemtableAllocator()
+ public static Pool getMemtableAllocatorPool()
{
try
{
- return memtableAllocator.newInstance();
+ return memtablePool
+ .getConstructor(long.class, float.class, Runnable.class)
+ .newInstance(conf.memtable_total_space_in_mb << 20, conf.memtable_cleanup_threshold, new ColumnFamilyStore.FlushLargestColumnFamily());
}
- catch (InstantiationException | IllegalAccessException e)
+ catch (Exception e)
{
- throw new RuntimeException(e);
+ throw new AssertionError(e);
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
index db203e6..b10f3be 100644
--- a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
+++ b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
@@ -22,19 +22,22 @@ import java.nio.ByteBuffer;
import org.apache.cassandra.cache.IMeasurableMemory;
import org.apache.cassandra.cql3.statements.Selectable;
-import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.memory.AbstractAllocator;
/**
* Represents an identifer for a CQL column definition.
+ * TODO : should support light-weight mode without text representation for when not interned
*/
public class ColumnIdentifier implements Selectable, Comparable<ColumnIdentifier>, IMeasurableMemory
{
public final ByteBuffer bytes;
private final String text;
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new ColumnIdentifier("", true));
+
public ColumnIdentifier(String rawText, boolean keepCase)
{
this.text = keepCase ? rawText : rawText.toLowerCase(Locale.US);
@@ -47,6 +50,12 @@ public class ColumnIdentifier implements Selectable, Comparable<ColumnIdentifier
this.text = type.getString(bytes);
}
+ private ColumnIdentifier(ByteBuffer bytes, String text)
+ {
+ this.bytes = bytes;
+ this.text = text;
+ }
+
@Override
public final int hashCode()
{
@@ -73,11 +82,18 @@ public class ColumnIdentifier implements Selectable, Comparable<ColumnIdentifier
return text;
}
- public long memorySize()
+ public long unsharedHeapSize()
+ {
+ return EMPTY_SIZE
+ + ObjectSizes.sizeOnHeapOf(bytes)
+ + ObjectSizes.sizeOf(text);
+ }
+
+ public long excessHeapSizeExcludingData()
{
- return ObjectSizes.getFieldSize(2 * ObjectSizes.getReferenceSize())
- + ObjectSizes.getSize(bytes)
- + TypeSizes.NATIVE.sizeof(text);
+ return EMPTY_SIZE
+ + ObjectSizes.sizeOnHeapExcludingData(bytes)
+ + ObjectSizes.sizeOf(text);
}
public int compareTo(ColumnIdentifier other)
@@ -87,4 +103,10 @@ public class ColumnIdentifier implements Selectable, Comparable<ColumnIdentifier
return bytes.compareTo(other.bytes);
}
+
+ public ColumnIdentifier clone(AbstractAllocator allocator)
+ {
+ return new ColumnIdentifier(allocator.clone(bytes), text);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/cql3/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index 0c0167e..7035f63 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -49,7 +49,7 @@ public class QueryProcessor
public static final SemanticVersion CQL_VERSION = new SemanticVersion("3.1.4");
private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class);
- private static final MemoryMeter meter = new MemoryMeter();
+ private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_BEST);
private static final long MAX_CACHE_PREPARED_MEMORY = Runtime.getRuntime().maxMemory() / 256;
private static final int MAX_CACHE_PREPARED_COUNT = 10000;
@@ -76,28 +76,14 @@ public class QueryProcessor
static
{
- if (MemoryMeter.isInitialized())
- {
- preparedStatements = new ConcurrentLinkedHashMap.Builder<MD5Digest, CQLStatement>()
- .maximumWeightedCapacity(MAX_CACHE_PREPARED_MEMORY)
- .weigher(cqlMemoryUsageWeigher)
- .build();
- thriftPreparedStatements = new ConcurrentLinkedHashMap.Builder<Integer, CQLStatement>()
- .maximumWeightedCapacity(MAX_CACHE_PREPARED_MEMORY)
- .weigher(thriftMemoryUsageWeigher)
- .build();
- }
- else
- {
- logger.error("Unable to initialize MemoryMeter (jamm not specified as javaagent). This means "
- + "Cassandra will be unable to measure object sizes accurately and may consequently OOM.");
- preparedStatements = new ConcurrentLinkedHashMap.Builder<MD5Digest, CQLStatement>()
- .maximumWeightedCapacity(MAX_CACHE_PREPARED_COUNT)
- .build();
- thriftPreparedStatements = new ConcurrentLinkedHashMap.Builder<Integer, CQLStatement>()
- .maximumWeightedCapacity(MAX_CACHE_PREPARED_COUNT)
- .build();
- }
+ preparedStatements = new ConcurrentLinkedHashMap.Builder<MD5Digest, CQLStatement>()
+ .maximumWeightedCapacity(MAX_CACHE_PREPARED_MEMORY)
+ .weigher(cqlMemoryUsageWeigher)
+ .build();
+ thriftPreparedStatements = new ConcurrentLinkedHashMap.Builder<Integer, CQLStatement>()
+ .maximumWeightedCapacity(MAX_CACHE_PREPARED_MEMORY)
+ .weigher(thriftMemoryUsageWeigher)
+ .build();
}
private static final List<PreExecutionHook> preExecutionHooks = new CopyOnWriteArrayList<>();
@@ -449,9 +435,6 @@ public class QueryProcessor
private static long measure(Object key)
{
- if (!MemoryMeter.isInitialized())
- return 1;
-
return key instanceof MeasurableForPreparedCache
? ((MeasurableForPreparedCache)key).measureForPreparedCache(meter)
: meter.measureDeep(key);
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/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 dbebf5e..7bcbe25 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -29,7 +29,7 @@ import org.apache.cassandra.db.composites.CellName;
import org.apache.cassandra.db.composites.CellNameType;
import org.apache.cassandra.db.composites.Composite;
import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.Allocator;
+import org.apache.cassandra.utils.memory.AbstractAllocator;
/**
* A ColumnFamily backed by an ArrayList.
@@ -101,7 +101,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
* without knowing about (we can revisit that decision later if we have
* use cases where most insert are in sorted order but a few are not).
*/
- public void addColumn(Cell cell, Allocator allocator)
+ public void addColumn(Cell cell, AbstractAllocator allocator)
{
if (cells.isEmpty())
{
@@ -131,7 +131,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
if (pos >= 0)
resolveAgainst(pos, cell, allocator);
else
- cells.add(-pos-1, cell);
+ cells.add(-pos - 1, cell);
}
}
@@ -139,7 +139,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
* Resolve against element at position i.
* Assume that i is a valid position.
*/
- private void resolveAgainst(int i, Cell cell, Allocator allocator)
+ private void resolveAgainst(int i, Cell cell, AbstractAllocator allocator)
{
Cell oldCell = cells.get(i);
@@ -184,7 +184,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
return -mid - (result < 0 ? 1 : 2);
}
- public void addAll(ColumnFamily cm, Allocator allocator, Function<Cell, Cell> transformation)
+ public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
{
delete(cm.deletionInfo());
if (cm.getColumnCount() == 0)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
index c475a0e..238bb7c 100644
--- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
+++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
@@ -18,25 +18,28 @@
package org.apache.cassandra.db;
import java.util.AbstractCollection;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
+import java.util.List;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import com.google.common.base.Function;
import com.google.common.base.Functions;
-import com.google.common.collect.Iterators;
+import com.google.common.collect.*;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.db.composites.CellName;
import org.apache.cassandra.db.composites.CellNameType;
import org.apache.cassandra.db.filter.ColumnSlice;
import org.apache.cassandra.db.index.SecondaryIndexManager;
-import org.apache.cassandra.utils.Allocator;
+import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.btree.BTree;
import org.apache.cassandra.utils.btree.BTreeSet;
-import org.apache.cassandra.utils.btree.ReplaceFunction;
+import org.apache.cassandra.utils.btree.UpdateFunction;
+import org.apache.cassandra.utils.memory.AbstractAllocator;
import static org.apache.cassandra.db.index.SecondaryIndexManager.Updater;
@@ -51,6 +54,9 @@ import static org.apache.cassandra.db.index.SecondaryIndexManager.Updater;
*/
public class AtomicBTreeColumns extends ColumnFamily
{
+ static final long HEAP_SIZE = ObjectSizes.measure(new AtomicBTreeColumns(CFMetaData.IndexCf, null))
+ + ObjectSizes.measure(new Holder(null, null));
+
private static final Function<Cell, CellName> NAME = new Function<Cell, CellName>()
{
public CellName apply(Cell column)
@@ -152,52 +158,58 @@ public class AtomicBTreeColumns extends ColumnFamily
}
}
- public void addColumn(Cell column, Allocator allocator)
- {
- while (true)
- {
- Holder current = ref;
- Holder update = ref.update(this, current.deletionInfo, metadata.comparator.columnComparator(), Arrays.asList(column), null);
- if (refUpdater.compareAndSet(this, current, update))
- return;
- }
- }
-
- public void addAll(ColumnFamily cm, Allocator allocator, Function<Cell, Cell> transformation)
+ public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
{
- addAllWithSizeDelta(cm, allocator, transformation, SecondaryIndexManager.nullUpdater);
+ addAllWithSizeDelta(cm, allocator, transformation, SecondaryIndexManager.nullUpdater, new Delta());
}
// the function we provide to the btree utilities to perform any column replacements
- private static final class ColumnUpdater implements ReplaceFunction<Cell>
+ private static final class ColumnUpdater implements UpdateFunction<Cell>
{
- final Allocator allocator;
+ final AtomicBTreeColumns updating;
+ final Holder ref;
+ final AbstractAllocator allocator;
final Function<Cell, Cell> transform;
final Updater indexer;
- long delta;
+ final Delta delta;
- private ColumnUpdater(Allocator allocator, Function<Cell, Cell> transform, Updater indexer)
+ private ColumnUpdater(AtomicBTreeColumns updating, Holder ref, AbstractAllocator allocator, Function<Cell, Cell> transform, Updater indexer, Delta delta)
{
+ this.updating = updating;
+ this.ref = ref;
this.allocator = allocator;
this.transform = transform;
this.indexer = indexer;
+ this.delta = delta;
}
public Cell apply(Cell inserted)
{
indexer.insert(inserted);
- delta += inserted.dataSize();
+ delta.insert(inserted);
return transform.apply(inserted);
}
- public Cell apply(Cell replaced, Cell update)
+ public Cell apply(Cell existing, Cell update)
{
- Cell reconciled = update.reconcile(replaced, allocator);
- indexer.update(replaced, reconciled);
- delta += reconciled.dataSize() - replaced.dataSize();
-
+ Cell reconciled = update.reconcile(existing, allocator);
+ indexer.update(existing, reconciled);
+ if (existing != reconciled)
+ delta.swap(existing, reconciled);
+ else
+ delta.abort(update);
return transform.apply(reconciled);
}
+
+ public boolean abortEarly()
+ {
+ return updating.ref != ref;
+ }
+
+ public void allocated(long heapSize)
+ {
+ delta.addHeapSize(heapSize);
+ }
}
private static Collection<Cell> transform(Comparator<Cell> cmp, ColumnFamily cf, Function<Cell, Cell> transformation, boolean sort)
@@ -215,11 +227,11 @@ public class AtomicBTreeColumns extends ColumnFamily
}
/**
- * This is only called by Memtable.resolve, so only AtomicSortedColumns needs to implement it.
+ * This is only called by Memtable.resolve, so only AtomicBTreeColumns needs to implement it.
*
* @return the difference in size seen after merging the given columns
*/
- public long addAllWithSizeDelta(final ColumnFamily cm, Allocator allocator, Function<Cell, Cell> transformation, Updater indexer)
+ public Delta addAllWithSizeDelta(final ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation, Updater indexer, Delta delta)
{
boolean transformed = false;
Collection<Cell> insert;
@@ -248,11 +260,14 @@ public class AtomicBTreeColumns extends ColumnFamily
}
}
}
+
+ delta.reset();
deletionInfo = current.deletionInfo.copy().add(deletionInfo);
+ delta.addHeapSize(deletionInfo.unsharedHeapSize() - current.deletionInfo.unsharedHeapSize());
+ ColumnUpdater updater = new ColumnUpdater(this, current, allocator, transformation, indexer, delta);
+ Object[] tree = BTree.update(current.tree, metadata.comparator.columnComparator(), insert, true, updater);
- ColumnUpdater updater = new ColumnUpdater(allocator, transformation, indexer);
- Holder h = current.update(this, deletionInfo, metadata.comparator.columnComparator(), insert, updater);
- if (h != null && refUpdater.compareAndSet(this, current, h))
+ if (tree != null && refUpdater.compareAndSet(this, current, new Holder(tree, deletionInfo)))
{
indexer.updateRowLevelIndexes();
return updater.delta;
@@ -268,25 +283,20 @@ public class AtomicBTreeColumns extends ColumnFamily
}
- public boolean replace(Cell oldColumn, Cell newColumn)
+ // no particular reason not to implement these next methods, we just haven't needed them yet
+
+ public void addColumn(Cell column, AbstractAllocator allocator)
{
- if (!oldColumn.name().equals(newColumn.name()))
- throw new IllegalArgumentException();
+ throw new UnsupportedOperationException();
+ }
- while (true)
- {
- Holder current = ref;
- Holder modified = current.update(this, current.deletionInfo, metadata.comparator.columnComparator(), Arrays.asList(newColumn), null);
- if (modified == current)
- return false;
- if (refUpdater.compareAndSet(this, current, modified))
- return true;
- }
+ public boolean replace(Cell oldColumn, Cell newColumn)
+ {
+ throw new UnsupportedOperationException();
}
public void clear()
{
- // no particular reason not to implement this, we just haven't needed it yet
throw new UnsupportedOperationException();
}
@@ -377,35 +387,71 @@ public class AtomicBTreeColumns extends ColumnFamily
{
return new Holder(this.tree, info);
}
+ }
+
+ // TODO: create a stack-allocation-friendly list to help optimise garbage for updates to rows with few columns
+
+ /**
+ * tracks the size changes made while merging a new group of cells in
+ */
+ public static final class Delta
+ {
+ private long dataSize;
+ private long heapSize;
+
+ // we track the discarded cells (cells that were in the btree, but replaced by new ones)
+ // separately from aborted ones (were part of an update but older than existing cells)
+ // since we need to reset the former when we race on the btree update, but not the latter
+ private List<Cell> discarded = new ArrayList<>();
+ private List<Cell> aborted;
- Holder update(AtomicBTreeColumns container, DeletionInfo deletionInfo, Comparator<Cell> cmp, Collection<Cell> update, ReplaceFunction<Cell> replaceF)
+ protected void reset()
{
- Object[] r = BTree.update(tree, cmp, update, true, replaceF, new TerminateEarly(container, this));
- // result can be null if terminate early kicks in, in which case we need to propagate the early failure so we can retry
- if (r == null)
- return null;
- return new Holder(r, deletionInfo);
+ this.dataSize = 0;
+ this.heapSize = 0;
+ discarded.clear();
}
- }
- // a function provided to the btree functions that aborts the modification
- // if we already know the final cas will fail
- private static final class TerminateEarly implements Function<Object, Boolean>
- {
- final AtomicBTreeColumns columns;
- final Holder ref;
+ protected void addHeapSize(long heapSize)
+ {
+ this.heapSize += heapSize;
+ }
- private TerminateEarly(AtomicBTreeColumns columns, Holder ref)
+ protected void swap(Cell old, Cell updated)
{
- this.columns = columns;
- this.ref = ref;
+ dataSize += updated.dataSize() - old.dataSize();
+ heapSize += updated.excessHeapSizeExcludingData() - old.excessHeapSizeExcludingData();
+ discarded.add(old);
+ }
+
+ protected void insert(Cell insert)
+ {
+ this.dataSize += insert.dataSize();
+ this.heapSize += insert.excessHeapSizeExcludingData();
+ }
+
+ private void abort(Cell neverUsed)
+ {
+ if (aborted == null)
+ aborted = new ArrayList<>();
+ aborted.add(neverUsed);
+ }
+
+ public long dataSize()
+ {
+ return dataSize;
+ }
+
+ public long excessHeapSize()
+ {
+ return heapSize;
}
- public Boolean apply(Object o)
+ public Iterable<Cell> reclaimed()
{
- if (ref != columns.ref)
- return Boolean.TRUE;
- return Boolean.FALSE;
+ if (aborted == null)
+ return discarded;
+ return Iterables.concat(discarded, aborted);
}
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/db/Cell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Cell.java b/src/java/org/apache/cassandra/db/Cell.java
index d3cf085..44656ea 100644
--- a/src/java/org/apache/cassandra/db/Cell.java
+++ b/src/java/org/apache/cassandra/db/Cell.java
@@ -29,14 +29,16 @@ import com.google.common.collect.AbstractIterator;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.db.composites.CellName;
import org.apache.cassandra.db.composites.CellNameType;
+import org.apache.cassandra.db.composites.CellNames;
import org.apache.cassandra.db.marshal.*;
import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.utils.Allocator;
+import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.memory.AbstractAllocator;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.HeapAllocator;
+import org.apache.cassandra.utils.memory.HeapAllocator;
/**
* Cell is immutable, which prevents all kinds of confusion in a multithreaded environment.
@@ -45,6 +47,8 @@ public class Cell implements OnDiskAtom
{
public static final int MAX_NAME_LENGTH = FBUtilities.MAX_UNSIGNED_SHORT;
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new Cell(CellNames.simpleDense(ByteBuffer.allocate(1))));
+
/**
* For 2.0-formatted sstables (where column count is not stored), @param count should be Integer.MAX_VALUE,
* and we will look for the end-of-row column name marker instead of relying on that.
@@ -158,7 +162,14 @@ public class Cell implements OnDiskAtom
public int dataSize()
{
- return name().dataSize() + value.remaining() + TypeSizes.NATIVE.sizeof(timestamp);
+ return name.dataSize() + value.remaining() + TypeSizes.NATIVE.sizeof(timestamp);
+ }
+
+ // returns the size of the Cell and all references on the heap, excluding any costs associated with byte arrays
+ // that would be allocated by a localCopy, as these will be accounted for by the allocator
+ public long excessHeapSizeExcludingData()
+ {
+ return EMPTY_SIZE + name.excessHeapSizeExcludingData() + ObjectSizes.sizeOnHeapExcludingData(value);
}
public int serializedSize(CellNameType type, TypeSizes typeSizes)
@@ -215,7 +226,7 @@ public class Cell implements OnDiskAtom
return reconcile(cell, HeapAllocator.instance);
}
- public Cell reconcile(Cell cell, Allocator allocator)
+ public Cell reconcile(Cell cell, AbstractAllocator allocator)
{
// tombstones take precedence. (if both are tombstones, then it doesn't matter which one we use.)
if (isMarkedForDelete(System.currentTimeMillis()))
@@ -252,7 +263,7 @@ public class Cell implements OnDiskAtom
return result;
}
- public Cell localCopy(ColumnFamilyStore cfs, Allocator allocator)
+ public Cell localCopy(ColumnFamilyStore cfs, AbstractAllocator allocator)
{
return new Cell(name.copy(allocator), allocator.clone(value), timestamp);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/db/ClockAndCount.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ClockAndCount.java b/src/java/org/apache/cassandra/db/ClockAndCount.java
index 1678c8c..db6c705 100644
--- a/src/java/org/apache/cassandra/db/ClockAndCount.java
+++ b/src/java/org/apache/cassandra/db/ClockAndCount.java
@@ -24,6 +24,9 @@ import org.apache.cassandra.utils.ObjectSizes;
public class ClockAndCount implements IMeasurableMemory
{
+
+ private static final long EMPTY_SIZE = ObjectSizes.measure(new ClockAndCount(0, 0));
+
public static ClockAndCount BLANK = ClockAndCount.create(0L, 0L);
public final long clock;
@@ -40,10 +43,9 @@ public class ClockAndCount implements IMeasurableMemory
return new ClockAndCount(clock, count);
}
- public long memorySize()
+ public long unsharedHeapSize()
{
- return ObjectSizes.getFieldSize(TypeSizes.NATIVE.sizeof(clock))
- + ObjectSizes.getFieldSize(TypeSizes.NATIVE.sizeof(count));
+ return EMPTY_SIZE;
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/db/CollationController.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java
index 1f164a9..0ce2654 100644
--- a/src/java/org/apache/cassandra/db/CollationController.java
+++ b/src/java/org/apache/cassandra/db/CollationController.java
@@ -30,7 +30,7 @@ import org.apache.cassandra.db.marshal.CounterColumnType;
import org.apache.cassandra.io.sstable.SSTableReader;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.HeapAllocator;
+import org.apache.cassandra.utils.memory.HeapAllocator;
public class CollationController
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b54b8ac/src/java/org/apache/cassandra/db/ColumnFamily.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java
index 9ce6b0c..9d2856d 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamily.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamily.java
@@ -31,6 +31,9 @@ import java.util.UUID;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableMap;
+
+import org.apache.cassandra.utils.memory.AbstractAllocator;
+import org.apache.cassandra.utils.memory.HeapAllocator;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.cassandra.cache.IRowCacheEntry;
@@ -198,7 +201,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
* If a cell with the same name is already present in the map, it will
* be replaced by the newly added cell.
*/
- public abstract void addColumn(Cell cell, Allocator allocator);
+ public abstract void addColumn(Cell cell, AbstractAllocator allocator);
/**
* Adds all the columns of a given column map to this column map.
@@ -209,7 +212,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
* </code>
* but is potentially faster.
*/
- public abstract void addAll(ColumnFamily cm, Allocator allocator, Function<Cell, Cell> transformation);
+ public abstract void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation);
/**
* Replace oldCell if present by newCell.
@@ -282,7 +285,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
delete(columns.deletionInfo());
}
- public void addAll(ColumnFamily cf, Allocator allocator)
+ public void addAll(ColumnFamily cf, AbstractAllocator allocator)
{
addAll(cf, allocator, Functions.<Cell>identity());
}
@@ -404,7 +407,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
resolve(cf, HeapAllocator.instance);
}
- public void resolve(ColumnFamily cf, Allocator allocator)
+ public void resolve(ColumnFamily cf, AbstractAllocator allocator)
{
// Row _does_ allow null CF objects :( seems a necessary evil for efficiency
if (cf == null)