Repository: cassandra Updated Branches: refs/heads/trunk 59949ac38 -> eb5a59a31
Cleanup recycled BTree references, trim large recycled buffers Patch by Alex Petrov; reviewed by Jake Luciani for 11838-trunk Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/eb5a59a3 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/eb5a59a3 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/eb5a59a3 Branch: refs/heads/trunk Commit: eb5a59a311a14cc0a3c37a13d10abc8c5a0f6d1b Parents: 59949ac Author: Alex Petrov <oleksandr.pet...@gmail.com> Authored: Mon May 30 09:09:41 2016 +0200 Committer: T Jake Luciani <j...@apache.org> Committed: Wed Jun 1 16:24:07 2016 -0400 ---------------------------------------------------------------------- .../cassandra/io/util/DataOutputBuffer.java | 18 +++++++++++++++--- .../org/apache/cassandra/utils/btree/BTree.java | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/eb5a59a3/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java index 8dbad8c..f4f50b1 100644 --- a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java +++ b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java @@ -40,6 +40,13 @@ public class DataOutputBuffer extends BufferedDataOutputStreamPlus */ private static final long DOUBLING_THRESHOLD = Long.getLong(Config.PROPERTY_PREFIX + "DOB_DOUBLING_THRESHOLD_MB", 64); + /* + * Only recycle OutputBuffers up to 1Mb. Larger buffers will be trimmed back to this size. + */ + private static final int MAX_RECYCLE_BUFFER_SIZE = 1024 * 1024; + + private static final int DEFAULT_INITIAL_BUFFER_SIZE = 128; + public static final Recycler<DataOutputBuffer> RECYCLER = new Recycler<DataOutputBuffer>() { protected DataOutputBuffer newObject(Handle handle) @@ -52,12 +59,12 @@ public class DataOutputBuffer extends BufferedDataOutputStreamPlus private DataOutputBuffer(Recycler.Handle handle) { - this(128, handle); + this(DEFAULT_INITIAL_BUFFER_SIZE, handle); } public DataOutputBuffer() { - this(128); + this(DEFAULT_INITIAL_BUFFER_SIZE); } public DataOutputBuffer(int size) @@ -79,8 +86,13 @@ public class DataOutputBuffer extends BufferedDataOutputStreamPlus public void recycle() { assert handle != null; - buffer.rewind(); + // Avoid throwing away instances that are too large, trim large buffers to default size instead. + // See CASSANDRA-11838 for details. + if (buffer().capacity() > MAX_RECYCLE_BUFFER_SIZE) + buffer = ByteBuffer.allocate(DEFAULT_INITIAL_BUFFER_SIZE); + + buffer.rewind(); RECYCLER.recycle(this, handle); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/eb5a59a3/src/java/org/apache/cassandra/utils/btree/BTree.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/btree/BTree.java b/src/java/org/apache/cassandra/utils/btree/BTree.java index 4f21d26..5665869 100644 --- a/src/java/org/apache/cassandra/utils/btree/BTree.java +++ b/src/java/org/apache/cassandra/utils/btree/BTree.java @@ -838,6 +838,7 @@ public class BTree { this.comparator = comparator; quickResolver = null; + Arrays.fill(values, 0, count, null); count = 0; detected = true; auto = true;