Skip to content

Commit c756e88

Browse files
committed
HBASE-22937 The RawBytesComparator in branch-1 have wrong comparison order (#582)
1 parent 8b3536a commit c756e88

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
@@ -2620,9 +2620,8 @@ int compareIgnoringPrefix(int commonPrefix, byte[] left, int loffset, int llengt
26202620
*/
26212621
public static class RawBytesComparator extends KVComparator {
26222622
/**
2623-
* The HFileV2 file format's trailer contains this class name. We reinterpret this and
2624-
* instantiate the appropriate comparator.
2625-
* TODO: With V3 consider removing this.
2623+
* The HFileV2 file format's trailer contains this class name. We reinterpret this and
2624+
* instantiate the appropriate comparator. TODO: With V3 consider removing this.
26262625
* @return legacy class name for FileFileTrailer#comparatorClassName
26272626
*/
26282627
@Override
@@ -2635,9 +2634,9 @@ public String getLegacyKeyComparatorName() {
26352634
*/
26362635
@Override
26372636
@Deprecated
2638-
public int compareFlatKey(byte[] left, int loffset, int llength, byte[] right,
2639-
int roffset, int rlength) {
2640-
return Bytes.BYTES_RAWCOMPARATOR.compare(left, loffset, llength, right, roffset, rlength);
2637+
public int compareFlatKey(byte[] left, int loffset, int llength, byte[] right, int roffset,
2638+
int rlength) {
2639+
return Bytes.BYTES_RAWCOMPARATOR.compare(left, loffset, llength, right, roffset, rlength);
26412640
}
26422641

26432642
@Override
@@ -2649,34 +2648,33 @@ public int compare(Cell left, Cell right) {
26492648
@VisibleForTesting
26502649
public int compareOnlyKeyPortion(Cell left, Cell right) {
26512650
int c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getRowArray(), left.getRowOffset(),
2652-
left.getRowLength(), right.getRowArray(), right.getRowOffset(), right.getRowLength());
2651+
left.getRowLength(), right.getRowArray(), right.getRowOffset(), right.getRowLength());
26532652
if (c != 0) {
26542653
return c;
26552654
}
26562655
c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getFamilyArray(), left.getFamilyOffset(),
2657-
left.getFamilyLength(), right.getFamilyArray(), right.getFamilyOffset(),
2658-
right.getFamilyLength());
2656+
left.getFamilyLength(), right.getFamilyArray(), right.getFamilyOffset(),
2657+
right.getFamilyLength());
26592658
if (c != 0) {
26602659
return c;
26612660
}
26622661
c = Bytes.BYTES_RAWCOMPARATOR.compare(left.getQualifierArray(), left.getQualifierOffset(),
2663-
left.getQualifierLength(), right.getQualifierArray(), right.getQualifierOffset(),
2664-
right.getQualifierLength());
2662+
left.getQualifierLength(), right.getQualifierArray(), right.getQualifierOffset(),
2663+
right.getQualifierLength());
26652664
if (c != 0) {
26662665
return c;
26672666
}
26682667
c = compareTimestamps(left.getTimestamp(), right.getTimestamp());
26692668
if (c != 0) {
26702669
return c;
26712670
}
2672-
return (0xff & left.getTypeByte()) - (0xff & right.getTypeByte());
2671+
return (0xff & right.getTypeByte()) - (0xff & left.getTypeByte());
26732672
}
26742673

26752674
@Override
26762675
public byte[] calcIndexKey(byte[] lastKeyOfPreviousBlock, byte[] firstKeyInBlock) {
26772676
return firstKeyInBlock;
26782677
}
2679-
26802678
}
26812679

26822680
/**

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)