Hi Nimi

I am not familiar with how CASSANDRA-5863 uses the buffer pool yet, but I
do know how the buffer pool works

It has a local pool, which is thread local, and takes chunks from a global
pool. These are allocated off heap and aligned to the page cache
boundaries, see here
<https://github.com/apache/cassandra/blob/30bb255ec9fb36ace2aab51474bd3bfb9bbd3bed/src/java/org/apache/cassandra/utils/memory/BufferPool.java#L276>.


The buffer pool will allocate according to buffer_pool_use_heap_if_exhausted
only in two cases:

   - The global pool has run out of chunks, which happens when there is an
   OOM exception or when MEMORY_USAGE_THRESHOLD is exhausted, see here
   
<https://github.com/apache/cassandra/blob/30bb255ec9fb36ace2aab51474bd3bfb9bbd3bed/src/java/org/apache/cassandra/utils/memory/BufferPool.java#L259>
   .
   - The requested buffer size is larger than a chunk, currently
   CHUNK_SIZE, 64 kb.

To understand this behaviour look at maybeTakeFromPool
<https://github.com/apache/cassandra/blob/30bb255ec9fb36ace2aab51474bd3bfb9bbd3bed/src/java/org/apache/cassandra/utils/memory/BufferPool.java#L124>(),
the line that takes from the local pool is the last one and follow from
there.

The original ticket for the buffer pool is CASSANDRA-8897
<https://issues.apache.org/jira/browse/CASSANDRA-8897>if you need more
details, and there is CASSANDRA-9468
<https://issues.apache.org/jira/browse/CASSANDRA-9468> to extend it to
allow chunks with bigger or smaller sizes (point 4).

I've left a comment on CASSANDRA-11993.

I hope this helps,
Stefania


On Wed, Jun 22, 2016 at 4:54 AM, Nimi Wariboko Jr <n...@channelmeter.com>
wrote:

> Hi,
>
> I'm trying to debug an issue I'm having with Cassandra 3.6+ and Snappy
> compressed tables - CASSANDRA-11993 (that may be related to
> CASSANDRA-5863).
>
> I'm probably 3% familiar with Cassandra internals, so apologies if I'm
> wrong here - I was looking at a change in CASSANDRA-5863 where a cache was
> added to the SSTableIterator code path, which may have
> included org.apache.cassandra.utils.memory.BufferPool into the read path.
>
> My confusion comes from here - AFAICT, when the BufferPool needs to
> allocate more memory, it calls allocate(int size, boolean onHeap) (
>
> https://github.com/apache/cassandra/blob/30bb255ec9fb36ace2aab51474bd3bfb9bbd3bed/src/java/org/apache/cassandra/utils/memory/BufferPool.java#L82
> ).
> The value for whether onHeap is true is
> constant ALLOCATE_ON_HEAP_WHEN_EXAHUSTED.
>
> ALLOCATE_ON_HEAP_WHEN_EXAHUSTED is defined by the yaml
> setting buffer_pool_use_heap_if_exhausted which is true by default (and was
> so in my install).
>
> Further still (
>
> https://github.com/apache/cassandra/blob/30bb255ec9fb36ace2aab51474bd3bfb9bbd3bed/src/java/org/apache/cassandra/utils/memory/BufferPool.java
> ),
> I can't see any logic where BufferPool will actually allocate off heap
> memory - it seems, due to the buffer_pool_use_heap_if_exhausted setting,
> always allocate memory on heap. It never checks if the off heap memory is
> exhausted (AFAICT from these 3 files).
>
> Sure enough, if I set buffer_pool_use_heap_if_exhausted, my issue at
> CASSANDRA-11993 goes away (I think? I'm having a number of issues lately
> and I may have traded one exception for another).
>
> Is this the correct behavior of buffer_pool_use_heap_if_exhausted?
>
> Nimi
>



-- 


[image: datastax_logo.png] <http://www.datastax.com/>

Stefania Alborghetti

Apache Cassandra Software Engineer

|+852 6114 9265| stefania.alborghe...@datastax.com


[image: cassandrasummit.org/Email_Signature]
<http://cassandrasummit.org/Email_Signature>

Reply via email to