You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2018/11/30 13:47:30 UTC
cassandra git commit: In BufferPool,
make allocating thread receive a Chunk.
Repository: cassandra
Updated Branches:
refs/heads/trunk 14bbab642 -> d8164c643
In BufferPool, make allocating thread receive a Chunk.
Prevents a condition where the thread allocating the macro chunk
could have all of the chunks taken from the queue before it
is able to use one.
patch by Jon Meredith; reviewed by Benedict for CASSANDRA-14832
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d8164c64
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d8164c64
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d8164c64
Branch: refs/heads/trunk
Commit: d8164c643395e3b6579a2fe6ce6ff0423df2f520
Parents: 14bbab6
Author: Jon Meredith <jm...@gmail.com>
Authored: Thu Oct 18 09:56:46 2018 -0600
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Fri Nov 30 12:35:50 2018 +0000
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../cassandra/utils/memory/BufferPool.java | 33 +++++++++++---------
2 files changed, 19 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8164c64/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 6d04416..f145a06 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0
+ * BufferPool: allocating thread for new chunks should acquire directly (CASSANDRA-14832)
* Send correct messaging version in internode messaging handshake's third message (CASSANDRA-14896)
* Make Read and Write Latency columns consistent for proxyhistograms and tablehistograms (CASSANDRA-11939)
* Make protocol checksum type option case insensitive (CASSANDRA-14716)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8164c64/src/java/org/apache/cassandra/utils/memory/BufferPool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/memory/BufferPool.java b/src/java/org/apache/cassandra/utils/memory/BufferPool.java
index c8ad078..a67f520 100644
--- a/src/java/org/apache/cassandra/utils/memory/BufferPool.java
+++ b/src/java/org/apache/cassandra/utils/memory/BufferPool.java
@@ -241,23 +241,23 @@ public class BufferPool
/** Return a chunk, the caller will take owership of the parent chunk. */
public Chunk get()
{
- while (true)
- {
- Chunk chunk = chunks.poll();
- if (chunk != null)
- return chunk;
+ Chunk chunk = chunks.poll();
+ if (chunk != null)
+ return chunk;
- if (!allocateMoreChunks())
- // give it one last attempt, in case someone else allocated before us
- return chunks.poll();
- }
+ chunk = allocateMoreChunks();
+ if (chunk != null)
+ return chunk;
+
+ // another thread may have just allocated last macro chunk, so make one final attempt before returning null
+ return chunks.poll();
}
/**
* This method might be called by multiple threads and that's fine if we add more
* than one chunk at the same time as long as we don't exceed the MEMORY_USAGE_THRESHOLD.
*/
- private boolean allocateMoreChunks()
+ private Chunk allocateMoreChunks()
{
while (true)
{
@@ -266,7 +266,7 @@ public class BufferPool
{
noSpamLogger.info("Maximum memory usage reached ({}), cannot allocate chunk of {}",
MEMORY_USAGE_THRESHOLD, MACRO_CHUNK_SIZE);
- return false;
+ return null;
}
if (memoryUsage.compareAndSet(cur, cur + MACRO_CHUNK_SIZE))
break;
@@ -284,20 +284,23 @@ public class BufferPool
"Attempting to continue; buffers will be allocated in on-heap memory which can degrade performance. " +
"Make sure direct memory size (-XX:MaxDirectMemorySize) is large enough to accommodate off-heap memtables and caches.",
MACRO_CHUNK_SIZE, sizeInBytes(), oom.toString());
- return false;
+ return null;
}
chunk.acquire(null);
macroChunks.add(chunk);
- for (int i = 0 ; i < MACRO_CHUNK_SIZE ; i += CHUNK_SIZE)
+
+ final Chunk callerChunk = new Chunk(chunk.get(CHUNK_SIZE));
+ if (DEBUG)
+ debug.register(callerChunk);
+ for (int i = CHUNK_SIZE ; i < MACRO_CHUNK_SIZE; i += CHUNK_SIZE)
{
Chunk add = new Chunk(chunk.get(CHUNK_SIZE));
chunks.add(add);
if (DEBUG)
debug.register(add);
}
-
- return true;
+ return callerChunk;
}
public void recycle(Chunk chunk)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org