You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ja...@apache.org on 2016/05/09 17:52:28 UTC
[2/5] cassandra git commit: Prevent direct memory OOM on buffer pool
allocations
Prevent direct memory OOM on buffer pool allocations
Patch by Branimir Lambov; reviewed by tjake for
(CASSANDRA-11710)
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/31cab36b
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/31cab36b
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/31cab36b
Branch: refs/heads/trunk
Commit: 31cab36b1800f2042623633445d8be944217d5a2
Parents: 5634cea
Author: Branimir Lambov <br...@datastax.com>
Authored: Thu May 5 11:30:00 2016 +0300
Committer: T Jake Luciani <ja...@apache.org>
Committed: Mon May 9 13:48:30 2016 -0400
----------------------------------------------------------------------
CHANGES.txt | 1 +
src/java/org/apache/cassandra/config/Config.java | 2 +-
.../cassandra/config/DatabaseDescriptor.java | 7 +++++++
.../apache/cassandra/utils/memory/BufferPool.java | 17 ++++++++++++++++-
4 files changed, 25 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31cab36b/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 4ff5b1a..b7715ba 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
3.6
+ * Prevent direct memory OOM on buffer pool allocations (CASSANDRA-11710)
* Enhanced Compaction Logging (CASSANDRA-10805)
* Make prepared statement cache size configurable (CASSANDRA-11555)
* Integrated JMX authentication and authorization (CASSANDRA-10091)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31cab36b/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 02635bf..466b791 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -242,7 +242,7 @@ public class Config
private static boolean isClientMode = false;
- public Integer file_cache_size_in_mb = 512;
+ public Integer file_cache_size_in_mb;
public boolean buffer_pool_use_heap_if_exhausted = true;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31cab36b/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 d8acdb8..3d38646 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -1776,6 +1776,13 @@ public class DatabaseDescriptor
public static int getFileCacheSizeInMB()
{
+ if (conf.file_cache_size_in_mb == null)
+ {
+ // In client mode the value is not set.
+ assert Config.isClientMode();
+ return 0;
+ }
+
return conf.file_cache_size_in_mb;
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31cab36b/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 ad2404f..5cd0051 100644
--- a/src/java/org/apache/cassandra/utils/memory/BufferPool.java
+++ b/src/java/org/apache/cassandra/utils/memory/BufferPool.java
@@ -273,7 +273,22 @@ public class BufferPool
}
// allocate a large chunk
- Chunk chunk = new Chunk(allocateDirectAligned(MACRO_CHUNK_SIZE));
+ Chunk chunk;
+ try
+ {
+ chunk = new Chunk(allocateDirectAligned(MACRO_CHUNK_SIZE));
+ }
+ catch (OutOfMemoryError oom)
+ {
+ noSpamLogger.error("Buffer pool failed to allocate chunk of {}, current size {} ({}). " +
+ "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.",
+ FBUtilities.prettyPrintMemory(MACRO_CHUNK_SIZE),
+ FBUtilities.prettyPrintMemory(sizeInBytes()),
+ oom.toString());
+ return false;
+ }
+
chunk.acquire(null);
macroChunks.add(chunk);
for (int i = 0 ; i < MACRO_CHUNK_SIZE ; i += CHUNK_SIZE)