Skip to content

Commit 18f3fe8

Browse files
zjw1111claude
andcommitted
fix: reset merge_function_wrapper in SortMergeReader::Close to prevent use-after-free
Move the merge_function_wrapper_->Reset() into SortMergeReader::Close() (both LoserTree and MinHeap variants) so that cached KeyValue data is released before underlying readers are destroyed. This prevents Arrow Buffer objects from calling Free() on a dangling pool pointer when SpillReader is later destructed. Also reorder the cleanup in MergeTreeCompactRewriter::RewriteCompaction to call reader->Close() before merge_file_split_read_.reset(), ensuring the Reset() triggered by Close() runs while all resource providers are still alive. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9f16343 commit 18f3fe8

4 files changed

Lines changed: 7 additions & 2 deletions

File tree

src/paimon/core/mergetree/compact/merge_tree_compact_rewriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,10 @@ Result<CompactResult> MergeTreeCompactRewriter::RewriteCompaction(
263263

264264
ScopeGuard write_guard([&]() -> void {
265265
rolling_writer->Abort();
266-
merge_file_split_read_.reset();
267266
for (const auto& reader : reader_holders) {
268267
reader->Close();
269268
}
269+
merge_file_split_read_.reset();
270270
});
271271

272272
for (const auto& section : sections) {

src/paimon/core/mergetree/compact/sort_merge_reader_with_loser_tree.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class SortMergeReaderWithLoserTree : public SortMergeReader {
5151

5252
void Close() override {
5353
loser_tree_->Close();
54+
if (merge_function_wrapper_) {
55+
merge_function_wrapper_->Reset();
56+
}
5457
}
5558

5659
class Iterator : public SortMergeReader::Iterator {

src/paimon/core/mergetree/compact/sort_merge_reader_with_min_heap.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ class SortMergeReaderWithMinHeap : public SortMergeReader {
7070
for (const auto& reader : readers_holder_) {
7171
reader->Close();
7272
}
73+
if (merge_function_wrapper_) {
74+
merge_function_wrapper_->Reset();
75+
}
7376
}
7477

7578
std::shared_ptr<Metrics> GetReaderMetrics() const override {

src/paimon/core/mergetree/merge_tree_writer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,6 @@ Status MergeTreeWriter::FlushWriteBuffer(bool wait_for_latest_compaction,
273273
ScopeGuard write_guard([&]() -> void {
274274
rolling_writer->Abort();
275275
async_key_value_producer_consumer->Close();
276-
merge_function_wrapper_->Reset();
277276
});
278277
while (true) {
279278
PAIMON_ASSIGN_OR_RAISE(KeyValueBatch key_value_batch,

0 commit comments

Comments
 (0)