Hi Gyula,

Thanks for your response.

Sounds good to me.

Best,
Jingsong

On Wed, Jul 8, 2026 at 5:38 PM Gyula Fóra <[email protected]> wrote:
>
> Hi Jingsong!
>
> Thanks for the feedback.
> I totally agree with you that the current design is going to be most useful
> for datastream / user defined operators and may surface some "strange" or
> slightly unexpected internals to the users for SQL jobs and SQL operators.
>
> Big +1 for the idea that we should add operator specific views later to
> expose some important sql operator internals in a more human readable
> format. And I also completely agree that this is out of scope for the
> initial V1 version.Based on the interest I see on this FLIP I think there
> will be a demand for a lot of similar extension capabilities once we get
> the initial physical/raw state view version out.
>
> Regarding the documentation requirements for transparency, this is a very
> important point and I couldn't agree more. In addition I think we will have
> to clearly document and treat the contents of the state catalog as fully
> experimental initially. With the great variety of internal representations
> and use-cases surrounding Flink states, it's impossible to get this right
> on the first try and our goal should be to iterate on this over a few flink
> minor versions.
>
> So specifically:
>  1. The physical state representation of SQL and other built in operators
> is a Flink internal and not part of the public api. Therefore the structure
> / schema of these tables are subject to change without notice across Flink
> versions.
>  2. The StateCatalog itself including configuration, operator/state to
> table mapping, metadata views, etc. are all initially experimental and
> provide no backward compatibility guarantees and can change without notice
> initially.
>
> I think 1. will stay like this for the foreseeable future , we do not want
> to make internal implementations as part of the public api. We should aim
> to stabilize 2. and make it part of the public api eventually, and the
> views on the internal operators could hopefully become part of 2 as well.
>
> Cheers
> Gyula
>
> On Wed, Jul 8, 2026 at 2:55 AM Jingsong Li <[email protected]> wrote:
>
> > Hi Gyula and all,
> >
> > Thanks for driving this FLIP. I like the overall direction and think making
> > savepoint/checkpoint state discoverable and queryable from SQL would be
> > very
> > useful.
> >
> > I have one concern/question around how the catalog presents state from SQL
> > operators.
> >
> > For many SQL operators, the internal state layout can be quite different
> > from
> > the logical SQL model. For example, streaming joins, window aggregations,
> > deduplication, TopN/rank, and other optimized operators may maintain
> > multiple
> > internal states, timers, namespaces, accumulators, or optimization-specific
> > auxiliary structures. If these are exposed directly as SQL tables, the
> > result
> > may be difficult for users to understand. It may also accidentally make an
> > internal state layout look like a stable user-facing contract, even though
> > it
> > can change with planner/runtime optimizations or Flink versions.
> >
> > Would it make sense to explicitly distinguish two levels in the FLIP?
> >
> > 1. Physical/raw state views
> >
> > These are generic views derived from checkpoint/savepoint metadata and
> > serializer snapshots. They expose the actual operator UID, state name,
> > state
> > type, key/namespace/value schema, serializer information, etc. I think
> > this is
> > a very reasonable scope for the first version, especially for debugging,
> > observability, migration, and advanced operational use cases.
> >
> > However, it would be good to document that these tables represent Flink's
> > physical state layout and should not be treated as stable logical SQL
> > tables.
> >
> > 2. Optional logical/operator-aware views
> >
> > For some common SQL/runtime operators, we could later add operator-specific
> > views or descriptors that explain the state in terms of operator semantics.
> > For example, a join operator could expose left-side rows, right-side rows,
> > and
> > timers in a more understandable way; a window aggregate could expose window
> > accumulators and timer/namespace metadata.
> >
> > I do not think this needs to be part of the initial implementation, but
> > making
> > the distinction explicit would help set the right expectations and avoid
> > over-promising what automatic state-to-table mapping can provide.
> >
> > So my suggestion is that V1 focuses on the generic physical/raw state view,
> > with clear metadata and documentation, while leaving logical/operator-aware
> > views as a possible extension.
> >
> > Best,
> > Jingsong
> >
> > On Wed, Jul 8, 2026 at 3:39 AM Roman Khachatryan <[email protected]> wrote:
> > >
> > > > 1. The catalog built on the regular state processor api (and therefore
> > > > flink state restore) capabilities has limited scope to detect exactly
> > what
> > > > happens when a state is no longer there. This will probably lead to
> > read
> > > > errors/not found exceptions etc, some of which happens in code that is
> > a
> > > > bit tricky to control this way. Let's see how well this works in
> > practice
> > > > and error handling can always be improved in general. This is not part
> > of
> > > > the catalog design itself.
> > >
> > > Makes sense. I think this can also be an extension.
> > > To clarify the ownership/pinning follow-up idea: it could use FS
> > mechanisms
> > > rather than HA (ZK/etcd).  For example, a separate file
> > > with the lowest checkpoint that Flink should keep, protected by CAS and
> > > limited to a specified TTL.
> > >
> > > > 2. The proposal in it's current form includes a global state metadata
> > view
> > > > based on the existing metadata information ([1]) and based on
> > Shengkai's
> > > > feedback a per operator granular metadata table/view that would expose
> > > > information of individual states. I don't see where file level
> > information
> > > > fits into this but if you have a good way / idea how to represent this
> > as
> > > a
> > > > table this can definitely be a future extension/addition
> > >
> > > I was thinking about something like:
> > >
> > > USE `00000000000000000000/chk-42`;
> > > SELECT *
> > > FROM state_handles;
> > >
> > > -- id    type                                 parent    path
> > >       size         timestamp             operator/state/subtask_index
> > >              local_path  key_range
> > > -- 0     FileStateHandle                      -
> >  s3://.../_metadata
> > >       0.8Kb        2026-07-02T22:56:30   -
> > >               -           -
> > > -- 1     IncrementalRemoteKeyedStateHandle    0
> > >      -            2026-07-02T22:56:14
> > > uid_transaction_aggregator_keyed/users#0        -           0 .. 127
> > > -- 2     FileStateHandle                      1
> > > s3://.../xxxx-xxxx...    5.4Mb        2026-07-02T22:56:12   -
> > >                                 000034.SST  -
> > > -- 3     FileStateHandle                      1
> > > s3://.../yyyy-yyyy...    872Kb        2026-07-02T22:56:12   -
> > >                                 000035.SST  -
> > > -- 4     IncrementalRemoteKeyedStateHandle    0
> > >      -            2026-07-02T22:56:24
> > > uid_transaction_aggregator_keyed/users#1        -           128 .. 255
> > > -- 5     ByteStreamStateHandle                4
> > >      2Kb          2026-07-02T22:56:24   -
> > >             000001.SST  -
> > >
> > > The idea is to represent CompletedCheckpoint as a DAG so that it maps
> > > directly to the layout of the object in-memory.
> > >
> > > > 3. Did not think about this but if this becomes a requirement we could
> > add
> > > > a flag to enable metadata only in the catalog.
> > >
> > > For our use-case (multi-tenant cloud environment), separate access models
> > > for
> > > data and metadata are very likely a must have because of the security
> > > concerns:
> > > - internally, the operators should have access to metadata, but not to
> > the
> > > customer data
> > > - externally, the users should have access to their data but not to the
> > > metadata
> > >
> > > 5, 6. Thanks! :)
> > >
> > > 7. Yes, this should be available since metadata V4.
> > >
> > > Regards,
> > > Roman
> > >
> > >
> > > On Tue, Jul 7, 2026 at 9:56 AM Gyula Fóra <[email protected]> wrote:
> > >
> > > > Hey Shengkai!
> > > >
> > > > Thanks for the questions, you hit on some very good practical points.
> > Let
> > > > me provide my answers below, in the meantime I have already updated the
> > > > FLIP to include some of your suggestions :)
> > > >
> > > > 1. How would schema inference work for RowDataSerializer?
> > > >
> > > > That's a good observation, I did not notice this. Probably the simplest
> > > > solution would be to introduce a new version in the
> > > > RowDataSerializerSnapshot and include the names for this use-case.
> > > > This would not really impact checkpointing times/performance but would
> > > > allow a straightforward mapping for sql states.
> > > >
> > > > If we feel that this is too much internal change, then we could also
> > keep
> > > > it as is for now using simply f0, f1...
> > > >
> > > > 2. Is one keyed-state table per operator the right abstraction?
> > > >
> > > > This is a very good point and something that has bothered me as well
> > from a
> > > > design perspective. There is no single good abstraction here because
> > there
> > > > are completely different use cases.
> > > > When you just want to look into the state for a single / multiple keys
> > and
> > > > you mostly have simple value list states, the single table
> > representation
> > > > is superior from both query syntax and performance perspective. It
> > avoids
> > > > JOINS and maps to the simple mental model that for a certain key you
> > have
> > > > state x,y,z. Due to this straightforward mental model I still think
> > this is
> > > > the good default representation. With projection pushdown, it's easy to
> > > > select one/several specific columns without reading / touching any
> > other.
> > > >
> > > > The big issue is however with large collection states that simply
> > cannot be
> > > > represented within a single row. This happens very often and is one of
> > the
> > > > main reasons someone would even use a list state (if they understand
> > how
> > > > they work internally, but not all users do...). Large map, window, list
> > > > states won't work in the simple row model and are completely
> > impractical.
> > > >
> > > > Based on this, my recommendation would be to keep all keyed states in a
> > > > single table as per the original proposal (one column per keyed state)
> > but
> > > > also add an extra table per list / map state with the flattened schema.
> > > > So if the operator has a value and list state, then there would be 2
> > > > tables. One with both states as columns (as per original design) + 1
> > > > flattened list state table (key, index, value) or for map states (key,
> > > > map_key, value).
> > > >
> > > > This way we cover both use cases naturally. I am also open to making
> > this
> > > > configurable on the catalog level.
> > > >
> > > > I have added this to the FLIP
> > > >
> > > > 3. Could you clarify the assumption of "reading state without user
> > > > classes"?
> > > >
> > > > Turns out from an implementation perspective it's not too bad and
> > pojo/avro
> > > > state schemas can be inferred quite naturally for most cases. However
> > if
> > > > the user indeed provides the user jar on the classpath then the whole
> > > > schema resolution will become even simpler because then we do not need
> > any
> > > > custom inference. For our own use-cases and in general I would not
> > like to
> > > > assume that user classes will be easily available or that a catalog
> > will
> > > > represent mostly a single application. On the contrary the way We
> > intend to
> > > > use this, is definitely mostly without userjars and to represent
> > multiple
> > > > applications at the same time.
> > > >
> > > > 4. Could StateCatalog expose more fine-grained metadata?
> > > >
> > > > I think this is a very good idea. I have updated the FLIP to include an
> > > > operator level metadata table as well (one for each operator). I would
> > love
> > > > to include everything that you suggested, I think the practical limit
> > is
> > > > what kind of information is part of the checkpoint and what isn't .
> > This
> > > > also ties to some questions Roman had about more detailed metadata.
> > Makes
> > > > sense
> > > >
> > > > Cheers
> > > > Gyula
> > > >
> > > >
> > > > On Tue, Jul 7, 2026 at 4:59 AM Shengkai Fang <[email protected]>
> > wrote:
> > > >
> > > > > Hi Gyula,
> > > > >
> > > > > Thanks for the FLIP. I like the direction of making
> > savepoint/checkpoint
> > > > > state discoverable and queryable from SQL. I have a few questions and
> > > > > concerns about the proposed abstraction.
> > > > >
> > > > > 1. How would schema inference work for RowDataSerializer?
> > > > >
> > > > > From the current RowDataSerializer snapshot, it looks like the
> > snapshot
> > > > > persists the LogicalType[] and nested serializer snapshots, so the
> > field
> > > > > types can be restored. However, the top-level RowDataSerializer
> > > > constructed
> > > > > from a RowType seems to store only the child LogicalTypes, not the
> > > > RowType
> > > > > field names. Would StateCatalog expose generated names such as
> > f0/f1, or
> > > > is
> > > > > there another source for recovering the original field names?
> > > > >
> > > > > 2. Is one keyed-state table per operator the right abstraction?
> > > > >
> > > > > I wonder whether one table per named keyed state would be a better
> > base
> > > > > abstraction, with an optional operator-level wide view on top. In
> > > > > particular, MapState can contain an unbounded or highly variable
> > number
> > > > of
> > > > > entries per state key. Exposing it as a MAP<K,V> column may require
> > fully
> > > > > deserializing the map for a key into heap. A normalized table shape
> > such
> > > > > as:
> > > > >
> > > > >   (state_key, map_key, map_value)
> > > > >
> > > > > seems more scalable and SQL-friendly for MapState. Similarly,
> > > > > ValueState/ListState/MapState have different natural table shapes, so
> > > > tying
> > > > > the physical table boundary to the operator may be too coarse.
> > > > >
> > > > > 3. Could you clarify the assumption of "reading state without user
> > > > > classes"?
> > > > >
> > > > > This is a very attractive goal, but it also seems to introduce
> > > > substantial
> > > > > complexity for POJOs, Avro SpecificRecord, subclasses, and custom
> > > > > serializers. If StateCatalog is positioned as a
> > > > job-level/application-level
> > > > > catalog, would requiring the job jar or user artifacts be acceptable
> > as a
> > > > > first step? That might simplify the design while still covering many
> > > > > operational/debugging use cases.
> > > > >
> > > > > 4. Could StateCatalog expose more fine-grained metadata?
> > > > >
> > > > > For debugging state, it would be useful to expose state-level
> > metadata
> > > > such
> > > > > as state name, state type, serializer snapshot/serializer class, TTL
> > > > > configuration, namespace/window information where applicable, backend
> > > > state
> > > > > type, and possibly whether a state can be read lazily/streamingly.
> > > > >
> > > > > Best,
> > > > > Shengkai
> > > > >
> > > > > Roman Khachatryan <[email protected]> 于2026年7月7日周二 08:44写道:
> > > > >
> > > > > > Hi Gyula,
> > > > > >
> > > > > > Thanks for the proposal, this looks very useful! A few questions
> > and
> > > > > > comments:
> > > > > >
> > > > > > 1. Following up on Han's question about checkpoint retention: I
> > > > > understand
> > > > > > external coordination is out of scope for now, but could the
> > catalog at
> > > > > > least detect that a checkpoint was subsumed/deleted mid-query and
> > fail
> > > > > with
> > > > > > a clear error, rather than a low-level file-not-found? And do you
> > see
> > > > > > ownership/pinning as a possible follow-up FLIP once checkpoint
> > reading
> > > > > > picks up adoption?
> > > > > > 2. Does the proposal allow querying file-level metadata (file size,
> > > > > > creation date, etc.)? This would be useful for debugging
> > > > > compaction-related
> > > > > > issues.
> > > > > > 3. If yes, could data and metadata queries have separate access
> > modes?
> > > > In
> > > > > > many environments access to data is much stricter than access to
> > > > > metadata,
> > > > > > so being able to grant metadata-only access to the catalog would
> > > > broaden
> > > > > > where it can be deployed.
> > > > > > 4. Just to confirm: incremental checkpoints are expected to work
> > > > through
> > > > > > the regular restore mechanisms, given sufficient retention?
> > > > > > 5. +1 on bringing non-keyed state into scope — a concrete use case:
> > > > > > inspecting Kafka transaction state (currently stored in non-keyed
> > > > > operator
> > > > > > state) would be very valuable for debugging EOS issues.
> > > > > > 6. Could you explain why timers are not supported? They live in
> > keyed
> > > > > state
> > > > > > and the state processor API can read registered timers, so I'm
> > > > wondering
> > > > > > whether this is a fundamental limitation or just table-mapping
> > scope.
> > > > > > 7. Does the proposal allow querying checkpoint metadata (such as
> > > > > > SharingFilesStrategy, isSavepoint, etc.)? This could be useful for
> > > > > > debugging CLAIM mode issues.
> > > > > >
> > > > > >
> > > > > > Regards,
> > > > > > Roman
> > > > > >
> > > > > >
> > > > > > On Mon, Jul 6, 2026 at 1:02 PM Gyula Fóra <[email protected]>
> > > > wrote:
> > > > > >
> > > > > > > Hi Zakelly!
> > > > > > >
> > > > > > > That's a good point and we have to ensure that it works. In
> > theory
> > > > SQL
> > > > > > > related states are relatively easy to cover and represent. The
> > > > RowData
> > > > > > > state would be mapped directly to ROW<...> similar to other pojo
> > key
> > > > > > > states.
> > > > > > >
> > > > > > > Cheers
> > > > > > > Gyula
> > > > > > >
> > > > > > > On Sun, Jul 5, 2026 at 4:03 PM Zakelly Lan <
> > [email protected]>
> > > > > > wrote:
> > > > > > >
> > > > > > > > Hi Gyula,
> > > > > > > >
> > > > > > > > Thanks for driving this, it's a nice addition and I fully
> > support
> > > > it.
> > > > > > One
> > > > > > > > thing to make sure:
> > > > > > > >
> > > > > > > > For the state generated by some Flink SQL jobs, does the
> > > > StateCatalog
> > > > > > > infer
> > > > > > > > this internal `RowData` structure and expose it as a SQL
> > `ROW<...>`
> > > > > > type?
> > > > > > > > For example, a regular streaming join side may be stored as a
> > state
> > > > > > such
> > > > > > > as
> > > > > > > > `left-records` / `right-records`, whose value or map key/value
> > > > > > contains a
> > > > > > > > `RowData` for the original input row.
> > > > > > > >
> > > > > > > >
> > > > > > > > Best,
> > > > > > > > Zakelly
> > > > > > > >
> > > > > > > > On Fri, Jul 3, 2026 at 4:13 PM Dennis-Mircea Ciupitu <
> > > > > > > > [email protected]> wrote:
> > > > > > > >
> > > > > > > > > Hi Gyula,
> > > > > > > > >
> > > > > > > > > Thanks for the detailed answers. This addresses my questions
> > well
> > > > > and
> > > > > > > the
> > > > > > > > > direction sounds great.
> > > > > > > > >
> > > > > > > > > +1 (non-binding) from my side.
> > > > > > > > >
> > > > > > > > > Best regards,
> > > > > > > > > Dennis
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On Thu, Jul 2, 2026 at 3:26 PM Gyula Fóra <
> > [email protected]>
> > > > > > > wrote:
> > > > > > > > >
> > > > > > > > > > Hi Dennis!
> > > > > > > > > >
> > > > > > > > > > Thank you for the questions. Much recent work in the state
> > > > > > connector
> > > > > > > > api
> > > > > > > > > > has been done basically towards this type of nice
> > cataloging
> > > > and
> > > > > > > > flexible
> > > > > > > > > > access. There are a few holes and things that have to be
> > > > changed,
> > > > > > not
> > > > > > > > > > everything is enumerated in the FLIP but we have to have an
> > > > open
> > > > > > mind
> > > > > > > > and
> > > > > > > > > > make all necessary changes as you said to make this truly
> > nice
> > > > > and
> > > > > > > > > > comprehensive as much as possible. Most state processor
> > apis
> > > > are
> > > > > > > marked
> > > > > > > > > > experimental so we can be flexible within reason :)
> > > > > > > > > >
> > > > > > > > > > Now to the concrete questions:
> > > > > > > > > >
> > > > > > > > > > 1. Non-keyed state support / scope
> > > > > > > > > > I think non-keyed states should definitely be in the scope
> > of
> > > > the
> > > > > > > FLIP
> > > > > > > > in
> > > > > > > > > > terms of design , and my intention was not to exclude them
> > I
> > > > just
> > > > > > > > focused
> > > > > > > > > > on the keyed state as that is readily available in our
> > > > prototype
> > > > > > > > > > implementation (without much changes to the existing
> > > > > connectors). I
> > > > > > > > will
> > > > > > > > > > try to update the FLIP to include non-keyed states more in
> > > > detail
> > > > > > > but I
> > > > > > > > > > think the case is pretty straightforward. From a table
> > > > > > representation
> > > > > > > > > > perspective, they can follow a similar pattern such as:
> > > > > > > > > > uid_opUID_statename_broadcast  , uid_opUID_statename_list
> > . A
> > > > > > > > > corresponding
> > > > > > > > > > SQL connector can easily be added to support these based
> > on the
> > > > > > > > existing
> > > > > > > > > > datastream connector. I will make sure to add separate
> > tickets
> > > > > for
> > > > > > > > these
> > > > > > > > > > types of states once the FLIP is accepted and this work can
> > > > very
> > > > > > > easily
> > > > > > > > > be
> > > > > > > > > > parallelized across different state types within the
> > existing
> > > > > > catalog
> > > > > > > > > > frameworks. This way keyed/non-keyed states will live
> > directly
> > > > > > > together
> > > > > > > > > in
> > > > > > > > > > a single catalog/db.
> > > > > > > > > >
> > > > > > > > > > In the future we can even go a step further and include
> > > > connector
> > > > > > > > > specific
> > > > > > > > > > state views such as kafka offsets etc with custom connector
> > > > > > specific
> > > > > > > > > > plugins
> > > > > > > > > >
> > > > > > > > > > 2/3. Serializer transparency and robustness
> > > > > > > > > > From a practical standpoint both generated (synthetic)
> > > > > serializers
> > > > > > > and
> > > > > > > > > > custom classes / kryo and pluggable logic could work but
> > the
> > > > > whole
> > > > > > > > > catalog
> > > > > > > > > > concepts requires a certain behaviour to be useful. The
> > catalog
> > > > > > would
> > > > > > > > > point
> > > > > > > > > > to savepoint directories and discover all state in it
> > > > > (potentially
> > > > > > > from
> > > > > > > > > > multiple jobs). Configuration has to be done in a generic
> > way,
> > > > I
> > > > > > > don't
> > > > > > > > > see
> > > > > > > > > > a problem with introducing configs for specifying custom
> > > > > > > > > > serializers/factories either generically for certain
> > specific
> > > > > > > classes.
> > > > > > > > In
> > > > > > > > > > most cases however this won't be necessary as the state
> > > > snapshot
> > > > > > > itself
> > > > > > > > > > usually has a reference (classname) of the original user
> > > > classes.
> > > > > > If
> > > > > > > > the
> > > > > > > > > > catalog process has access to those classes it will use
> > that
> > > > > > > directly,
> > > > > > > > or
> > > > > > > > > > other confugred serializers, and only if not available fall
> > > > back
> > > > > to
> > > > > > > > > > generating serializers for POJO/TUPLE types. There is
> > > > obviously a
> > > > > > > limit
> > > > > > > > > to
> > > > > > > > > > what is possible here initially, Kryo being one exception
> > where
> > > > > you
> > > > > > > > > either
> > > > > > > > > > have the class or not.
> > > > > > > > > >
> > > > > > > > > > I would like to however point out that we do not have to
> > > > support
> > > > > > > > > everything
> > > > > > > > > > initially, we can start with what is currently available,
> > use
> > > > the
> > > > > > > > > classpath
> > > > > > > > > > / generated serializers and as we develop we will find the
> > > > limits
> > > > > > of
> > > > > > > > this
> > > > > > > > > > approach and then can extend with configuration as it feels
> > > > > natural
> > > > > > > > > instead
> > > > > > > > > > of trying to create a super complex initial solution. But I
> > > > > > > definitely
> > > > > > > > > > agree that we should support custom serializer already
> > > > specified
> > > > > in
> > > > > > > the
> > > > > > > > > > config that is otherwise used by flink for the jobs (but I
> > > > think
> > > > > > this
> > > > > > > > > > should more or less work out of the box).
> > > > > > > > > >
> > > > > > > > > > 4. The metadata view is currently reused based on the
> > existing
> > > > > > table
> > > > > > > > > valued
> > > > > > > > > > function. Let's take this as a followup under this
> > umbrella to
> > > > > > > improve
> > > > > > > > /
> > > > > > > > > > extend the metadata view. I don't think we need a separate
> > FLIP
> > > > > but
> > > > > > > it
> > > > > > > > > also
> > > > > > > > > > feels out of scope here.
> > > > > > > > > >
> > > > > > > > > > Cheers
> > > > > > > > > > Gyula
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > On Thu, Jul 2, 2026 at 1:02 PM Dennis-Mircea Ciupitu <
> > > > > > > > > > [email protected]> wrote:
> > > > > > > > > >
> > > > > > > > > > > Hi all,
> > > > > > > > > > >
> > > > > > > > > > > Thank you for driving this. Being able to discover
> > > > > > > > > savepoints/checkpoints
> > > > > > > > > > > and query their state as SQL tables without shipping the
> > > > > original
> > > > > > > > user
> > > > > > > > > > > classes is a genuinely valuable addition, and it's nice
> > that
> > > > it
> > > > > > > > builds
> > > > > > > > > on
> > > > > > > > > > > the existing state-table connector and savepoint_metadata
> > > > work
> > > > > > > rather
> > > > > > > > > > than
> > > > > > > > > > > starting from scratch.
> > > > > > > > > > >
> > > > > > > > > > > A few points and questions, mostly around scope and the
> > > > > > serializer
> > > > > > > > > story:
> > > > > > > > > > >
> > > > > > > > > > >    1. Non-keyed state and the DataStream path.
> > > > > > > > > > >       - The FLIP scopes out BroadcastState, operator
> > > > ListState
> > > > > > and
> > > > > > > > > > >       UnionState because "no readily available Table API
> > > > > > connectors
> > > > > > > > > exist
> > > > > > > > > > > for
> > > > > > > > > > >       these state types." That's a fair characterization
> > of
> > > > the
> > > > > > > Table
> > > > > > > > > > > layer, but
> > > > > > > > > > >       the state-processor DataStream API already reads
> > all
> > > > > three
> > > > > > > > today
> > > > > > > > > > >       (SavepointReader#readBroadcastState /
> > #readUnionState /
> > > > > > > > > > > #readListState). So
> > > > > > > > > > >       the limitation is really in the keyed-only SQL
> > mapping
> > > > > > > > > > > (KeyedStateReader
> > > > > > > > > > >       runs inside a keyed backend), not in the snapshots
> > > > > > > themselves.
> > > > > > > > > > >       - Is the keyed-only scope a deliberate
> > UX/table-mapping
> > > > > > > > decision,
> > > > > > > > > > or
> > > > > > > > > > >       would a DataStream-backed reader be considered so
> > the
> > > > > > catalog
> > > > > > > > > isn't
> > > > > > > > > > >       strictly less capable than the API it extends?
> > Even if
> > > > > > > > non-keyed
> > > > > > > > > > > contents
> > > > > > > > > > >       stay out of scope initially, it would be good to
> > frame
> > > > > this
> > > > > > > > > > > explicitly as a
> > > > > > > > > > >       Table-mapping constraint rather than a general one.
> > > > > > > > > > >    2. Serializer transparency - the "no user classes"
> > premise
> > > > > vs.
> > > > > > > > > custom
> > > > > > > > > > >    serializers.
> > > > > > > > > > >       - The design relies on Flink's transparent
> > serializer
> > > > > > formats
> > > > > > > > to
> > > > > > > > > > >       decode state without user dependencies, which is
> > great
> > > > > for
> > > > > > > > > > > POJO/Avro/basic
> > > > > > > > > > >       types. But two serialization efforts point the
> > other
> > > > way:
> > > > > > > > > FLIP-398
> > > > > > > > > > > [1]
> > > > > > > > > > >       (released) already lets users configure
> > serializers per
> > > > > > type
> > > > > > > > via
> > > > > > > > > > >       pipeline.serialization-config, and FLIP-538 [2] (in
> > > > > > > discussion)
> > > > > > > > > > adds
> > > > > > > > > > >       pluggable custom generic-type serializers (e.g.
> > Apache
> > > > > > Fory)
> > > > > > > > and
> > > > > > > > > > > promotes
> > > > > > > > > > >       TypeSerializer/TypeSerializerSnapshot to @Public.
> > As
> > > > > > FLIP-538
> > > > > > > > > > > itself notes,
> > > > > > > > > > >       state written with a custom serializer becomes
> > > > dependent
> > > > > on
> > > > > > > > that
> > > > > > > > > > > serializer
> > > > > > > > > > >       to decode - external tooling without it cannot read
> > > > those
> > > > > > > > bytes.
> > > > > > > > > > >       - Could we make the deserialization side pluggable
> > and
> > > > > > > > > > config-driven,
> > > > > > > > > > >       mirroring FLIP-398's serialization-config, with a
> > > > > graceful
> > > > > > > > > fallback
> > > > > > > > > > > (e.g.
> > > > > > > > > > >       expose the raw bytes / skip the column) when a
> > format
> > > > > isn't
> > > > > > > > > > > transparently
> > > > > > > > > > >       decodable? There already seems to be a seam for
> > this
> > > > > > > > > > >       (SavepointTypeInformationFactory), and making it a
> > > > > > > first-class,
> > > > > > > > > > >       config-selectable option would keep the catalog
> > > > > > > > > forward-compatible
> > > > > > > > > > as
> > > > > > > > > > >       serialization support grows.
> > > > > > > > > > >    3. Robustness of the transparent decoding path.
> > > > > > > > > > >       - Related to (2): reconstructing values by
> > mirroring
> > > > the
> > > > > > > binary
> > > > > > > > > > >       layout (PojoToRowDataDeserializer) is the most
> > powerful
> > > > > but
> > > > > > > > also
> > > > > > > > > > the
> > > > > > > > > > > most
> > > > > > > > > > >       fragile part of the design. How is it expected to
> > > > behave
> > > > > > > across
> > > > > > > > > > > serializer
> > > > > > > > > > >       schema evolution / state migration (a serializer
> > > > snapshot
> > > > > > > that
> > > > > > > > > > > differs from
> > > > > > > > > > >       the writer's), Kryo-fallback fields, nested/generic
> > > > > types,
> > > > > > > and
> > > > > > > > > > > nullability?
> > > > > > > > > > >       - It would help to spell out the supported matrix
> > and
> > > > the
> > > > > > > > failure
> > > > > > > > > > >       mode (hard error vs. degrade to raw bytes) up
> > front,
> > > > > since
> > > > > > > this
> > > > > > > > > > > is exactly
> > > > > > > > > > >       where "read without the user classes" is most
> > likely to
> > > > > > break
> > > > > > > > in
> > > > > > > > > > > practice.
> > > > > > > > > > >    4. Observability / summary reporting.
> > > > > > > > > > >       - The metadata view is a great start. Two small
> > asks:
> > > > > > > > > > >          - per-subtask (or per-key-group) size
> > granularity in
> > > > > > > > addition
> > > > > > > > > to
> > > > > > > > > > >          per-operator, since skew is usually what you are
> > > > > chasing
> > > > > > > on
> > > > > > > > > > > large state;
> > > > > > > > > > >          - optionally rounding out the size breakdown
> > with
> > > > > > > > managed/raw
> > > > > > > > > > >          operator state and channel state sizes for a
> > full
> > > > > > picture
> > > > > > > > > > (noting
> > > > > > > > > > > the
> > > > > > > > > > >          latter are in-flight / unaligned-checkpoint
> > buffers
> > > > > > rather
> > > > > > > > > > > than user state).
> > > > > > > > > > >       - A prominent upfront summary of the largest
> > operators
> > > > /
> > > > > > > state
> > > > > > > > is
> > > > > > > > > > >       often what users want before drilling in.
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > Best regards,
> > > > > > > > > > > Dennis
> > > > > > > > > > >
> > > > > > > > > > > [1]
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > https://cwiki.apache.org/confluence/spaces/FLINK/pages/282102217/FLIP-398+Improve+Serialization+Configuration+And+Usage+In+Flink
> > > > > > > > > > > [2]
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > https://cwiki.apache.org/confluence/spaces/FLINK/pages/373886828/FLIP-538+Support+Custom+Generic+Type+Serializer
> > > > > > > > > > >
> > > > > > > > > > > On Mon, Jun 29, 2026 at 12:53 PM Gyula Fóra <
> > > > [email protected]
> > > > > >
> > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > > > Hi Flink Devs!
> > > > > > > > > > > >
> > > > > > > > > > > > I would like to start the discussion about FLIP-599:
> > State
> > > > > > > Catalog
> > > > > > > > > [1]
> > > > > > > > > > > >
> > > > > > > > > > > > State and stateful processing has always been one of
> > the
> > > > most
> > > > > > > > > > fundamental
> > > > > > > > > > > > features of Flink and a major contributor to its
> > success
> > > > and
> > > > > > > global
> > > > > > > > > > > > adoption.
> > > > > > > > > > > >
> > > > > > > > > > > > Over the years several apis and methods have been
> > developed
> > > > > to
> > > > > > > > > address
> > > > > > > > > > > the
> > > > > > > > > > > > need for external access and analytics such as the
> > state
> > > > > > > processor
> > > > > > > > > > > > datastream / java apis, the since deprecated queryable
> > > > state
> > > > > > > > > > abstractions
> > > > > > > > > > > > and more recently a number of table / SQL api
> > connectors to
> > > > > > > access
> > > > > > > > > > state
> > > > > > > > > > > > metadata and keyed states in a somewhat limited way.
> > > > > > > > > > > >
> > > > > > > > > > > > Extending the current capabilities of the
> > > > state-process-api,
> > > > > > this
> > > > > > > > > FLIP
> > > > > > > > > > > aims
> > > > > > > > > > > > to lift state processing,  analytics and observability
> > to a
> > > > > new
> > > > > > > > level
> > > > > > > > > > by
> > > > > > > > > > > > introducing the State Catalog.
> > > > > > > > > > > >
> > > > > > > > > > > > State Catalog is a Flink SQL Catalog implementation
> > that
> > > > > allows
> > > > > > > > > > > discovering
> > > > > > > > > > > > savepoints/checkpoints and mapping their state
> > > > automatically
> > > > > to
> > > > > > > SQL
> > > > > > > > > > > tables.
> > > > > > > > > > > > The tables are derived for the different operators and
> > > > their
> > > > > > > keyed
> > > > > > > > > > states
> > > > > > > > > > > > with schema matching the state structure. Most
> > importantly
> > > > it
> > > > > > > > > supports
> > > > > > > > > > > > reading POJO / Avro and other structured and basic type
> > > > > states
> > > > > > > > > without
> > > > > > > > > > > the
> > > > > > > > > > > > original user classes (dependencies) by relying on
> > Flink's
> > > > > > > > > transparent
> > > > > > > > > > > and
> > > > > > > > > > > > efficiently structured serializer formats.
> > > > > > > > > > > >
> > > > > > > > > > > > We have a fully functional prototype implementation
> > > > developed
> > > > > > > with
> > > > > > > > > > Gabor
> > > > > > > > > > > > Somogyi that we will be happy to share if the community
> > > > > accepts
> > > > > > > the
> > > > > > > > > > > > proposal!
> > > > > > > > > > > >
> > > > > > > > > > > > Looking forward to your feedback and suggestions!
> > > > > > > > > > > >
> > > > > > > > > > > > Gyula
> > > > > > > > > > > >
> > > > > > > > > > > > [1]
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > https://cwiki.apache.org/confluence/spaces/FLINK/pages/438009922/FLIP-599+State+Catalog
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> >

Reply via email to