This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new d2038c4c50 [core] Reject a merge fan-in below two up front (#10293)
d2038c4c50 is described below
commit d2038c4c500f8294322dcd1de55ce4b4ba373ca7
Author: YangJie <[email protected]>
AuthorDate: Thu Oct 1 21:44:45 2026 -0400
[core] Reject a merge fan-in below two up front (#10293)
---
.../org/apache/paimon/sort/AbstractBinaryExternalMerger.java | 9 +++++++++
.../org/apache/paimon/sort/BinaryExternalSortBufferTest.java | 9 +++++++++
2 files changed, 18 insertions(+)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/sort/AbstractBinaryExternalMerger.java
b/paimon-core/src/main/java/org/apache/paimon/sort/AbstractBinaryExternalMerger.java
index 417ec7a207..1526e8fe8e 100644
---
a/paimon-core/src/main/java/org/apache/paimon/sort/AbstractBinaryExternalMerger.java
+++
b/paimon-core/src/main/java/org/apache/paimon/sort/AbstractBinaryExternalMerger.java
@@ -18,6 +18,7 @@
package org.apache.paimon.sort;
+import org.apache.paimon.CoreOptions;
import org.apache.paimon.compression.BlockCompressionFactory;
import org.apache.paimon.data.AbstractPagedOutputView;
import org.apache.paimon.disk.ChannelReaderInputView;
@@ -37,6 +38,8 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import static org.apache.paimon.utils.Preconditions.checkArgument;
+
/**
* Spilled files Merger of {@link BinaryExternalSortBuffer}. It merges {@link
#maxFanIn} spilled
* files at most once.
@@ -64,6 +67,12 @@ public abstract class AbstractBinaryExternalMerger<Entry>
implements Closeable {
SpillChannelManager channelManager,
BlockCompressionFactory compressionCodecFactory,
int compressionBlockSize) {
+ checkArgument(
+ maxFanIn >= 2,
+ "The fan-in for external merge sort must be at least 2, but
was %s. "
+ + "Please adjust '%s'.",
+ maxFanIn,
+ CoreOptions.LOCAL_SORT_MAX_NUM_FILE_HANDLES.key());
this.ioManager = ioManager;
this.pageSize = pageSize;
this.maxFanIn = maxFanIn;
diff --git
a/paimon-core/src/test/java/org/apache/paimon/sort/BinaryExternalSortBufferTest.java
b/paimon-core/src/test/java/org/apache/paimon/sort/BinaryExternalSortBufferTest.java
index a23f5104cb..0c0cf20397 100644
---
a/paimon-core/src/test/java/org/apache/paimon/sort/BinaryExternalSortBufferTest.java
+++
b/paimon-core/src/test/java/org/apache/paimon/sort/BinaryExternalSortBufferTest.java
@@ -428,4 +428,13 @@ public class BinaryExternalSortBufferTest {
return row;
}
}
+
+ @Test
+ void testFanInBelowTwoFailsFast() {
+ // a fan-in of 1 previously overflowed the merge arithmetic at flush
time and
+ // restart-looped on the same config; it must be rejected up front
+ assertThatThrownBy(() -> createBuffer(1))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessageContaining("fan-in for external merge sort must be
at least 2");
+ }
}