Skip to content

Commit 1f34c07

Browse files
authored
fix: [branch-0.9] Avoid double free in CometUnifiedShuffleMemoryAllocator (#2201)
1 parent 2bf3dd1 commit 1f34c07

File tree

4 files changed

+17
-8
lines changed

4 files changed

+17
-8
lines changed

spark/src/main/java/org/apache/spark/shuffle/comet/CometBoundedShuffleMemoryAllocator.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,18 +146,21 @@ private synchronized MemoryBlock allocateMemoryBlock(long required) {
146146
return block;
147147
}
148148

149-
public synchronized void free(MemoryBlock block) {
150-
if (block.pageNumber == MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER) {
149+
public synchronized long free(MemoryBlock block) {
150+
if (block.pageNumber == MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER
151+
|| block.pageNumber == MemoryBlock.FREED_IN_TMM_PAGE_NUMBER) {
151152
// Already freed block
152-
return;
153+
return 0;
153154
}
154-
allocatedMemory -= block.size();
155+
long blockSize = block.size();
156+
allocatedMemory -= blockSize;
155157

156158
pageTable[block.pageNumber] = null;
157159
allocatedPages.clear(block.pageNumber);
158160
block.pageNumber = MemoryBlock.FREED_IN_TMM_PAGE_NUMBER;
159161

160162
allocator.free(block);
163+
return blockSize;
161164
}
162165

163166
/**

spark/src/main/java/org/apache/spark/shuffle/comet/CometShuffleMemoryAllocatorTrait.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ protected CometShuffleMemoryAllocatorTrait(
3333

3434
public abstract MemoryBlock allocate(long required);
3535

36-
public abstract void free(MemoryBlock block);
36+
public abstract long free(MemoryBlock block);
3737

3838
public abstract long getOffsetInPage(long pagePlusOffsetAddress);
3939

spark/src/main/java/org/apache/spark/shuffle/comet/CometUnifiedShuffleMemoryAllocator.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,15 @@ public synchronized MemoryBlock allocate(long required) {
5757
return this.allocatePage(required);
5858
}
5959

60-
public synchronized void free(MemoryBlock block) {
60+
public synchronized long free(MemoryBlock block) {
61+
if (block.pageNumber == MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER
62+
|| block.pageNumber == MemoryBlock.FREED_IN_TMM_PAGE_NUMBER) {
63+
// Already freed block
64+
return 0;
65+
}
66+
long blockSize = block.size();
6167
this.freePage(block);
68+
return blockSize;
6269
}
6370

6471
/**

spark/src/main/java/org/apache/spark/sql/comet/execution/shuffle/SpillWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ protected long doSpilling(
218218
public long freeMemory() {
219219
long freed = 0L;
220220
for (MemoryBlock block : allocatedPages) {
221-
freed += block.size();
222-
allocator.free(block);
221+
freed += allocator.free(block);
223222
}
224223
allocatedPages.clear();
225224
currentPage = null;

0 commit comments

Comments
 (0)