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

lzljs3620320 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 936a84239 [core] Fix NoSuchElementException when enable partition mark 
done (#4356)
936a84239 is described below

commit 936a8423916a479489530dab4116eb8f7b077d47
Author: WenjunMin <[email protected]>
AuthorDate: Mon Oct 21 23:22:09 2024 +0800

    [core] Fix NoSuchElementException when enable partition mark done (#4356)
---
 .../sink/partition/PartitionMarkDoneTrigger.java   |  5 +++-
 .../paimon/flink/sink/CommitterOperatorTest.java   | 30 ++++++++++++++++++++++
 .../flink/sink/CommitterOperatorTestBase.java      |  9 +++++--
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDoneTrigger.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDoneTrigger.java
index 24823a789..5b1b53d63 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDoneTrigger.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDoneTrigger.java
@@ -183,7 +183,10 @@ public class PartitionMarkDoneTrigger {
         public List<String> restore() throws Exception {
             List<String> pendingPartitions = new ArrayList<>();
             if (isRestored) {
-                
pendingPartitions.addAll(pendingPartitionsState.get().iterator().next());
+                Iterator<List<String>> state = 
pendingPartitionsState.get().iterator();
+                if (state.hasNext()) {
+                    pendingPartitions.addAll(state.next());
+                }
             }
             return pendingPartitions;
         }
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTest.java
index b2764fc37..c96db63cb 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTest.java
@@ -22,6 +22,7 @@ import org.apache.paimon.CoreOptions;
 import org.apache.paimon.Snapshot;
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.GenericRow;
+import org.apache.paimon.flink.FlinkConnectorOptions;
 import org.apache.paimon.flink.utils.TestingMetricUtils;
 import org.apache.paimon.fs.local.LocalFileIO;
 import org.apache.paimon.io.CompactIncrement;
@@ -37,6 +38,7 @@ import org.apache.paimon.table.sink.StreamWriteBuilder;
 import org.apache.paimon.utils.SnapshotManager;
 import org.apache.paimon.utils.ThrowingConsumer;
 
+import org.apache.paimon.shade.guava30.com.google.common.collect.ImmutableMap;
 import org.apache.paimon.shade.guava30.com.google.common.collect.Lists;
 
 import org.apache.flink.api.common.ExecutionConfig;
@@ -281,6 +283,34 @@ public class CommitterOperatorTest extends 
CommitterOperatorTestBase {
         
Assertions.assertThat(actual).hasSameElementsAs(Lists.newArrayList(commitUser));
     }
 
+    @Test
+    public void testRestoreEmptyMarkDoneState() throws Exception {
+        FileStoreTable table = createFileStoreTable(o -> {}, 
Collections.singletonList("b"));
+
+        String commitUser = UUID.randomUUID().toString();
+
+        // 1. Generate operatorSubtaskState
+        OperatorSubtaskState snapshot;
+        {
+            OneInputStreamOperatorTestHarness<Committable, Committable> 
testHarness =
+                    createLossyTestHarness(table, commitUser);
+
+            testHarness.open();
+            snapshot = writeAndSnapshot(table, commitUser, 1, 1, testHarness);
+            testHarness.close();
+        }
+        // 2. enable mark done.
+        table =
+                table.copy(
+                        ImmutableMap.of(
+                                
FlinkConnectorOptions.PARTITION_IDLE_TIME_TO_DONE.key(), "1h"));
+
+        // 3. restore from state.
+        OneInputStreamOperatorTestHarness<Committable, Committable> 
testHarness =
+                createLossyTestHarness(table);
+        testHarness.initializeState(snapshot);
+    }
+
     @Test
     public void testCommitInputEnd() throws Exception {
         FileStoreTable table = createFileStoreTable();
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTestBase.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTestBase.java
index 77b53ba70..a69f8dbd3 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTestBase.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/CommitterOperatorTestBase.java
@@ -88,10 +88,15 @@ public abstract class CommitterOperatorTestBase {
     }
 
     protected FileStoreTable createFileStoreTable() throws Exception {
-        return createFileStoreTable(options -> {});
+        return createFileStoreTable(options -> {}, Collections.emptyList());
     }
 
     protected FileStoreTable createFileStoreTable(Consumer<Options> 
setOptions) throws Exception {
+        return createFileStoreTable(setOptions, Collections.emptyList());
+    }
+
+    protected FileStoreTable createFileStoreTable(
+            Consumer<Options> setOptions, List<String> partitionKeys) throws 
Exception {
         Options conf = new Options();
         conf.set(CoreOptions.PATH, tablePath.toString());
         conf.setString("bucket", "1");
@@ -101,7 +106,7 @@ public abstract class CommitterOperatorTestBase {
         schemaManager.createTable(
                 new Schema(
                         ROW_TYPE.getFields(),
-                        Collections.emptyList(),
+                        partitionKeys,
                         Collections.emptyList(),
                         conf.toMap(),
                         ""));

Reply via email to