Skip to content

Commit 6dd8914

Browse files
openinxapurtell
authored andcommitted
HBASE-22937 The RawBytesComparator in branch-1 have wrong comparison order (#582)
1 parent bab7bd6 commit 6dd8914

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValue.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2614,9 +2614,8 @@ int compareIgnoringPrefix(int commonPrefix, byte[] left, int loffset, int llengt
26142614
*/
26152615
public static class RawBytesComparator extends KVComparator {
26162616
/**
2617-
* The HFileV2 file format's trailer contains this class name. We reinterpret this and
2618-
* instantiate the appropriate comparator.
2619-
* TODO: With V3 consider removing this.
2617+
* The HFileV2 file format's trailer contains this class name. We reinterpret this and
2618+
* instantiate the appropriate comparator. TODO: With V3 consider removing this.
26202619
* @return legacy class name for FileFileTrailer#comparatorClassName
26212620
*/
26222621
@Override
@@ -2629,9 +2628,9 @@ public String getLegacyKeyComparatorName() {
26292628
*/
26302629
@Override
26312630
@Deprecated
2632-
public int compareFlatKey(byte[] left, int loffset, int llength, byte[] right,
2633-
int roffset, int rlength) {
2634-
return Bytes.BYTES_RAWCOMPARATOR.compare(left, loffset, llength, right, roffset, rlength);
2631+
public int compareFlatKey(byte[] left, int loffset, int llength, byte[] right, int roffset,
2632+
int rlength) {
2633+
return Bytes.BYTES_RAWCOMPARATOR.compare(left, loffset, llength, right, roffset, rlength);
26352634
}
26362635

26372636
@Override
@@ -2643,34 +2642,33 @@ public int compare(Cell left, Cell right) {
26432642
@VisibleForTesting
26442643
public int compareOnlyKeyPortion(Cell left, Cell right) {
26452644
int c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getRowArray(), left.getRowOffset(),
2646-
left.getRowLength(), right.getRowArray(), right.getRowOffset(), right.getRowLength());
2645+
left.getRowLength(), right.getRowArray(), right.getRowOffset(), right.getRowLength());
26472646
if (c != 0) {
26482647
return c;
26492648
}
26502649
c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getFamilyArray(), left.getFamilyOffset(),
2651-
left.getFamilyLength(), right.getFamilyArray(), right.getFamilyOffset(),
2652-
right.getFamilyLength());
2650+
left.getFamilyLength(), right.getFamilyArray(), right.getFamilyOffset(),
2651+
right.getFamilyLength());
26532652
if (c != 0) {
26542653
return c;
26552654
}
26562655
c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getQualifierArray(), left.getQualifierOffset(),
2657-
left.getQualifierLength(), right.getQualifierArray(), right.getQualifierOffset(),
2658-
right.getQualifierLength());
2656+
left.getQualifierLength(), right.getQualifierArray(), right.getQualifierOffset(),
2657+
right.getQualifierLength());
26592658
if (c != 0) {
26602659
return c;
26612660
}
26622661
c = compareTimestamps(left.getTimestamp(), right.getTimestamp());
26632662
if (c != 0) {
26642663
return c;
26652664
}
2666-
return (0xff & left.getTypeByte()) - (0xff & right.getTypeByte());
2665+
return (0xff & right.getTypeByte()) - (0xff & left.getTypeByte());
26672666
}
26682667

26692668
@Override
26702669
public byte[] calcIndexKey(byte[] lastKeyOfPreviousBlock, byte[] firstKeyInBlock) {
26712670
return firstKeyInBlock;
26722671
}
2673-
26742672
}
26752673

26762674
/**

hbase-common/src/test/java/org/apache/hadoop/hbase/TestKeyValue.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.hadoop.hbase.KeyValue.MetaComparator;
3939
import org.apache.hadoop.hbase.KeyValue.Type;
4040
import org.apache.hadoop.hbase.util.Bytes;
41+
import org.junit.Test;
4142

4243
import static org.junit.Assert.assertNotEquals;
4344

@@ -849,4 +850,15 @@ public void testEqualsAndHashCode() throws Exception {
849850
assertNotEquals(kvA1.hashCode(), kvB.hashCode());
850851
}
851852

853+
@Test
854+
public void testRawBytesComparator() {
855+
long ts = System.currentTimeMillis();
856+
byte[] key = Bytes.toBytes("key");
857+
byte[] cf = Bytes.toBytes("cf");
858+
byte[] qualifier = Bytes.toBytes("qualifier");
859+
byte[] value = Bytes.toBytes("value");
860+
KeyValue kvA1 = new KeyValue(key, cf, qualifier, ts, Type.Put, value);
861+
KeyValue kvA2 = new KeyValue(key, cf, qualifier, ts, Type.DeleteFamily, value);
862+
assertTrue(KeyValue.RAW_COMPARATOR.compare(kvA1, kvA2) > 0);
863+
}
852864
}

0 commit comments

Comments
 (0)