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

Anoop Sam John updated HBASE-15721:
-----------------------------------
    Attachment: HBASE-15721_V5.patch

Since there is still some confusion abt lifting the deprecation from 
KeyValue#getBuffer(), I just avoided that in this patch.  Also there is a 
slight change in  KeyValueUtil#copyCellTo.
Here we any way call getTagsLength and based on that we can make KeyValue or 
NoTagsKeyValue.
The NoTagsKeyValue was done as an optimization to avoid parsing of many lengths 
to get tagsLength from Cell.  So we make appropriate Cell instance at RPC codec 
layer.  But when the cell is copied to MSLAB, we always used to create KeyValue 
only.. In Segment#updateMetaInfo() we have to every time call getTagsLength on 
the cell.
{code}
if( cellToAdd.getTagsLength() > 0) {
      tagsPresent = true;
    }
{code}
This change will make that optimization complete.

> Optimization in cloning cells into MSLAB
> ----------------------------------------
>
>                 Key: HBASE-15721
>                 URL: https://issues.apache.org/jira/browse/HBASE-15721
>             Project: HBase
>          Issue Type: Sub-task
>          Components: regionserver
>            Reporter: Anoop Sam John
>            Assignee: Anoop Sam John
>             Fix For: 2.0.0
>
>         Attachments: HBASE-15721.patch, HBASE-15721_V2.patch, 
> HBASE-15721_V3.patch, HBASE-15721_V4.patch, HBASE-15721_V5.patch
>
>
> Before cells added to memstore CSLM, there is a clone of cell after copying 
> it to MSLAB chunk area.  This is done not in an efficient way.
> {code}
> public static int appendToByteArray(final Cell cell, final byte[] output, 
> final int offset) {
>     int pos = offset;
>     pos = Bytes.putInt(output, pos, keyLength(cell));
>     pos = Bytes.putInt(output, pos, cell.getValueLength());
>     pos = appendKeyTo(cell, output, pos);
>     pos = CellUtil.copyValueTo(cell, output, pos);
>     if ((cell.getTagsLength() > 0)) {
>       pos = Bytes.putAsShort(output, pos, cell.getTagsLength());
>       pos = CellUtil.copyTagTo(cell, output, pos);
>     }
>     return pos;
>   }
> {code}
> Copied in 9 steps and we end up parsing all lengths.  When the cell 
> implementation is backed by a single byte[] (Like KeyValue) this can be done 
> in single step copy.
> Also avoid lots of garbage while doing this MSLAB copy. With every cell, we 
> used to create a ByteRange instance to pass the allocated chunk + offset from 
> MSLAB to Segment.  Now we can make the MSLAB impl to do the allocation and 
> copy of the cell so that one object creation per cell addition can be avoided.



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

Reply via email to