Hi Martijn,

I went through the implementation and the discussion. The in-place
migration to a writer-only Sink V2 looks reasonable to me, and I have no
additional concerns beyond the compatibility points already raised.

Please make sure the release notes clearly describe the affected
savepoint-restore scenarios and the upgrade/rollback expectations, so
existing users can assess the impact before upgrading.

Thanks for driving this migration!

Best regards,
Yanquan

Martijn Visser <[email protected]> 于2026年10月23日周五 15:31写道:

> Hi all,
>
> FLIP-239 [1], voted in October 2023, specified a separate
> JdbcDynamicTableSinkV2 next to the existing JDBC table sink, with a
> deprecation window before the SinkFunction-based one is removed. The
> DataStream side of the FLIP is done. The table sink is the last legacy
> Flink API in the connector, and SinkFunctionProvider has been @Internal and
> deprecated since Flink 2.0 (FLINK-36245).
>
> I want to deviate from the FLIP in two places and would like to hear
> objections. If there are no objections raised in the next 10 days, I assume
> that people are OK with this. There is already a draft PR available [2].
>
> 1. In place, not a V2 class. Today JdbcDynamicTableSink returns a
> SinkFunctionProvider over GenericJdbcSinkFunction. With this change it
> returns an internal, writer-only Sink<RowData> under the existing factory.
> That sink wraps JdbcWriter, the writer of the DataStream JdbcSink, and has
> no committer and no writer state. The SQL connector has no XA mode, so the
> XA path is not involved. With a primary key it keeps writing upserts, which
> makes a replay after a failure idempotent. The DataStream JdbcSink is
> untouched.
>
> 2. No deprecation window. There is nothing for a user to migrate: same
> identifier, same options, same changelog semantics, and the writer
> registers no state, so jobs with operator uids restore their savepoints in
> both directions. The PR has a test for the upgrade direction. The sink task
> is renamed "<sink>: Writer" and the standard writer metrics appear:
> numRecordsSend counts the records added to the JDBC batch, and numBytesSend
> stays at zero. A statement set without uids in which a JDBC sink receives a
> rowtime column cannot restore an older savepoint, because the planner puts
> a timestamp inserter in front of every Sink V2 sink. We'd include that in
> the release notes.
>
> I will also update the FLIP page, which still carries the discussion label
> and no release.
>
> Best regards,
>
> Martijn
>
> [1]
>
> https://cwiki.apache.org/confluence/display/FLINK/FLIP-239%3A+Port+JDBC+Connector+to+FLIP-27%26FLIP-143
> [2] https://github.com/apache/flink-connector-jdbc/pull/254
>

Reply via email to