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

ramkrishna.s.vasudevan commented on HBASE-14490:
------------------------------------------------

Just yesterday was working on this area of the code. 
{code}
        data = reqBufPool.getBuffer();
1574            if (data.capacity() < dataLength) {
1575              data = ByteBuffer.allocate(dataLength);
1576            } else {
1577              data.limit(dataLength);
1578            }
{code}
This step of limiting is very important without which things does not work 
correctly. 
As Anoop said returning the pool in the finally, is not correct. When you turn 
on cellblocks in the write request, things will get messed up. Tested that and 
it has to be done either when the call is completed or we need to have a 
mechanism as to when we get rid of the BB. For now Call.done() should be okie.
But there are other things also in my opinion to see as to what should be the 
maximum capacity of this BBPool. Do we need to create another pool for read and 
write seperately? IMHO I feel yes. But Anoop had other suggestions in terms of 
GC holding to these pools and another is that we don't know if it is write/read 
request. But still I think we can manage it but GC holding to these pools is 
what I need to evaluate. Will check on that.
Another thing to note is that, in case we are creating DBB from this pool and 
we are not able to add it  back to the pool in case of increase in capacity how 
will those DBB be GCed? Hence suggesting a suitable capacity for this pool is 
very important.
DBB pool avoids copying that Oracle impl does. So +1 for doing it.
bq.Unless there is a noticeable benefit, is there a reason to try and defeat 
the GC? Short lived objects are very very cheap with newer jvm's and adding 
complexity that would be disabled for people running a newer jvm seems weird.
This is something I saw in Elliot's comment in another JIRA too. Actually I 
think we should investigate here. I am not a G1GC expert so I think we can get 
some help here and really see what is the impact of these short lived objects 
with the new GC and its tuning. It makes sense if we can leave things to JVM if 
it is not burdened in doing this housekeeping. 


> [RpcServer] reuse request read buffer
> -------------------------------------
>
>                 Key: HBASE-14490
>                 URL: https://issues.apache.org/jira/browse/HBASE-14490
>             Project: HBase
>          Issue Type: Improvement
>          Components: IPC/RPC
>    Affects Versions: 2.0.0, 1.0.2
>            Reporter: Zephyr Guo
>            Assignee: Zephyr Guo
>              Labels: performance
>             Fix For: 2.0.0, 1.0.2
>
>         Attachments: 14490.hack.to.1.2.patch, ByteBufferPool.java, 
> HBASE-14490-v1.patch, HBASE-14490-v10.patch, HBASE-14490-v11.patch, 
> HBASE-14490-v12.patch, HBASE-14490-v2.patch, HBASE-14490-v3.patch, 
> HBASE-14490-v4.patch, HBASE-14490-v5.patch, HBASE-14490-v6.patch, 
> HBASE-14490-v7.patch, HBASE-14490-v8.patch, HBASE-14490-v9.patch, gc.png, 
> hits.png, test-v12-patch
>
>
> Reusing buffer to read request.It's not necessary to every request free 
> buffer.The idea of optimization is to reduce the times that allocate 
> ByteBuffer.
> *Modification*
> 1. {{saslReadAndProcess}} ,{{processOneRpc}}, {{processUnwrappedData}}, 
> {{processConnectionHeader}} accept a ByteBuffer instead of byte[].They can 
> move {{ByteBuffer.position}} correctly when we have read the data.
> 2. {{processUnwrappedData}} no longer use any extra memory.
> 3. Maintaining a buffer pool in each {{Connection}}.



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

Reply via email to