You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hbase.apache.org by "ramkrishna.s.vasudevan (JIRA)" <ji...@apache.org> on 2013/04/30 10:40:15 UTC

[jira] [Resolved] (HBASE-8464) FastDiffEncoder - valueOffset calculation is incorrect

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

ramkrishna.s.vasudevan resolved HBASE-8464.
-------------------------------------------

    Resolution: Invalid

Sorry not a problem.
                
> FastDiffEncoder - valueOffset calculation is incorrect
> ------------------------------------------------------
>
>                 Key: HBASE-8464
>                 URL: https://issues.apache.org/jira/browse/HBASE-8464
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 0.94.7, 0.95.0
>            Reporter: ramkrishna.s.vasudevan
>            Assignee: ramkrishna.s.vasudevan
>             Fix For: 0.98.0, 0.94.8, 0.95.1
>
>
> In FastDiffEncoder
> Inside compressSingleKeyValue()
> {code}
>  currentState.prevOffset = in.position();
>     int keyLength = in.getInt();
>     int valueOffset =
>         currentState.prevOffset + keyLength + KeyValue.ROW_OFFSET;
>     int valueLength = in.getInt();
>     byte flag = 0;
> {code}
> Before seeing the bug, whenever we write something into encoders, we take the ByteBuffer that is created by Writer.append().
> This basically writes
> keyLength, valueLength, keyarray, valuearray, <memstoreTS> 
> Now consider a case where the keyarray size is 20 and valuearray size is 20.
> As per the above code for the first KV
> Read keyLength (4  bytes), value length (4 bytes).
> First time the prevOffset is 0 so our value Offset is - 0+20+8 =28.
> This is correct.
> After the first KV is read when we take up the next KV,
> Now the currentState.prevOffset => 28+20 = 48 (the value is also read)
> The above calculation will give us
> 28+20+8 = 56.
> But the bytebuffer has only 48 bytes in it.
> Why our testcases did not catch this bug?
> ========================================
> It is because in the TestDataBlockEncoders we create a ByteBuffer directly from the KVs and we do not create the way the HFileWriterV2 does it.
> See RedundantKVGenerator.convertKvToByteBuffer().
> Pls correct me if am wrong.  I can provide a patch for the same if my above analysis is correct.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira