[
https://issues.apache.org/jira/browse/FLINK-40120?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Weiqing Yang updated FLINK-40120:
---------------------------------
Description:
`RowDataSerializerSnapshot` currently persists only the field *types* of a
`RowData` state serializer, not the field *names*. Multiple efforts need the
names persisted:
- FLIP-599 (State Catalog) needs the field names to infer and expose a readable
schema for keyed state.
- FLIP-527 (State Schema Evolution for RowData) needs them for name-based
compatibility and migration.
This issue covers the small, self-contained, shared building block: **persist
the RowData field names in the serializer snapshot, written unconditionally and
decoupled from any schema-evolution enable/disable logic.**
Scope (in):
- Add `String[] fieldNames` to `RowDataSerializer` (name-based metadata; a
lightweight alternative to carrying the full `RowType`).
- Bump `RowDataSerializerSnapshot` from V3 to V4, appending the field names
after the existing field-types section. Names are written **unconditionally**
(not gated on any feature flag).
- V4 readers remain able to read V3 snapshots (field names absent -> `null`),
so existing savepoints continue to restore.
- Only the top-level `RowType` field names are persisted (a flat `String[]`).
Nested `ROW` field names already survive today via the persisted field logical
types, so no recursion is needed.
Scope (out — intentionally not here):
- No change to `resolveSchemaCompatibility` behavior: with only this change, a
field-type-array difference stays `incompatible()` exactly as today. This issue
adds no migration/evolution behavior; it only makes the names available.
- The schema-evolution opt-in and the compatibility/migration logic that
consumes the names are owned by FLIP-527 and are out of scope here. Decoupling
the "names persisted" metadata from the "evolution permitted" signal is
precisely why this is a standalone change.
- Scoped to `RowDataSerializer`, since its snapshot is the one that persists
field types without names. Field names for other serializer types, if the State
Catalog needs them, are separate follow-ups (each serializer owns its own
snapshot format).
Compatibility:
- Backward compatible. Snapshot format moves V3 -> V4 by appending names; V4
reads V3 with names absent. Runtime behavior is unchanged for all existing jobs
(names are persisted but not yet consumed by any decision).
Motivation for splitting this out: both FLIP-527 and FLIP-599 independently
proposed the same V3 -> V4 name-storage bump; landing it once as shared
infrastructure lets whichever FLIP lands first establish a single format that
serves the catalog's schema-inference needs and schema evolution's needs, and
avoids two conflicting snapshot bumps. Discussed on the FLIP-599 [DISCUSS]
thread.
Links:
- FLIP-599: State Catalog —
https://lists.apache.org/thread/xhojhcr0pkg7j8dblnt2crrdkkjz76vo
- FLIP-527: State Schema Evolution for RowData —
https://cwiki.apache.org/confluence/spaces/FLINK/pages/353601981/FLIP-527+State+Schema+Evolution+for+RowData
was:
{\{RowDataSerializerSnapshot}} currently persists only the field *types* of a
\{{RowData}} state serializer, not the field *names*. Multiple efforts need the
names persisted:
- FLIP-599 (State Catalog) needs the field names to infer and expose a readable
schema for keyed state.
- FLIP-527 (State Schema Evolution for RowData) needs them for name-based
compatibility and migration.
This issue covers the small, self-contained, shared building block: *persist
the RowData field names in the serializer snapshot, written unconditionally and
decoupled from any schema-evolution enable/disable logic.*
*Scope (in):*
- Add \{{String[] fieldNames}} to \{{RowDataSerializer}} (name-based metadata;
a lightweight alternative to carrying the full \{{RowType}}).
- Bump \{{RowDataSerializerSnapshot}} from V3 to V4, appending the field names
after the existing field-types section. Names are written *unconditionally*
(not gated on any feature flag).
- V4 readers remain able to read V3 snapshots (field names absent -> null), so
existing savepoints continue to restore.
- Field names cover nested ROW types recursively.
*Scope (out - intentionally not here):*
- No change to \{{resolveSchemaCompatibility}} behavior: with only this change,
a field-type-array difference stays \{{incompatible()}} exactly as today. This
issue adds no migration/evolution behavior; it only makes the names available.
- The schema-evolution opt-in and the compatibility/migration logic that
consumes the names are owned by FLIP-527 and are out of scope here. Decoupling
the "names persisted" metadata from the "evolution permitted" signal is
precisely why this is a standalone change.
- Scoped to \{{RowDataSerializer}}, since its snapshot is the one that persists
field types without names. Field names for other serializer types, if the State
Catalog needs them, are separate follow-ups (each serializer owns its own
snapshot format).
*Compatibility:*
- Backward compatible. Snapshot format moves V3 -> V4 by appending names; V4
reads V3 with names absent. Runtime behavior is unchanged for all existing jobs
(names are persisted but not yet consumed by any decision).
Both FLIP-527 and FLIP-599 independently proposed the same V3 -> V4
name-storage bump; landing it once as shared infrastructure lets whichever FLIP
lands first establish a single format that serves both, and avoids two
conflicting snapshot bumps. Discussed on the FLIP-599 [DISCUSS] thread.
Links:
- FLIP-599: State Catalog -
https://lists.apache.org/thread/xhojhcr0pkg7j8dblnt2crrdkkjz76vo
- FLIP-527: State Schema Evolution for RowData -
https://cwiki.apache.org/confluence/spaces/FLINK/pages/353601981/FLIP-527+State+Schema+Evolution+for+RowData
> Persist RowData field names in RowDataSerializerSnapshot
> --------------------------------------------------------
>
> Key: FLINK-40120
> URL: https://issues.apache.org/jira/browse/FLINK-40120
> Project: Flink
> Issue Type: Improvement
> Components: Table SQL / Runtime
> Reporter: Weiqing Yang
> Priority: Major
>
> `RowDataSerializerSnapshot` currently persists only the field *types* of a
> `RowData` state serializer, not the field *names*. Multiple efforts need the
> names persisted:
> - FLIP-599 (State Catalog) needs the field names to infer and expose a
> readable schema for keyed state.
> - FLIP-527 (State Schema Evolution for RowData) needs them for name-based
> compatibility and migration.
> This issue covers the small, self-contained, shared building block: **persist
> the RowData field names in the serializer snapshot, written unconditionally
> and decoupled from any schema-evolution enable/disable logic.**
> Scope (in):
> - Add `String[] fieldNames` to `RowDataSerializer` (name-based metadata; a
> lightweight alternative to carrying the full `RowType`).
> - Bump `RowDataSerializerSnapshot` from V3 to V4, appending the field names
> after the existing field-types section. Names are written **unconditionally**
> (not gated on any feature flag).
> - V4 readers remain able to read V3 snapshots (field names absent -> `null`),
> so existing savepoints continue to restore.
> - Only the top-level `RowType` field names are persisted (a flat `String[]`).
> Nested `ROW` field names already survive today via the persisted field
> logical types, so no recursion is needed.
> Scope (out — intentionally not here):
> - No change to `resolveSchemaCompatibility` behavior: with only this change,
> a field-type-array difference stays `incompatible()` exactly as today. This
> issue adds no migration/evolution behavior; it only makes the names available.
> - The schema-evolution opt-in and the compatibility/migration logic that
> consumes the names are owned by FLIP-527 and are out of scope here.
> Decoupling the "names persisted" metadata from the "evolution permitted"
> signal is precisely why this is a standalone change.
> - Scoped to `RowDataSerializer`, since its snapshot is the one that persists
> field types without names. Field names for other serializer types, if the
> State Catalog needs them, are separate follow-ups (each serializer owns its
> own snapshot format).
> Compatibility:
> - Backward compatible. Snapshot format moves V3 -> V4 by appending names; V4
> reads V3 with names absent. Runtime behavior is unchanged for all existing
> jobs (names are persisted but not yet consumed by any decision).
> Motivation for splitting this out: both FLIP-527 and FLIP-599 independently
> proposed the same V3 -> V4 name-storage bump; landing it once as shared
> infrastructure lets whichever FLIP lands first establish a single format that
> serves the catalog's schema-inference needs and schema evolution's needs, and
> avoids two conflicting snapshot bumps. Discussed on the FLIP-599 [DISCUSS]
> thread.
> Links:
> - FLIP-599: State Catalog —
> https://lists.apache.org/thread/xhojhcr0pkg7j8dblnt2crrdkkjz76vo
> - FLIP-527: State Schema Evolution for RowData —
> https://cwiki.apache.org/confluence/spaces/FLINK/pages/353601981/FLIP-527+State+Schema+Evolution+for+RowData
--
This message was sent by Atlassian Jira
(v8.20.10#820010)