hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lucian George Iordache (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-6846) BitComparator bug - ArrayIndexOutOfBoundsException
Date Mon, 01 Oct 2012 07:15:07 GMT

    [ https://issues.apache.org/jira/browse/HBASE-6846?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13466677#comment-13466677
] 

Lucian George Iordache commented on HBASE-6846:
-----------------------------------------------

1. Right now, if length<1, the method compareTo returns 1, so it considers that the values
are not equal. If I were to choose if this is right, I would choose to consider the values
equal when the length is 0 (2 byte arrays with length 0 are equal) and to consider them not
equal when the provided length is <0 (problem when providing the length to verify). What
do you think?

2. What does the message "The patch does not appear to apply with p0 to p2 PATCH APPLICATION
FAILED" mean? I've generated the patch using "svn diff > HBASE-6846.patch"
                
> BitComparator bug - ArrayIndexOutOfBoundsException
> --------------------------------------------------
>
>                 Key: HBASE-6846
>                 URL: https://issues.apache.org/jira/browse/HBASE-6846
>             Project: HBase
>          Issue Type: Bug
>          Components: Filters
>    Affects Versions: 0.94.1
>         Environment: HBase 0.94.1 + Hadoop 2.0.0-cdh4.0.1
>            Reporter: Lucian George Iordache
>         Attachments: HBASE-6846.patch
>
>
> The HBase 0.94.1 BitComparator introduced a bug in the method "compareTo":
> @Override
>   public int compareTo(byte[] value, int offset, int length) {
>     if (length != this.value.length) {
>       return 1;
>     }
>     int b = 0;
>     //Iterating backwards is faster because we can quit after one non-zero byte.
>     for (int i = value.length - 1; i >= 0 && b == 0; i--) {
>       switch (bitOperator) {
>         case AND:
>           b = (this.value[i] & value[i+offset]) & 0xff;
>           break;
>         case OR:
>           b = (this.value[i] | value[i+offset]) & 0xff;
>           break;
>         case XOR:
>           b = (this.value[i] ^ value[i+offset]) & 0xff;
>           break;
>       }
>     }
>     return b == 0 ? 1 : 0;
>   }
> I've encountered this problem when using a BitComparator with a configured this.value.length=8,
and in the HBase table there were KeyValues with keyValue.getBuffer().length=207911 bytes.
In this case:
>     for (int i = 207910; i >= 0 && b == 0; i--) {
>       switch (bitOperator) {
>         case AND:
>           b = (this.value[207910] ... ==> ArrayIndexOutOfBoundsException
>           break;
> That loop should use:
>   for (int i = length - 1; i >= 0 && b == 0; i--) { (or this.value.length.)
> Should I provide a patch for correcting the problem?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message