Skip to content

Commit e58a6b4

Browse files
committed
Add more tests for PackedRecordPointer encoding.
1 parent 4f0b770 commit e58a6b4

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

core/src/test/java/org/apache/spark/shuffle/unsafe/PackedRecordPointerSuite.java

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717

1818
package org.apache.spark.shuffle.unsafe;
1919

20-
import org.junit.Assert;
2120
import org.junit.Test;
21+
import static org.junit.Assert.*;
2222

2323
import org.apache.spark.unsafe.memory.ExecutorMemoryManager;
2424
import org.apache.spark.unsafe.memory.MemoryAllocator;
2525
import org.apache.spark.unsafe.memory.MemoryBlock;
2626
import org.apache.spark.unsafe.memory.TaskMemoryManager;
27+
import static org.apache.spark.shuffle.unsafe.PackedRecordPointer.*;
2728

2829
public class PackedRecordPointerSuite {
2930

@@ -36,8 +37,8 @@ public void heap() {
3637
final long addressInPage1 = memoryManager.encodePageNumberAndOffset(page1, 42);
3738
PackedRecordPointer packedPointer = new PackedRecordPointer();
3839
packedPointer.set(PackedRecordPointer.packPointer(addressInPage1, 360));
39-
Assert.assertEquals(360, packedPointer.getPartitionId());
40-
Assert.assertEquals(addressInPage1, packedPointer.getRecordPointer());
40+
assertEquals(360, packedPointer.getPartitionId());
41+
assertEquals(addressInPage1, packedPointer.getRecordPointer());
4142
memoryManager.cleanUpAllAllocatedMemory();
4243
}
4344

@@ -50,8 +51,43 @@ public void offHeap() {
5051
final long addressInPage1 = memoryManager.encodePageNumberAndOffset(page1, 42);
5152
PackedRecordPointer packedPointer = new PackedRecordPointer();
5253
packedPointer.set(PackedRecordPointer.packPointer(addressInPage1, 360));
53-
Assert.assertEquals(360, packedPointer.getPartitionId());
54-
Assert.assertEquals(addressInPage1, packedPointer.getRecordPointer());
54+
assertEquals(360, packedPointer.getPartitionId());
55+
assertEquals(addressInPage1, packedPointer.getRecordPointer());
5556
memoryManager.cleanUpAllAllocatedMemory();
5657
}
58+
59+
@Test
60+
public void maximumPartitionIdCanBeEncoded() {
61+
PackedRecordPointer packedPointer = new PackedRecordPointer();
62+
packedPointer.set(PackedRecordPointer.packPointer(0, MAXIMUM_PARTITION_ID));
63+
assertEquals(MAXIMUM_PARTITION_ID, packedPointer.getPartitionId());
64+
}
65+
66+
@Test
67+
public void partitionIdsGreaterThanMaximumPartitionIdWillOverflowOrTriggerError() {
68+
PackedRecordPointer packedPointer = new PackedRecordPointer();
69+
try {
70+
// Pointers greater than the maximum partition ID will overflow or trigger an assertion error
71+
packedPointer.set(PackedRecordPointer.packPointer(0, MAXIMUM_PARTITION_ID + 1));
72+
assertFalse(MAXIMUM_PARTITION_ID + 1 == packedPointer.getPartitionId());
73+
} catch (AssertionError e ) {
74+
// pass
75+
}
76+
}
77+
78+
@Test
79+
public void maximumOffsetInPageCanBeEncoded() {
80+
PackedRecordPointer packedPointer = new PackedRecordPointer();
81+
long address = TaskMemoryManager.encodePageNumberAndOffset(0, MAXIMUM_PAGE_SIZE_BYTES - 1);
82+
packedPointer.set(PackedRecordPointer.packPointer(address, 0));
83+
assertEquals(address, packedPointer.getRecordPointer());
84+
}
85+
86+
@Test
87+
public void offsetsPastMaxOffsetInPageWillOverflow() {
88+
PackedRecordPointer packedPointer = new PackedRecordPointer();
89+
long address = TaskMemoryManager.encodePageNumberAndOffset(0, MAXIMUM_PAGE_SIZE_BYTES);
90+
packedPointer.set(PackedRecordPointer.packPointer(address, 0));
91+
assertEquals(0, packedPointer.getRecordPointer());
92+
}
5793
}

core/src/test/java/org/apache/spark/shuffle/unsafe/UnsafeShuffleWriterSuite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
import org.mockito.MockitoAnnotations;
3636
import org.mockito.invocation.InvocationOnMock;
3737
import org.mockito.stubbing.Answer;
38-
import static org.junit.Assert.*;
3938
import static org.hamcrest.MatcherAssert.assertThat;
4039
import static org.hamcrest.Matchers.greaterThan;
4140
import static org.hamcrest.Matchers.lessThan;
41+
import static org.junit.Assert.*;
4242
import static org.mockito.AdditionalAnswers.returnsFirstArg;
4343
import static org.mockito.Answers.RETURNS_SMART_NULLS;
4444
import static org.mockito.Mockito.*;

unsafe/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
<groupId>com.google.code.findbugs</groupId>
4343
<artifactId>jsr305</artifactId>
4444
</dependency>
45+
<dependency>
46+
<groupId>com.google.guava</groupId>
47+
<artifactId>guava</artifactId>
48+
</dependency>
4549

4650
<!-- Provided dependencies -->
4751
<dependency>

unsafe/src/main/java/org/apache/spark/unsafe/memory/TaskMemoryManager.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.*;
2121

22+
import com.google.common.annotations.VisibleForTesting;
2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425

@@ -169,8 +170,13 @@ public void free(MemoryBlock memory) {
169170
* This address will remain valid as long as the corresponding page has not been freed.
170171
*/
171172
public long encodePageNumberAndOffset(MemoryBlock page, long offsetInPage) {
172-
assert (page.pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
173-
return (((long) page.pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
173+
return encodePageNumberAndOffset(page.pageNumber, offsetInPage);
174+
}
175+
176+
@VisibleForTesting
177+
public static long encodePageNumberAndOffset(int pageNumber, long offsetInPage) {
178+
assert (pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
179+
return (((long) pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
174180
}
175181

176182
/**

0 commit comments

Comments
 (0)