[
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