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

ferenc-csaky pushed a commit to branch release-1.20
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/release-1.20 by this push:
     new a7fbb7d5210 [FLINK-40143][core] Fix displayed restart strategy for 
config option based restart strategies
a7fbb7d5210 is described below

commit a7fbb7d521076dddf6f48dc04d123721362c12fb
Author: csurong <[email protected]>
AuthorDate: Thu Aug 6 21:13:26 2026 +0800

    [FLINK-40143][core] Fix displayed restart strategy for config option based 
restart strategies
    
    Generated-by: OpenAI Codex (GPT-5)
    Co-authored-by: caosurong <[email protected]>
---
 .../flink/api/common/ArchivedExecutionConfig.java  | 21 +++--
 .../flink/api/common/ExecutionConfigTest.java      | 94 ++++++++++++++++++++++
 2 files changed, 110 insertions(+), 5 deletions(-)

diff --git 
a/flink-core/src/main/java/org/apache/flink/api/common/ArchivedExecutionConfig.java
 
b/flink-core/src/main/java/org/apache/flink/api/common/ArchivedExecutionConfig.java
index a2690c0d351..c0ead2dc3ae 100644
--- 
a/flink-core/src/main/java/org/apache/flink/api/common/ArchivedExecutionConfig.java
+++ 
b/flink-core/src/main/java/org/apache/flink/api/common/ArchivedExecutionConfig.java
@@ -19,6 +19,7 @@
 package org.apache.flink.api.common;
 
 import org.apache.flink.annotation.Internal;
+import org.apache.flink.api.common.restartstrategy.RestartStrategies;
 
 import java.io.Serializable;
 import java.util.Collections;
