[ 
https://issues.apache.org/jira/browse/CASSANDRA-5863?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15256531#comment-15256531
 ] 

Branimir Lambov commented on CASSANDRA-5863:
--------------------------------------------

Thanks for the review and ideas. Updated the branch to apply your comments.

bq. why does ReaderCache only account for buffer side instead of key + buffer 
size in weighter, this means cache size is underestimated?

The key itself is a small and fixed part of the overhead (all objects it 
references are already found elsewhere); there are also on-heap support 
structures within the implementing cache which are bigger. Though that's not 
trivial, we could also account for those, but I don't know how that helps cache 
management and sizing for the user.

My point of view is that the user requests a certain amount of cached _data_ 
which is what the weigher currently measures. That enables a simple message to 
the user (_x_ bytes of data off heap with _y_% typical on-heap overhead); 
measuring (or accounting for) both would create difficulties communicating how 
space is allocated and used.

bq. couple instanceof checks kind of signal that we want to re-evaluate 
rebuffer class hierarchy.

You are right, there's no need this to be implemented outside the Rebufferer 
hierarchy. Reorganized.

bq. ReaderCache#invalidateFile is not very efficient O\(n\) from the size of 
the cache, which is used by cleanup of the mmap'ed files, which might be a 
problem.

This needs to be evaluated in more detail to figure out if there's any point 
calling it at all. It is necessary for testing, otherwise we could just as well 
skip the call.

bq. (potential safety improvement) ChecksummedDataInput#readBuffer - should do 
buffer vs. read length validation for -1 situation because otherwise this might 
cause corruption

I'm sorry, I do not understand the problem -- the code only relies on the 
position of the buffer and since buffer is cleared before the read, an end of 
stream (and only that) will result in an empty buffer; both {{read()}} and 
{{readByte()}} interpret this correctly.

bq. HintsReader - adds unused import and commented out seek which should be 
removed

Fixed.

bq. since CRAR no longer extends RAR header comment about that should be 
removed as well, as the matter of fact since CRAR now is just a container of 
rebuffer implementations, maybe it makes sense to remove it all together and 
just use RAR from CompressedSegmentedFile with different "rebuffer" backends, 
so in other words put all of the rebuffers from CRAR to CSF?

Done, with a little extra clean-up around RAR.Builder.

bq. BufferlessRebufferer#rebuffer(long position, ByteBuffer buffer) at least 
requires better clarification of the parameters and return value, because in 
e.g. CRAR it's not exactly clear why would uncompressed buffer be provided to 
also be returned, why can't argument just be filled and return type changed to 
be long which is an (aligned) offset of the file?

I had added a return of the passed buffer for convenience but it also adds 
possibility for error -- changed the return of the method to void. On the other 
point, it does not make sense for the callee to return an (aligned) offset as 
the caller may need to have a better control over positioning before allocating 
the buffer -- caching rebufferers, specifically, do.

bq. Which allows to remove Rebufferer#rebuffer(long) method and always let 
callers provide the buffer to fill, since I only see it used in RAR#reBufferAt 
and LimitingRebufferer where both could be made to hold the actual buffer.

This wasn't the case even before this ticket. When RAR requests rebuffering at 
a certain position, it can either have its buffer filled (direct case), or 
receive a view of a shared buffer that holds the data (mem-mapped case). There 
was a lot of clumsiness in RAR to handle the question of which of these is the 
case, does it own its buffer, should it be allocated or freed. The patch 
addresses this clumsiness as well as allowing for another type of advantageous 
buffer management.

bq. Such allows to converge everything under BufferlessRebufferer and have 
ReaderCache and RAR to handle buffers and divides reponsibilities of buffer 
management and actual block storage handling between RAR and Rebufferer.

Unless you want the cache to copy data into a buffer provided by the RAR rather 
than just provide access to a shared buffer, buffer management is integral in 
caching and mem-mapped access and thus belongs in the rebufferer.

bq. make compressors always return a size of the buffer aligned on PAGE_SIZE 
(default 512 bytes) and leave "holes" in the file

Interesting. Another possibility mentioned before is to implement compression 
in such a way that the _compressed_ size matches the chunk size. Both are 
orthogonal and outside the scope of this ticket -- lets open a new issue for 
that?

> In process (uncompressed) page cache
> ------------------------------------
>
>                 Key: CASSANDRA-5863
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-5863
>             Project: Cassandra
>          Issue Type: Sub-task
>            Reporter: T Jake Luciani
>            Assignee: Branimir Lambov
>              Labels: performance
>             Fix For: 3.x
>
>
> Currently, for every read, the CRAR reads each compressed chunk into a 
> byte[], sends it to ICompressor, gets back another byte[] and verifies a 
> checksum.  
> This process is where the majority of time is spent in a read request.  
> Before compression, we would have zero-copy of data and could respond 
> directly from the page-cache.
> It would be useful to have some kind of Chunk cache that could speed up this 
> process for hot data, possibly off heap.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to