nzw921rx opened a new issue, #12949: URL: https://github.com/apache/seatunnel/issues/12949
# Apache SeaTunnel 3.1.0 Bugfix Roadmap Apache SeaTunnel 3.0.0 was released on 2026-09-29. This issue tracks the bug fixes that should land in 3.1.0, ordered by user impact. It is a coordination tracker, not a release branch. **Selection criteria** - Data correctness and data loss first. Silent wrong results are treated as the highest priority. - Engine correctness: checkpointing, recovery, failover, cancellation, and state restore. - Hangs, infinite polls, resource leaks, and shutdown gaps that can wedge a job. - Small and high-value fixes over large refactors: type conversion, precision, encoding, SQL generation. - Excluded: docs, CI, test-only/E2E-only changes, pure feature work, and option-declaration completeness. **Status** - Sections 1-6: merged on `dev`, will ship in 3.1.0. - Section 7: open PR, needs review and landing. - Section 8: open bug without a fix on `dev`, needs an owner. ## 1. Data correctness (merged on `dev`) | PR | Fix | | --- | --- | | #12608 | MySQL-CDC no longer emits `0` instead of `NULL` for nullable unique-key columns on tables without a primary key. | | #12597 | CDC sources no longer use a nullable unique column as the snapshot split column, which silently skipped every row with `NULL`. | | #12463 | MySQL-CDC snapshot splitting handles highly non-consecutive primary keys without checkpoint expiry. | | #12355 | MySQL-CDC keeps the `SET`/`ENUM` value list when rebuilding the source type on schema change. | | #12836 | Postgres-CDC resolves type-name cache misses using the connection's `search_path`. | | #12547 | Postgres-CDC applies `ADD COLUMN` on the first RELATION with pgjdbc 42.7.5+. | | #12588 | Postgres catalog and Postgres-CDC support enum columns (previously failed with COMMON-21). | | #12803 | JDBC sink no longer collapses all rows whose key contains `NULL` into a single buffered row. | | #11730 | JDBC MERGE omits an empty `UPDATE SET` clause for tables where every column is a key. | | #12840 | ClickHouse sink keeps rows with incomplete keys as separate entries instead of reducing them to the last row. | | #11562 | Doris 2PC reports the checkpoint as committed only after the stream-load label reaches `VISIBLE`. | | #12692 | StarRocks verifies the label state on Publish Timeout before releasing the batch (fail closed). | | #12848 | Databend CDC runs the final `MERGE` when the writer closes, so the last batch is not dropped. | | #12605 | `CAST(... AS INT)` fails on out-of-range numeric input instead of silently wrapping. | | #12335 | Transform SQL no longer consumes the caller's input `ByteBuffer` during evaluation. | | #12364 | `ARRAY_MAX`/`ARRAY_MIN` use exact numeric comparison, avoiding precision loss. | | #12320 | DataValidator `LENGTH` counts array elements instead of comparing a Java identity string. | | #12801 | XML file sink honors `date_format`, `time_format`, and `datetime_format`. | | #12768 | Excel source fixes column mapping and `read_columns` projection. | | #12826 | Parquet INT96 timestamps use a locale-independent calendar (Thai locale shifted years). | | #12527 | `SeaTunnelRowType` copies the arrays passed to its constructor, so later mutation cannot corrupt the type definition. | | #11524 | Iceberg to Doris TIMESTAMP_TZ keeps the wall-clock value instead of shifting it to UTC. | ## 2. Engine and job lifecycle (merged on `dev`) | PR | Fix | | --- | --- | | #12454 | Zeta task startup/recovery no longer hangs, and PostgreSQL CDC rows are preserved when resuming at a shared commit/row LSN. | | #11677 | Zeta reassigns restored splits to waiting readers after checkpoint recovery (the job could stay `RUNNING` and produce no data). | | #11781 | Zeta restores legacy job-status WAL entries after the job status classes moved modules. | | #12420 | Zeta/JDBC cancellation now cancels in-flight JDBC statements and closes their resources. | | #11103 | File sink checkpoint no longer closes an output file while a row is still being written. | | #12412 | HTTP source releases the checkpoint lock while waiting `poll_interval_millis`, so streaming checkpoints complete. | | #11929 | Arrow-to-row reader closes resources in the correct order, fixing a memory leak. | ## 3. Resource leaks, hangs, and stuck jobs (merged on `dev`) | PR | Fix | | --- | --- | | #12326 | Iceberg sink closes the table loader even when record-writer close fails. | | #12600 | MongoDB committer guards a null session during close. | | #12099 | RocketMQ source closes the consumer before interrupting its executor. | | #12718 | Doris source closes the previous split's value reader before replacing it. | | #12324 | ClickHouse streaming source reports a failed stream read instead of silently ending the split. | | #12727 | ClickHouse streaming source fails on interrupt instead of polling for batches forever. | | #12325 | Doris async Arrow reader stops polling forever when a backend fetch fails and fails the job. | | #12689 | SFTP sink handles concurrent directory creation by multiple writers. | | #12480 | Kudu client deadlock on JDK 11 in the Flink JobManager. | | #12738 | Lance sink writes one fragment per flush instead of one fragment per buffered row. | | #12698 | ActiveMQ sink no longer leaks a Session/MessageProducer on every `write()` call. | | #11516 | Parquet source no longer throws NPE on Spark when `tableId` is missing. | ## 4. Type, precision, and schema correctness (merged on `dev`) | PR | Fix | | --- | --- | | #12541 | DuckDB `TIME` preserves microseconds. | | #12593 | DuckDB unknown `BIT`/`ENUM` lengths are preserved instead of being replaced with 1/255. | | #12582, #12576 | DuckDB type-name matching and SQL digit generation are locale independent. | | #12503 | DuckDB catalog metadata literals are escaped (names with quotes). | | #12529 | JDBC named-parameter SQL supports column names containing spaces. | | #12526 | ClickHouse sink supports special characters in column names. | | #12596 | SQL Server `DROP TABLE` quotes the table path correctly. | | #11686 | YashanDB `VARCHAR2`/`NVARCHAR2` type conversion. | | #11684, #12791 | Dameng `NVARCHAR2`, `TIMESTAMP WITH LOCAL TIME ZONE`, and interval types. | | #12333, #10453 | MySQL `UNSIGNED` is derived only for numeric columns, and `SET` columns containing the word "unsigned" are readable. | | #12429 | Cassandra preserves all configured bootstrap contact points. | | #12786 | Tablestore sink no longer throws ClassCastException for numeric columns. | | #12770 | Hudi catalog converts MAP and ARRAY columns correctly. | | #12761 | Doris source supports IPV4 and IPV6 columns. | | #12792 | PostgreSQL `numeric` NaN/Infinity values can be mapped to null instead of aborting the job. | ## 5. Security (merged on `dev`) | PR | Fix | | --- | --- | | #12040 | HTTP connector validates credential scheme and removes the token from `toString()`. | | #12595 | Zeta basic-auth comparison no longer leaks timing information. | | #12633 | CLI redacts credentials from conversation summaries and stored history. | ## 6. Small high-value core/API/CLI fixes (merged on `dev`) | PR | Fix | | --- | --- | | #12568 | `multi_table_sink_replica` below 1 is rejected during validation with a diagnosable error. | | #12775 | Zeta Web UI restores routes when the URL fragment is percent-encoded. | | #12536 | Config validation treats an exported empty value as a resolved placeholder. | | #12634, #12632 | CLI clears pending clarification on session changes and resumes the most recently active session. | | #12722 | CLI defaults the engine REST base URL to the Jetty HTTP port. | | #12938 | Restores deserialization of the archived LLM factory wrapper after the `serialVersionUID` change. | ## 7. High-value fixes still in review These PRs are open as of 2026-10-22. They are the highest-impact items not yet on `dev`. | PR | Fix | Issue | Status | | --- | --- | --- | --- | | #12387 | Zeta restores a job from its own latest checkpoint on master failover. | #12385 | In review | | #12511 | Zeta waits for the in-flight checkpoint outside the coordinator lock when starting a savepoint. | #12441 | In review | | #12626 | Zeta releases MongoDB/Hadoop references to job classloaders (Metaspace OOM). | #12456 | Draft | | #12218 | Zeta rolls back the task-execution context after a post-publish deploy failure. | #12164 | In review | | #12377 | Zeta preserves `CANCELED` when a worker fails during cancellation. | #12353 | In review | | #11564 | Zeta offloads report-metrics operations, fixing batch jobs that hang in `RUNNING`. | #10997 | Approved | | #11727 | Zeta releases the start latch when a blocking worker cannot start. | #11679 | In review | | #12625 | JDBC sink fails instead of committing when uncommitted batches were lost. | #12624 | In review | | #12853 | JDBC preserves MySQL `DECIMAL` precision above 38. | #12841 | In review | | #12899 | Transform fails `CAST(... AS BIGINT)` on out-of-range numeric input. | #12612 | In review | ## 8. Open bugs that need an owner | Issue | Impact | | --- | --- | | #12382 | Postgres-CDC loses change events after restore when the source commits offsets past its LSN. | | #12212 | MySQL-CDC rows-event deserialization EOF fails the job and can lose records after recovery. | | #8815 | TiDB-CDC loses CDC events. | | #12934 | CSV import converts whitespace to NULL. | | #12243 | Paimon DELETE records can remain when multiple Flink sink writers write to the same bucket. | | #12753 | Doris `LARGEINT` is declared as `DECIMAL(20,0)`, so non-Doris sinks fail on large values. | | #12752 | Dameng `NVARCHAR`/`NVARCHAR2` length is reported as twice the declared length. | | #11632 | JSON deserialization ignores schema `defaultValue`, leaving fields null. | | #10440 | SQL Server `datetimeoffset` is mapped to `LocalDateTime` instead of `OffsetDateTime`. | | #12601 | Postgres-CDC `ADD COLUMN` with a user-defined type fails when the type name is not schema-qualified. | | #11752 | Flink schema-change events do not refresh all parallel sink writers. | | #10512 | Oracle-CDC does not sync updates to `CLOB` columns. | ## Notes - This list is curated. Fixes that only touch docs, CI, or test infrastructure are intentionally omitted. - Backporting to `3.0.0-release` should be decided case by case; data-loss fixes in sections 1-3 are the first candidates. - Please keep one PR per fix and link it back to this issue. - If you want to take an item from section 8, comment below to claim it. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
