Skip to content

Commit 69232fd

Browse files
committed
Enable compressible address encoding for off-heap mode.
1 parent 7ee918e commit 69232fd

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,8 @@ public void free(MemoryBlock memory) {
175175
* This address will remain valid as long as the corresponding page has not been freed.
176176
*/
177177
public long encodePageNumberAndOffset(MemoryBlock page, long offsetInPage) {
178-
if (inHeap) {
179-
assert (page.pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
180-
return (((long) page.pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
181-
} else {
182-
return offsetInPage;
183-
}
178+
assert (page.pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
179+
return (((long) page.pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
184180
}
185181

186182
/**
@@ -204,10 +200,13 @@ public Object getPage(long pagePlusOffsetAddress) {
204200
* {@link TaskMemoryManager#encodePageNumberAndOffset(MemoryBlock, long)}
205201
*/
206202
public long getOffsetInPage(long pagePlusOffsetAddress) {
203+
final long offsetInPage = (pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS);
207204
if (inHeap) {
208-
return (pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS);
205+
return offsetInPage;
209206
} else {
210-
return pagePlusOffsetAddress;
207+
final int pageNumber = (int) ((pagePlusOffsetAddress & MASK_LONG_UPPER_13_BITS) >>> 51);
208+
assert (pageNumber >= 0 && pageNumber < PAGE_TABLE_SIZE);
209+
return pageTable[pageNumber].getBaseOffset() + offsetInPage;
211210
}
212211
}
213212

unsafe/src/test/java/org/apache/spark/unsafe/memory/TaskMemoryManagerSuite.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,24 @@ public void leakedPageMemoryIsDetected() {
3838
Assert.assertEquals(4096, manager.cleanUpAllAllocatedMemory());
3939
}
4040

41+
@Test
42+
public void encodePageNumberAndOffsetOffHeap() {
43+
final TaskMemoryManager manager =
44+
new TaskMemoryManager(new ExecutorMemoryManager(MemoryAllocator.UNSAFE));
45+
final MemoryBlock dataPage = manager.allocatePage(256);
46+
final long encodedAddress = manager.encodePageNumberAndOffset(dataPage, 64);
47+
Assert.assertEquals(null, manager.getPage(encodedAddress));
48+
Assert.assertEquals(dataPage.getBaseOffset() + 64, manager.getOffsetInPage(encodedAddress));
49+
}
50+
51+
@Test
52+
public void encodePageNumberAndOffsetOnHeap() {
53+
final TaskMemoryManager manager =
54+
new TaskMemoryManager(new ExecutorMemoryManager(MemoryAllocator.HEAP));
55+
final MemoryBlock dataPage = manager.allocatePage(256);
56+
final long encodedAddress = manager.encodePageNumberAndOffset(dataPage, 64);
57+
Assert.assertEquals(dataPage.getBaseObject(), manager.getPage(encodedAddress));
58+
Assert.assertEquals(64, manager.getOffsetInPage(encodedAddress));
59+
}
60+
4161
}

0 commit comments

Comments
 (0)