Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-6919

Remove unnecessary throws IOException from Bytes.readVLong

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • None
    • 1.1.0, 0.98.12, 2.0.0
    • None

    Description

      Remove the throws IOException so that caller doesn't have to catch and ignore.

        public static long readVLong(final byte [] buffer, final int offset)
        throws IOException
      

      Also, add

        public static int readVInt(final byte [] buffer, final int offset)
        throws IOException {
          return (int)readVLong(buffer,offset);
        }
      

      and these are useful too:

          /**
           * Put long as variable length encoded number at the offset in
           * the result byte array.
           * @param vint Integer to make a vint of.
           * @param result buffer to put vint into
           * @return Vint length in bytes of vint
           */
          public static int vintToBytes(byte[] result, int offset, final long vint) {
            long i = vint;
            if (i >= -112 && i <= 127) {
              result[offset] = (byte) i;
              return 1;
            }
      
            int len = -112;
            if (i < 0) {
              i ^= -1L; // take one's complement'
              len = -120;
            }
      
            long tmp = i;
            while (tmp != 0) {
              tmp = tmp >> 8;
              len--;
            }
      
            result[offset++] = (byte) len;
      
            len = (len < -120) ? -(len + 120) : -(len + 112);
      
            for (int idx = len; idx != 0; idx--) {
              int shiftbits = (idx - 1) * 8;
              long mask = 0xFFL << shiftbits;
              result[offset++] = (byte)((i & mask) >> shiftbits);
            }
            return len + 1;
          }
      
          /**
           * Decode a vint from the buffer pointed at to by ptr and
           * increment the offset of the ptr by the length of the
           * vint.
           * @param ptr a pointer to a byte array buffer
           * @return the decoded vint value as an int
           */
          public static int vintFromBytes(ImmutableBytesWritable ptr) {
              return (int) vlongFromBytes(ptr);
          }
          
          /**
           * Decode a vint from the buffer pointed at to by ptr and
           * increment the offset of the ptr by the length of the
           * vint.
           * @param ptr a pointer to a byte array buffer
           * @return the decoded vint value as a long
           */
          public static long vlongFromBytes(ImmutableBytesWritable ptr) {
              final byte [] buffer = ptr.get();
              final int offset = ptr.getOffset();
              byte firstByte = buffer[offset];
              int len = WritableUtils.decodeVIntSize(firstByte);
              if (len == 1) {
                  ptr.set(buffer, offset+1, ptr.getLength());
                  return firstByte;
              }
              long i = 0;
              for (int idx = 0; idx < len-1; idx++) {
                  byte b = buffer[offset + 1 + idx];
                  i = i << 8;
                  i = i | (b & 0xFF);
              }
              ptr.set(buffer, offset+len, ptr.getLength());
              return (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);
          }
      
      
      

      Attachments

        1. HBASE-6919-v3.patch
          6 kB
          Apekshit Sharma
        2. HBASE-6919-v2.patch
          6 kB
          Apekshit Sharma
        3. HBASE-6919-v1.patch
          5 kB
          Apekshit Sharma
        4. HBASE-6919.patch
          5 kB
          Apekshit Sharma

        Activity

          People

            appy Apekshit Sharma
            giacomotaylor James Taylor
            Votes:
            0 Vote for this issue
            Watchers:
            10 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: