HBASE-18757 Fix improper bitwise & in bucketcache offset calculation
This correctly casts the operand to a long to avoid negative offsets created by sign extending the integer operand. Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
parent
7e1517545c
commit
cd1b964bb7
|
@ -1285,8 +1285,8 @@ public class BucketCache implements BlockCache, HeapSize {
|
||||||
}
|
}
|
||||||
|
|
||||||
long offset() { // Java has no unsigned numbers
|
long offset() { // Java has no unsigned numbers
|
||||||
long o = ((long) offsetBase) & 0xFFFFFFFF;
|
long o = ((long) offsetBase) & 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.
|
||||||
o += (((long) (offset1)) & 0xFF) << 32;
|
o += (((long) (offset1)) & 0xFF) << 32; //The 0xFF here does not need the L cast because it is treated as a positive int.
|
||||||
return o << 8;
|
return o << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -388,4 +388,13 @@ public class TestBucketCache {
|
||||||
long expectedOutput = (long) Math.floor(bucketCache.getAllocator().getTotalSize() * partitionFactor * minFactor);
|
long expectedOutput = (long) Math.floor(bucketCache.getAllocator().getTotalSize() * partitionFactor * minFactor);
|
||||||
assertEquals(expectedOutput, bucketCache.getPartitionSize(partitionFactor));
|
assertEquals(expectedOutput, bucketCache.getPartitionSize(partitionFactor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOffsetProducesPositiveOutput() {
|
||||||
|
//This number is picked because it produces negative output if the values isn't ensured to be positive.
|
||||||
|
//See HBASE-18757 for more information.
|
||||||
|
long testValue = 549888460800L;
|
||||||
|
BucketCache.BucketEntry bucketEntry = new BucketCache.BucketEntry(testValue, 10, 10L, true);
|
||||||
|
assertEquals(testValue, bucketEntry.offset());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue