accumulo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marc Parisi <m...@accumulo.net>
Subject Re: Bug In Text Class - getLength() and getBytes().length are different.
Date Tue, 13 Nov 2012 18:13:27 GMT
That's expected. As per
http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.html, the byte
buffer is created by the encoder, where there is no guarantee that the
backing array's length would match the position ( or limit ).

On Tue, Nov 13, 2012 at 1:00 PM, David Medinets <david.medinets@gmail.com>wrote:

> The following code (the TextTest class) displays:
>
> cq: [5000000000000000]
> cq: [16]
> cq: [16]
> cq: [5000000000000000]
> cq: [16]
> cq: [17]
>
> You'll notice that the last two numbers are different, but they should
> both be 16. This bug affects Accumulo because of the following code in
> Mutation:
>
>   private void put(byte b[]) {
>     buffer.writeVLong(b.length);
>     buffer.add(b, 0, b.length);
>   }
>
>   private void put(Text t) {
>     buffer.writeVLong(t.getLength());
>     buffer.add(t.getBytes(), 0, t.getLength());
>   }
>
> I should be able to call either of the following to get the same
> result but I can't.
>
>   put("5000000000000000".getBytes());
>   put(new Text("5000000000000000"));
>
> Has anyone else run into this issue? Any workarounds or fixes?
>
> ----
>
> package com.codebits.accumulo;
>
> import org.apache.hadoop.io.Text;
>
> public class TextTest {
>
>   public static void main(String[] args) {
>     String s = "5000000000000000";
>     System.out.println("cq: [" + s + "]");
>     System.out.println("cq: [" + s.length() + "]");
>     System.out.println("cq: [" + s.getBytes().length + "]");
>
>     Text cq = new Text(s);
>     System.out.println("cq: [" + cq + "]");
>     System.out.println("cq: [" + cq.getLength() + "]");
>     System.out.println("cq: [" + cq.getBytes().length + "]");
>   }
>
> }
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message