This is an automated email from the ASF dual-hosted git repository.

fresh-borzoni pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git


The following commit(s) were added to refs/heads/main by this push:
     new bb0694c98 [client] Initialize lake comparator before merge read (#3406)
bb0694c98 is described below

commit bb0694c9829e0f11f916dd7051cbf5d9b9e61cd7
Author: yuxia Luo <[email protected]>
AuthorDate: Sat May 30 00:14:17 2026 +0800

    [client] Initialize lake comparator before merge read (#3406)
---
 .../batch/LakeSnapshotAndLogSplitScanner.java      | 59 +++++++++++-----------
 1 file changed, 30 insertions(+), 29 deletions(-)

diff --git 
a/fluss-client/src/main/java/org/apache/fluss/client/table/scanner/batch/LakeSnapshotAndLogSplitScanner.java
 
b/fluss-client/src/main/java/org/apache/fluss/client/table/scanner/batch/LakeSnapshotAndLogSplitScanner.java
index f25b878d3..15352f63b 100644
--- 
a/fluss-client/src/main/java/org/apache/fluss/client/table/scanner/batch/LakeSnapshotAndLogSplitScanner.java
+++ 
b/fluss-client/src/main/java/org/apache/fluss/client/table/scanner/batch/LakeSnapshotAndLogSplitScanner.java
@@ -54,6 +54,7 @@ public class LakeSnapshotAndLogSplitScanner implements 
BatchScanner {
     private final @Nullable List<LakeSplit> lakeSplits;
     private Comparator<InternalRow> rowComparator;
     private List<CloseableIterator<LogRecord>> lakeRecordIterators = new 
ArrayList<>();
+    private boolean lakeRecordIteratorsInitialized;
     private final LakeSource<LakeSplit> lakeSource;
 
     private final int[] pkIndexes;
@@ -155,16 +156,7 @@ public class LakeSnapshotAndLogSplitScanner implements 
BatchScanner {
     @Override
     public CloseableIterator<InternalRow> pollBatch(Duration timeout) throws 
IOException {
         if (logScanFinished) {
-            if (lakeRecordIterators.isEmpty()) {
-                if (lakeSplits == null || lakeSplits.isEmpty()) {
-                    lakeRecordIterators = Collections.emptyList();
-                } else {
-                    for (LakeSplit lakeSplit : lakeSplits) {
-                        lakeRecordIterators.add(
-                                lakeSource.createRecordReader(() -> 
lakeSplit).read());
-                    }
-                }
-            }
+            initializeLakeRecordIterators();
             if (currentSortMergeReader == null) {
                 currentSortMergeReader =
                         new SortMergeReader(
@@ -179,25 +171,8 @@ public class LakeSnapshotAndLogSplitScanner implements 
BatchScanner {
             }
             return currentSortMergeReader.readBatch();
         } else {
-            if (lakeRecordIterators.isEmpty()) {
-                List<RecordReader> recordReaders = new ArrayList<>();
-                if (lakeSplits == null || lakeSplits.isEmpty()) {
-                    // pass null split to get rowComparator
-                    recordReaders.add(lakeSource.createRecordReader(() -> 
null));
-                } else {
-                    for (LakeSplit lakeSplit : lakeSplits) {
-                        recordReaders.add(lakeSource.createRecordReader(() -> 
lakeSplit));
-                    }
-                }
-                for (RecordReader reader : recordReaders) {
-                    if (reader instanceof SortedRecordReader) {
-                        rowComparator = ((SortedRecordReader) reader).order();
-                    } else {
-                        throw new UnsupportedOperationException(
-                                "lake records must instance of sorted view.");
-                    }
-                    lakeRecordIterators.add(reader.read());
-                }
+            initializeLakeRecordIterators();
+            if (logRows == null) {
                 logRows = new TreeMap<>(rowComparator);
             }
             pollLogRecords(timeout);
@@ -205,6 +180,32 @@ public class LakeSnapshotAndLogSplitScanner implements 
BatchScanner {
         }
     }
 
+    private void initializeLakeRecordIterators() throws IOException {
+        if (lakeRecordIteratorsInitialized) {
+            return;
+        }
+
+        List<RecordReader> recordReaders = new ArrayList<>();
+        if (lakeSplits == null || lakeSplits.isEmpty()) {
+            // pass null split to get rowComparator
+            recordReaders.add(lakeSource.createRecordReader(() -> null));
+        } else {
+            for (LakeSplit lakeSplit : lakeSplits) {
+                recordReaders.add(lakeSource.createRecordReader(() -> 
lakeSplit));
+            }
+        }
+        for (RecordReader reader : recordReaders) {
+            if (reader instanceof SortedRecordReader) {
+                rowComparator = ((SortedRecordReader) reader).order();
+            } else {
+                throw new UnsupportedOperationException(
+                        "lake records must instance of sorted view.");
+            }
+            lakeRecordIterators.add(reader.read());
+        }
+        lakeRecordIteratorsInitialized = true;
+    }
+
     private void pollLogRecords(Duration timeout) {
         ScanRecords scanRecords = logScanner.poll(timeout);
         for (ScanRecord scanRecord : scanRecords) {

Reply via email to