@@ -44,11 +45,7 @@ public class ArchivedExecutionConfig implements Serializable 
{
 
     public ArchivedExecutionConfig(ExecutionConfig ec) {
         executionMode = ec.getExecutionMode().name();
-        if (ec.getRestartStrategy() != null) {
-            restartStrategyDescription = 
ec.getRestartStrategy().getDescription();
-        } else {
-            restartStrategyDescription = "default";
-        }
+        restartStrategyDescription = getRestartStrategyDescription(ec);
         maxParallelism = ec.getMaxParallelism();
         parallelism = ec.getParallelism();
         objectReuseEnabled = ec.isObjectReuseEnabled();
@@ -60,6 +57,20 @@ public class ArchivedExecutionConfig implements Serializable 
{
         }
     }
 
+    private static String getRestartStrategyDescription(ExecutionConfig ec) {
+        final RestartStrategies.RestartStrategyConfiguration restartStrategy =
+                ec.getRestartStrategy();
+        if (restartStrategy != null
+                && !(restartStrategy
+                        instanceof 
RestartStrategies.FallbackRestartStrategyConfiguration)) {
+            return restartStrategy.getDescription();
+        }
+
+        return RestartStrategies.fromConfiguration(ec.toConfiguration())
+                
.map(RestartStrategies.RestartStrategyConfiguration::getDescription)
+                .orElse(restartStrategy != null ? 
restartStrategy.getDescription() : "default");
+    }
+
     public ArchivedExecutionConfig(
             String executionMode,
             String restartStrategyDescription,
diff --git 
a/flink-core/src/test/java/org/apache/flink/api/common/ExecutionConfigTest.java 
b/flink-core/src/test/java/org/apache/flink/api/common/ExecutionConfigTest.java
index d035df43a64..e63bd11a47d 100644
--- 
a/flink-core/src/test/java/org/apache/flink/api/common/ExecutionConfigTest.java
+++ 
b/flink-core/src/test/java/org/apache/flink/api/common/ExecutionConfigTest.java
@@ -27,6 +27,7 @@ import org.apache.flink.api.java.typeutils.GenericTypeInfo;
 import org.apache.flink.api.java.typeutils.runtime.kryo.KryoSerializer;
 import org.apache.flink.configuration.Configuration;
 import org.apache.flink.configuration.JobManagerOptions;
+import org.apache.flink.configuration.RestartStrategyOptions;
 import org.apache.flink.core.testutils.CommonTestUtils;
 import org.apache.flink.util.SerializedValue;
 
@@ -37,6 +38,7 @@ import com.esotericsoftware.kryo.io.Output;
 import org.junit.jupiter.api.Test;
 
 import java.io.Serializable;
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -175,6 +177,98 @@ public class ExecutionConfigTest {
         assertThat(executionConfig).isEqualTo(new ExecutionConfig());
     }
 
+    @Test
+    void testArchiveUsesRestartStrategyConfiguredViaConfigOptions() {
+        
assertThat(archiveRestartStrategyDescription(fixedDelayRestartConfiguration()))
+                .isEqualTo("Restart with fixed delay (PT1M). #10 restart 
attempts.");
+
+        Configuration noRestartConfiguration = new Configuration();
+        noRestartConfiguration.set(
+                RestartStrategyOptions.RESTART_STRATEGY,
+                
RestartStrategyOptions.RestartStrategyType.NO_RESTART_STRATEGY.getMainValue());
+        assertThat(archiveRestartStrategyDescription(noRestartConfiguration))
+                .isEqualTo("Restart deactivated.");
+
+        Configuration failureRateConfiguration = new Configuration();
+        failureRateConfiguration.set(
+                RestartStrategyOptions.RESTART_STRATEGY,
+                
RestartStrategyOptions.RestartStrategyType.FAILURE_RATE.getMainValue());
+        failureRateConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_FAILURE_RATE_MAX_FAILURES_PER_INTERVAL, 
7);
+        failureRateConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_FAILURE_RATE_FAILURE_RATE_INTERVAL,
+                Duration.ofMinutes(2));
+        failureRateConfiguration.set(
+                RestartStrategyOptions.RESTART_STRATEGY_FAILURE_RATE_DELAY, 
Duration.ofSeconds(3));
+        assertThat(archiveRestartStrategyDescription(failureRateConfiguration))
+                .isEqualTo(
+                        "Failure rate restart with maximum of 7 failures 
within interval PT2M and fixed delay PT3S.");
+
+        Configuration exponentialDelayConfiguration = new Configuration();
+        exponentialDelayConfiguration.set(
+                RestartStrategyOptions.RESTART_STRATEGY,
+                
RestartStrategyOptions.RestartStrategyType.EXPONENTIAL_DELAY.getMainValue());
+        exponentialDelayConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_EXPONENTIAL_DELAY_INITIAL_BACKOFF,
+                Duration.ofSeconds(1));
+        exponentialDelayConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_EXPONENTIAL_DELAY_MAX_BACKOFF,
+                Duration.ofMinutes(1));
+        exponentialDelayConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_EXPONENTIAL_DELAY_BACKOFF_MULTIPLIER, 
2.0);
+        exponentialDelayConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_EXPONENTIAL_DELAY_RESET_BACKOFF_THRESHOLD,
+                Duration.ofHours(1));
+        exponentialDelayConfiguration.set(
+                
RestartStrategyOptions.RESTART_STRATEGY_EXPONENTIAL_DELAY_JITTER_FACTOR, 0.3);
+        
assertThat(archiveRestartStrategyDescription(exponentialDelayConfiguration))
+                .isEqualTo(
+                        "Restart with exponential delay: starting at PT1S, 
increasing by 2.000000, with maximum PT1M. "
+                                + "Delay resets after PT1H with jitter 
0.300000");
+    }
+
+    @Test
+    void testArchivePrefersExplicitRestartStrategyOverConfigOptions() {
+        ExecutionConfig executionConfig = new 
ExecutionConfig(fixedDelayRestartConfiguration());
+        executionConfig.setRestartStrategy(RestartStrategies.noRestart());
+
+        assertThat(executionConfig.archive().getRestartStrategyDescription())
+                .isEqualTo("Restart deactivated.");
+    }
+
+    @Test
+    void testArchiveUsesFallbackRestartStrategyWithoutConfigOptions() {
+        assertThat(new 
ExecutionConfig().archive().getRestartStrategyDescription())
+                .isEqualTo("Cluster level default restart strategy");
+    }
+
+    @Test
+    void testArchiveKeepsLegacyExecutionRetryRestartStrategy() {
+        ExecutionConfig executionConfig = new ExecutionConfig();
+        executionConfig.setNumberOfExecutionRetries(4);
+        executionConfig.setExecutionRetryDelay(123);
+
+        assertThat(executionConfig.archive().getRestartStrategyDescription())
+                .isEqualTo("Restart with fixed delay (PT0.123S). #4 restart 
attempts.");
+    }
+
+    private String archiveRestartStrategyDescription(Configuration 
configuration) {
+        ExecutionConfig executionConfig = new ExecutionConfig();
+        executionConfig.configure(configuration, 
ExecutionConfigTest.class.getClassLoader());
+        return executionConfig.archive().getRestartStrategyDescription();
+    }
+
+    private Configuration fixedDelayRestartConfiguration() {
+        Configuration configuration = new Configuration();
+        configuration.set(
+                RestartStrategyOptions.RESTART_STRATEGY,
+                
RestartStrategyOptions.RestartStrategyType.FIXED_DELAY.getMainValue());
+        
configuration.set(RestartStrategyOptions.RESTART_STRATEGY_FIXED_DELAY_ATTEMPTS, 
10);
+        configuration.set(
+                RestartStrategyOptions.RESTART_STRATEGY_FIXED_DELAY_DELAY, 
Duration.ofMinutes(1));
+        return configuration;
+    }
+
     @Test
     void testLoadingRegisteredKryoTypesFromConfiguration() {
         ExecutionConfig configFromSetters = new ExecutionConfig();

Reply via email to