You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Lucian George Iordache (JIRA)" <ji...@apache.org> on 2012/10/01 09:15:07 UTC

[jira] [Commented] (HBASE-6846) BitComparator bug - ArrayIndexOutOfBoundsException

    [ 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