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

Anoop Sam John commented on HBASE-14873:
----------------------------------------

bq.Another problem; cellBlock is allowed to be a non-direct buffer, and after 
use it will be put to reservoir, mixing direct and non-direct buffers in the 
pool.
We will put back BBs obtained from pool. This might have grown to bigger size 
but then also we will recreate DBB when the original one (got from pool) was DBB

> Problems around BoundedByteBufferPool providing direct buffers
> --------------------------------------------------------------
>
>                 Key: HBASE-14873
>                 URL: https://issues.apache.org/jira/browse/HBASE-14873
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Hiroshi Ikeda
>            Assignee: Hiroshi Ikeda
>             Fix For: 2.0.0
>
>         Attachments: HBASE-14873.patch, HBASE-14873.patch, HBASE-14873.patch
>
>
> HBASE-13819 made BoundedByteBufferPool provide direct buffers.
> See RpcServer.java:
> {code}
> ...
> class Call implements RpcCallContext {
>   protected synchronized void setResponse(...) {
> ...
>     this.cellBlock = ipcUtil.buildCellBlock(..., reservoir);
> ...
>     bc = new BufferChain(..., this.cellBlock);
>     if (connection.useWrap) {
>       bc = wrapWithSasl(bc);
>     }
> ...
>   private BufferChain wrapWithSasl(BufferChain bc) throws IOException {
> ...
>     byte[] responseBytes = bc.getBytes();
> ...
> {code}
> {{cellBlock}} is expected to be a direct buffer retrieved from {{reservoir}} 
> (but not always), and {{bc}} may be composed of both direct and non-direct 
> buffers.
> And then, see BufferChain.java:
> {code}
> byte [] getBytes() {
> ...
>     for (ByteBuffer bb: this.buffers) {
>       System.arraycopy(bb.array(), ...);
> {code}
> A direct buffer doesn't give its array, and will throw 
> UnsupportedOperationException.
> Another problem; {{cellBlock}} is allowed to be a non-direct buffer, and 
> after use it will be put to {{reservoir}}, mixing direct and non-direct 
> buffers in the pool.



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

Reply via email to