[FLINK-40113][checkpoint] Reject restore when operators on a keyed vertex disagree on max parallelism#28714
Open
rionmonster wants to merge 1 commit into
Open
[FLINK-40113][checkpoint] Reject restore when operators on a keyed vertex disagree on max parallelism#28714rionmonster wants to merge 1 commit into
rionmonster wants to merge 1 commit into
Conversation
Collaborator
pnowojski
requested changes
Jul 13, 2026
5f94cad to
405995e
Compare
…rtex disagree on max parallelism During restore, each operator's recorded max parallelism is reconciled onto its shared vertex individually. When chaining has regrouped operators since the checkpoint, they can disagree, and the reconciliation silently keeps whichever value is applied last -- restoring a keyed operator under a foreign key-group count. Before the loop, verify that all operators chained into a vertex carrying keyed state agree, and fail with a clear error otherwise. The check spans all operators, since a non-keyed one's value can win the reconciliation and misroute a keyed operator's state. Adds ChainingMaxParallelismStateLossITCase covering both directions (explicit value below and above the chain head) on the HashMap and RocksDB backends.
pnowojski
approved these changes
Jul 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What is the purpose of the change
When operators are chained into a single vertex, each operator's recorded maximum parallelism is reconciled onto that shared vertex individually during state restore. Since FLINK-31996 relaxed chaining to allow operators with differing maximum parallelism to share a vertex, a keyed operator can be silently restored under a key-group count that is not its own if the chaining topology has changed since the checkpoint — its keyed state is then remapped through an incompatible
hash % maxParallelismlayout.Flink already rejects a single operator's incompatible maximum-parallelism change on restore, but never validates that operators sharing a vertex agree with each other, so the per-vertex reconciliation silently adopts whichever value is applied last. This change closes that consistency gap by rejecting such a restore with a clear error instead of restoring keyed state improperly.
Brief change log
checkMaxParallelismAgreementinStateAssignmentOperation, invoked before the per-operator reconciliation incheckParallelismPreconditions.IllegalStateExceptionwhen its operators recorded differing maximum parallelism. The comparison spans all chained operators, since a non-keyed operator's recorded value can win the reconciliation and misroute a keyed operator's state.ChainingMaxParallelismStateLossITCasecovering both directions (the downstream operator's explicit value below and above the chain head's) on the HashMap and RocksDB backends.StateAssignmentOperationTest#restoreRejectsKeyedVertexWithConflictingMaxParallelism, which drives the reconciliation directly and asserts rejection regardless of the order the operator states are reconciled.Verifying this change
This change added tests and can be verified as follows:
ChainingMaxParallelismStateLossITCasetakes a canonical savepoint with operator chaining disabled, so a keyed operator (akeyBychain head at an auto-derived maximum parallelism) and a downstream stateful operator (at a different explicit maximum parallelism) are separate vertices. It then restores with chaining enabled, so the downstream operator chains under the keyed head and the merged keyed vertex carries two differing recorded values, and asserts the restore is rejected with the new error for both directions (downstream value below and above the head's) and both state backends.StateAssignmentOperationTest#restoreRejectsKeyedVertexWithConflictingMaxParallelismdrives the reconciliation directly and asserts the restore is rejected regardless of the order in which the operator states are reconciled onto the vertex.StateAssignmentOperationTestandCheckpointCoordinatorRestoringTestcontinue to pass, confirming the new check is additive and runs only on restore.Does this pull request potentially affect one of the following parts:
@Public(Evolving): noDocumentation
Was generative AI tooling used to co-author this PR?
Generated-by: Claude Opus 4.8 (1M context)