Details
Description
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?