HRegion.incrementColumnValue( ----------------------------- Key: HBASE-4016 URL: https://issues.apache.org/jira/browse/HBASE-4016 Project: HBase Issue Type: Bug Components: regionserver Affects Versions: 0.90.3 Environment: $ cat /etc/release Oracle Solaris 11 Express snv_151a X86 Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. Assembled 04 November 2010
$ java -version java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b06) Java HotSpot(TM) Server VM (build 17.0-b16, mixed mode) Reporter: Praveen Kumar We wanted to use a int (32-bit) atomic counter and we initialize it with a certain value when the row is created. Later, we increment the counter using HTable.incrementColumnValue(). This call results in one of two outcomes. 1. The call succeeds, but the column value now is a long (64-bit) and is corrupt (by additional data that was in the buffer read). 2. Throws IOException/IllegalArgumentException. Java.io.IOException: java.io.IOException: java.lang.IllegalArgumentException: offset (65547) + length (8) exceed the capacity of the array: 65551 at org.apache.hadoop.hbase.util.Bytes.explainWrongLengthOrOffset(Bytes.java:502) at org.apache.hadoop.hbase.util.Bytes.toLong(Bytes.java:480) at org.apache.hadoop.hbase.regionserver.HRegion.incrementColumnValue(HRegion.java:3139) at org.apache.hadoop.hbase.regionserver.HRegionServer.incrementColumnValue(HRegionServer.java:2468) at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:570) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1039) Based on our incorrect usage of counters (initializing it with a 32 bit value and later using it as a counter), I would expect that we fail consistently with mode 2 rather than silently corrupting data with mode 1. However, the exception is thrown only rarely and I am not sure what determines the case to be executed. I am wondering if this has something to do with flush. Here is a HRegion unit test that can reproduce this problem. http://paste.lisp.org/display/122822 We modified our code to initialize the counter with a 64 bit value. But, I was also wondering if something has to change in HRegion.incrementColumnValue() to handle inconsistent counter sizes gracefully without corrupting existing data. Please let me know if you need additional information. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira