[
https://issues.apache.org/jira/browse/FLINK-40562?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18115816#comment-18115816
]
Aaron He commented on FLINK-40562:
----------------------------------
h3. Included in FLINK-40559
The pathless restore-settings reconstruction issue is included in
[FLINK-40559|https://issues.apache.org/jira/browse/FLINK-40559] / [PR
#29109|https://github.com/apache/flink/pull/29109].
The shared SavepointRestoreSettings.fromConfiguration fix preserves explicit
claim modes without a savepoint path for both application graph
generation/submission and session CLI reconstruction. Tests cover deprecated
alias precedence, explicit-value presence, nullable allowNonRestoredState,
StreamGraphGenerator, and PipelineExecutorUtils.
All 109 targeted tests pass on JDK 17, with Spotless and Checkstyle passing. No
claim is made about retroactively changing persisted HA graphs or unrun cluster
recovery scenarios.
> Preserve pathless claim mode across configuration round trips
> -------------------------------------------------------------
>
> Key: FLINK-40562
> URL: https://issues.apache.org/jira/browse/FLINK-40562
> Project: Flink
> Issue Type: Improvement
> Components: Client / Job Submission
> Reporter: Aaron He
> Priority: Minor
>
> h2. Problem
> {{SavepointRestoreSettings.fromConfiguration()}} returns {{none()}} whenever
> {{StateRecoveryOptions.SAVEPOINT_PATH}} is absent, even when
> {{StateRecoveryOptions.RESTORE_MODE}} is explicitly configured.
> The reconstructed settings therefore report the default {{NO_CLAIM}} instead
> of an explicitly configured {{CLAIM}}. Serializing those settings into a
> fresh {{Configuration}} also loses the explicit mode.
> This is the configuration-reconstruction follow-up described in the "Related
> but out of scope" section of
> [FLINK-40559|https://issues.apache.org/jira/browse/FLINK-40559]. It is
> separate from registering and parsing the command-line options.
> Session-mode submission is the motivating path, but the affected method is
> shared code, not a session-only implementation. Other callers that
> reconstruct settings from a configuration without a savepoint path can
> encounter the same loss. This report does not establish the end-to-end impact
> for every deployment mode.
> h2. Minimal example
> The behavior follows directly from the current implementation and is
> explicitly asserted by the existing {{testFromConfigurationWithNoPath}}.
> Source inspected on {{master}} at
> [3593f080f09fb9f974dca62279a98cc16505acb9|https://github.com/apache/flink/commit/3593f080f09fb9f974dca62279a98cc16505acb9].
> This report does not claim an end-to-end cluster reproduction.
> {noformat}
> Configuration input = new Configuration();
> input.set(StateRecoveryOptions.RESTORE_MODE, RecoveryClaimMode.CLAIM);
> // No StateRecoveryOptions.SAVEPOINT_PATH.
> SavepointRestoreSettings settings =
> SavepointRestoreSettings.fromConfiguration(input);
> settings.restoreSavepoint(); // false
> settings.getRecoveryClaimMode(); // NO_CLAIM, although input contains CLAIM
> Configuration output = new Configuration();
> SavepointRestoreSettings.toConfiguration(settings, output);
> output.containsKey(StateRecoveryOptions.RESTORE_MODE.key()); // false
> {noformat}
> The input configuration is not modified. The loss occurs in the reconstructed
> settings and in a subsequent serialization to a fresh configuration.
> h2. Submission-path relevance
> After the parser changes proposed in
> [apache/flink#29109|https://github.com/apache/flink/pull/29109] for
> FLINK-40559:
> # {{ProgramOptions}} can hold a claim mode without a savepoint path.
> # {{ProgramOptions.applyToConfiguration()}} serializes that explicit mode.
> # {{ExecutionConfigAccessor.getSavepointRestoreSettings()}} calls
> {{SavepointRestoreSettings.fromConfiguration()}} and loses the mode because
> the path is absent.
> # {{PipelineExecutorUtils}} uses the reconstructed settings when preparing
> the {{StreamGraph}}.
> An illustrative CLI input for this path is:
> {noformat}
> bin/flink run --claimMode CLAIM job.jar
> {noformat}
> On master before FLINK-40559, the parser can already drop the pathless
> option; that is a separate, earlier loss. The direct configuration example
> above isolates this issue without depending on the parser fix.
> h2. Proposed behavior and scope
> Preserve an explicitly configured recovery claim mode when reconstructing
> settings without a savepoint path, while keeping {{restoreSavepoint()}} false
> and {{getRestorePath()}} null. The pathless factory proposed in FLINK-40559
> could be reused once available.
> Preserve the explicit/unset distinction introduced by FLINK-39673:
> * Explicit {{CLAIM}} and explicit {{NO_CLAIM}} must both survive
> reconstruction and serialization into a fresh configuration.
> * An absent claim mode must not become an explicitly written default.
> * An absent {{SAVEPOINT_IGNORE_UNCLAIMED_STATE}} must not become an
> explicitly written false value.
> * Existing with-savepoint behavior must remain unchanged.
> The existing {{testFromConfigurationWithNoPath}} deliberately expects
> {{none()}} despite a configured {{CLAIM}}. This proposal changes that
> contract, not just an untested branch. Maintainer agreement is needed on
> supporting pathless claim mode in general configuration consumers and session
> submission. Retaining the value alone does not establish that every execution
> path uses it during HA recovery.
> The intended scope is configuration reconstruction and propagation, not
> changing checkpoint ownership rules or making a new job restore state without
> a restore source.
> h2. Suggested coverage
> * Runtime configuration round trips without a path, covering explicit
> {{CLAIM}}, explicit {{NO_CLAIM}}, and absent mode; inspect key presence as
> well as effective values.
> * Preserve the existing explicit/unset semantics for the
> allow-non-restored-state option.
> * Client coverage through {{ProgramOptions}} and {{ExecutionConfigAccessor}},
> rather than only invoking the CLI parser directly, after FLINK-40559.
> * Retain coverage for settings with a savepoint path.
> h2. Related issues and duplicate search
> Searched Apache Flink Jira across all statuses on 2026-09-05 using claimMode,
> restoreMode, "claim mode", "restore mode", SavepointRestoreSettings,
> ExecutionConfigAccessor, the claim-mode configuration key, and
> pathless/fromConfiguration terms. No separate exact duplicate was found; this
> is not a guarantee that no differently worded report exists.
> * [FLINK-40559|https://issues.apache.org/jira/browse/FLINK-40559] (Open):
> parent context; explicitly excludes this reconstruction issue.
> * [FLINK-26316|https://issues.apache.org/jira/browse/FLINK-26316] (Open):
> dynamic savepoint configuration overwritten by {{none()}} during
> {{ProgramOptions.applyToConfiguration()}}, rather than a configured mode
> discarded during reconstruction.
> * [FLINK-34015|https://issues.apache.org/jira/browse/FLINK-34015] (Open):
> dynamic properties overwritten by CLI defaults; its discussion describes a
> restore path supplied via dynamic configuration.
> * [FLINK-39673|https://issues.apache.org/jira/browse/FLINK-39673] (Closed,
> Fixed): prevents unspecified defaults from overriding user configuration
> during serialization. Its explicit/unset semantics must be preserved.
> * [FLINK-28651|https://issues.apache.org/jira/browse/FLINK-28651] (Closed,
> Fixed): REST {{JarRunHandler}} choosing a default instead of the configured
> restore mode, a different consumer and failure point.
> h2. Source references
> * [SavepointRestoreSettings.fromConfiguration() and
> toConfiguration()|https://github.com/apache/flink/blob/3593f080f09fb9f974dca62279a98cc16505acb9/flink-runtime/src/main/java/org/apache/flink/runtime/jobgraph/SavepointRestoreSettings.java]
> * [Existing
> testFromConfigurationWithNoPath|https://github.com/apache/flink/blob/3593f080f09fb9f974dca62279a98cc16505acb9/flink-runtime/src/test/java/org/apache/flink/runtime/jobgraph/SavepointRestoreSettingsTest.java]
> *
> [ProgramOptions.applyToConfiguration()|https://github.com/apache/flink/blob/3593f080f09fb9f974dca62279a98cc16505acb9/flink-clients/src/main/java/org/apache/flink/client/cli/ProgramOptions.java#L179-L189]
> *
> [ExecutionConfigAccessor.getSavepointRestoreSettings()|https://github.com/apache/flink/blob/3593f080f09fb9f974dca62279a98cc16505acb9/flink-clients/src/main/java/org/apache/flink/client/cli/ExecutionConfigAccessor.java#L93-L95]
> * [PipelineExecutorUtils propagation to
> StreamGraph|https://github.com/apache/flink/blob/3593f080f09fb9f974dca62279a98cc16505acb9/flink-clients/src/main/java/org/apache/flink/client/deployment/executors/PipelineExecutorUtils.java#L107-L110]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)