Are you on the client or the server?
In the server the KeyValue objects are created in HFileReaderV2.ScannerV2.getKeyValue(). There you will see that a KeyValue object is really just a "pointer" into a larger byte loaded from an HFile.
On the client the KeyValue is typically deserialized from an RPC; in that case the backing array only holds one KeyValue (and the buffer size and the KeyValue length should match).
Does that make sense? I know this can be a bit confusing.
----- Original Message -----
From: Kim Chew <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]; lars hofhansl <[EMAIL PROTECTED]>
Sent: Wednesday, September 25, 2013 5:40 PM
Subject: Re: KeyValue.getLength() question
On Wed, Sep 25, 2013 at 7:52 AM, lars hofhansl <[EMAIL PROTECTED]> wrote:
> myKV.getLength() is alway <= myKV.getBuffer().length.
> The buffer here is typically an HFile block.
Lars, I don't quite understand this, could you please elaborate a bit
more? Also if the KV's buffer size is bigger than the one returned by
"readLength()", what would be those extra bytes in the buffer?
It seems to me that the Scanner and InternalScanner packs different
numbers of extra bytes to the buffer, I tired to pinpoint the scanner codes
to where the KV objects is created but without too much luck. Could you
show me where it is done?
Thanks a lot.
> We use that buffer and pass it up the chain without making any further
> copy of the KV.
> -- Lars
> ----- Original Message -----
> From: Kim Chew <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED]
> Sent: Wednesday, September 25, 2013 12:06 AM
> Subject: KeyValue.getLength() question
> I have a "strange" situation that I can't wrap my head around it. Say, for
> example, I have an KeyValue instance, shouldn't
> myKV.getLength() == myKV.getBuffer().length ?
> Given that, "getLength()" returns "Length of bytes this KeyValue occupies
> in getBuffer()<
> In my case the value returned by "myKV.getBuffer().length" is greater than
> "myKV.getLength()". What possibly went wrong?