SEPURI-SAI-KRISHNA commented on issue #12979:
URL: https://github.com/apache/seatunnel/issues/12979#issuecomment-6414164003
Thanks, for confirming and I am not opening a PR. Your plan matches what I
measured. Four notes, all from compiling and running the variants on JDK 17,
because two hit the exact shape you describe.
**1. `extraTablePaths` is `final` (line 37), which constrains where you
rebuild it.** Rebuilding inside `readObject` does not compile:
```
error: cannot assign a value to final variable extraTablePaths
```
So either drop `final` and rebuild in `readObject`, or keep `final` and use
`readResolve` returning `new ChainedMapTransform(transforms)`, which works
because `transforms` is not transient and the constructor already refreshes. I
ran both: each restores the UID and survives a pre-#12804 stream. #11872 takes
the `readResolve` route for `RabbitmqSourceState`.
**2. If you rebuild in `readObject`, assign the list first or it throws.**
`refreshExtraTablePaths()` opens with `extraTablePaths.clear()`, and a
transient field is `null` after deserialization:
```
NullPointerException: Cannot invoke "java.util.List.clear()" because
"this.extraTablePaths" is null
at ChainedMapTransform.refreshExtraTablePaths(ChainedMapTransform.java:50)
at ChainedMapTransform.readObject(...)
```
`defaultReadObject()`, then `extraTablePaths = new ArrayList<>()`, then
refresh.
**3. Your bullet 3 is already covered by `transient`.** Measured with
`ObjectStreamClass.lookup`: pre-#12804 `8769738606872706499`, current dev
`4659105814088680487`, and either fix above `8769738606872706499`, identical to
pre-#12804. The computation skips private transient fields, so no explicit pin
and no `serialver`.
**4. The UID window SEZ9 asked you to state, with a measured answer.**
Restoring the old UID breaks the other direction, under both mechanisms.
Writing on current dev and reading with the fix gives `InvalidClassException`,
stream `4659105814088680487` against local `8769738606872706499`. That window
opened with #12804 on 2026-10-17 and only ever existed on the snapshot, so it
looks like the right trade, but better stated than found in review.
For the test config: `composeTransforms` returns the bare transform at
`size() == 1`, `AbstractMultiCatalogTransform:72` rejects duplicate paths when
`rule_match_mode` is unset, and `FIRST_MATCH` keeps only the first. So you need
`rule_match_mode = ALL_MATCH` with two or more `table_transform` entries on one
`table_path`.
Happy to hand over the pre-#12804 and current-dev streams as fixtures. No
Docker or E2E, just two JVMs.
--
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]