[ 
https://issues.apache.org/jira/browse/GEODE-1281?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Anthony Baker updated GEODE-1281:
---------------------------------
    Labels: needs-review performance  (was: )

> Client/Server implementation could do less copying when sending messages
> ------------------------------------------------------------------------
>
>                 Key: GEODE-1281
>                 URL: https://issues.apache.org/jira/browse/GEODE-1281
>             Project: Geode
>          Issue Type: Improvement
>          Components: offheap
>            Reporter: Darrel Schneider
>            Priority: Major
>              Labels: needs-review, performance
>
> Here are some rough ideas for improving the client/server messaging to do 
> less copying. In particular they involve not copying off-heap values to the 
> heap when trying to send the off-heap value back to a client.
> Read them in the context of this method (which is used to send back a getAll 
> response): 
> com.gemstone.gemfire.internal.cache.tier.sockets.Message.serializeAndAddPartNoCopying(Object)
> 1. Change Part to look for an HDOS and just pass a reference to its 
> DirectByteBuffer. Then change HDOS sendTo(SocketChannel...) to use the 
> GatheringByteChannel to write a bunch of bbs.
> 2. This code optimizes one part which works pretty good for getAll since all 
> the values are returned in one part. But the following seems even better...
> Change Message to consolidate all the part hdos bb lists into a single bb 
> array and have it do the GatheringByteChannel write. Message can use slice 
> for the small parts (msg header and part header) that are not in the parts 
> data (its a byte array, Chunk, or HDOS).
> 3. EVEN BETTER: the message can have a single HDOS which owns a direct comm 
> buffer. It can reserve space if it does not yet know the value to write (for 
> example the size of the message or part). If we write something to the HDOS 
> that is direct then it does not need to be copied. But large heap byte arrays 
> will need to be copied to the hdos (the socket write does this anyway). If 
> the direct buffer is full then we can allocate another one. If a part is 
> already in a heap byte array then we could defer copying it by slicing the 
> current direct bb and then adding the heap byte array as bb using 
> ByteBuffer.wrap. Once we have all the data in the HDOS we can finally 
> generate the header and then start working on sending the ByteBuffers to the 
> channel. If we have room in a direct bb then we can copy a heap bb to it. 
> Otherwise we can write the bb ahead of it which would free up room to copy 
> the heap bb to the existing direct bb without needing to allocate extra 
> direct bbs. Delaying the flush uses more direct memory but reduces the number 
> of system calls.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to