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");
+    }
 }

Reply via email to