Repository: cassandra Updated Branches: refs/heads/cassandra-3.7 a8a3a7338 -> a093e8cae refs/heads/trunk 640072b09 -> 653d0bffc
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/cassandra-3.7 Commit: 31cab36b1800f2042623633445d8be944217d5a2 Parents: 5634cea Author: Branimir Lambov <[email protected]> Authored: Thu May 5 11:30:00 2016 +0300 Committer: T Jake Luciani <[email protected]> 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)
