Gotcha, sorry for the noise. I documented properly in the upcoming HBase book. :)
Sent from my iPhone > On 7. Aug 2017, at 07:02, ramkrishna vasudevan > <ramkrishna.s.vasude...@gmail.com> wrote: > > I think the layout of tags is missing now in the javadoc. May be it got > missed or moved to some other place? > I remember we had a layout explaining the tag structure then this code is > much easier to read this code. > > As Chia-Ping said <tag len(short)><tag type (byte)<tag bytes> is the > layout. > So from the KeyValue lay out we extract the tag part which in itself has a > tag length to represent the complete set of tags. > > From the tags offset and tags length from the KV we extract individual tags > in that KV. > > For eg > See TagUtil#asList > > {code} > List<Tag> tags = new ArrayList<>(); > int pos = offset; > while (pos < offset + length) { > int tagLen = Bytes.readAsInt(b, pos, TAG_LENGTH_SIZE); > tags.add(new ArrayBackedTag(b, pos, tagLen + TAG_LENGTH_SIZE)); > pos += TAG_LENGTH_SIZE + tagLen; > } > return tags; > {code} > > Regards > Ram > > > > >> On Mon, Aug 7, 2017 at 3:25 AM, Ted Yu <yuzhih...@gmail.com> wrote: >> >> The byte following the tag length (a short) is the tag type. >> >> The current code is correct. >> >> On Sun, Aug 6, 2017 at 5:40 AM, Chia-Ping Tsai <chia7...@apache.org> >> wrote: >> >>> According to the following code: >>> public ArrayBackedTag(byte tagType, byte[] tag) { >>> int tagLength = tag.length + TYPE_LENGTH_SIZE; >>> if (tagLength > MAX_TAG_LENGTH) { >>> throw new IllegalArgumentException( >>> "Invalid tag data being passed. Its length can not exceed " + >>> MAX_TAG_LENGTH); >>> } >>> length = TAG_LENGTH_SIZE + tagLength; >>> bytes = new byte[length]; >>> int pos = Bytes.putAsShort(bytes, 0, tagLength); >>> pos = Bytes.putByte(bytes, pos, tagType); >>> Bytes.putBytes(bytes, pos, tag, 0, tag.length); >>> this.type = tagType; >>> } >>> The layout of the byte array should be: >>> |tag legnth (2 bytes)|tag type(1 byte)|tag| >>> >>> It seems to me that the "bytes[offset + TYPE_LENGTH_SIZE]" is correct. >>> >>>> On 2017-08-06 16:35, Lars George <lars.geo...@gmail.com> wrote: >>>> Hi, >>>> >>>> I found this reading through tags in 1.3, but checked in trunk as >>>> well. There is this code: >>>> >>>> public ArrayBackedTag(byte[] bytes, int offset, int length) { >>>> if (length > MAX_TAG_LENGTH) { >>>> throw new IllegalArgumentException( >>>> "Invalid tag data being passed. Its length can not exceed " >>>> + MAX_TAG_LENGTH); >>>> } >>>> this.bytes = bytes; >>>> this.offset = offset; >>>> this.length = length; >>>> this.type = bytes[offset + TAG_LENGTH_SIZE]; >>>> } >>>> >>>> I am concerned about the last line of the code, using the wrong >> constant? >>>> >>>> public final static int TYPE_LENGTH_SIZE = Bytes.SIZEOF_BYTE; >>>> public final static int TAG_LENGTH_SIZE = Bytes.SIZEOF_SHORT; >>>> >>>> Should this not read >>>> >>>> this.type = bytes[offset + TYPE_LENGTH_SIZE]; >>>> >>>> Would this not read the type from the wrong place in the array? >>>> >>>> Cheers, >>>> Lars >>>> >>> >>