CloverDew commented on PR #11025:
URL: https://github.com/apache/seatunnel/pull/11025#issuecomment-5310825818

   > > @CloverDew感谢您的贡献。我发现了一些需要修复的问题:
   > > ### 为什么绿色的端到端测试结果并不能验证此功能
   > > 两个 MySQL CDC E2E 作业均已通过最终 PR 提交:
   > > 
   > > * [ [JDK 
8](https://github.com/CloverDew/seatunnel/actions/runs/31555429214/job/94316168568)
 ]( 
[https://github.com/CloverDew/sea](https://github.com/CloverDew/seatunnel/actions/runs/31555429214/job/94316168568)
 ​​tunnel/actions/runs/31555429214/job/94316168568 )
   > > * [ [JDK 
11](https://github.com/CloverDew/seatunnel/actions/runs/31555429214/job/94316168831)
 ]( 
[https://github.com/CloverDew/sea](https://github.com/CloverDew/seatunnel/actions/runs/31555429214/job/94316168831)
 ​​tunnel/actions/runs/31555429214/job/94316168831 )
   > > 
   > > 然而,当前的端到端断言并未验证 CDC 模式变更事件契约。它们针对源 MySQL 数据库执行 
DDL,查询源数据库自身`information_schema`以验证其注释,然后验证普通数据记录是否继续到达目标数据库。
   > > 因此,即使发生以下情况,测试结果仍可能保持为绿色:
   > > 
   > > * 使用了错误的表标识符发出;
   > > * 被忽略或掉落在水槽前;
   > > * 表示为错误的模式更改事件类型;
   > > * 将其作为结构柱修改而不是仅作为注释的空操作。
   > > 
   > > 作业日志证实了这一点:
   > > ```
   > > AlterColumnCommentEvent: 0 occurrences
   > > 
   > > AlterTableModifyColumnEvent
   > > columnLength=2048
   > > sourceType=VARCHAR(512)
   > > typeChanged=true
   > > 
   > > AlterTableCommentEvent
   > > tableIdentifier=.null.products
   > > changeAfter=null
   > > 
   > > Not found table products
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > 因此,绿色 E2E 结果是此 PR 引入的功能的误报。
   > > ### 1. 新的表格注释路径将预先存在的解析器上下文问题传播到已发出的事件中。
   > > 以下序列在此 PR 之前已存在:
   > > ```java
   > > ddlParser.setCurrentDatabase(tablePath.getDatabaseName());
   > > ddlParser.setCurrentSchema(tablePath.getSchemaName());
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > Debezium 1.9.8 将这两个值存储在同一个`currentSchema`字段中。对于 MySQL 
来说,`tablePath.getSchemaName()`由于是`null`,因此第二次调用会清除数据库上下文。
   > > 这个底层解析器上下文问题早于此 
PR。然而,在此更改之前,列事件被返回到一个由表路径重建的`AlterTableColumnsEvent`顶层元素中。新的表注释路径则直接返回解析器创建的事件:`TableIdentifier``SourceRecord`
   > > ```java
   > > if (parsedEvents.size() == 1
   > >         && parsedEvents.get(0) instanceof AlterTableCommentEvent) {
   > >     return parsedEvents.get(0);
   > > }
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > 
比较[[基础实现](https://github.com/apache/seatunnel/blob/0a5ceee2018e44659593fc16ad57f154a4483210/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L77-L103)](
   > > 
https://github.com/apache/seatunnel/blob/0a5ceee2018e44659593fc16ad57f154a4483210/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L77-L103
   > > 
   > > ) 与 
[[新的直接返回路径](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L81-L108)](
   > > 
https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L81-L108
   > > 
   > > 这就
   > > 形成了`.null.products`顶级事件标识符。结果如下:
   > > 
   > > * 该事件无法与以下事件匹配`.shop.products`:
   > > * 源端`CatalogTable`未更新;
   > > * `changeAfter`剩余部分`null`;
   > > * 后续的评论更改仍然得到错误的结果`oldComment`;
   > > * Zeta 多表处理可能会将事件丢弃,因为它属于未知表。
   > > 
   > > 解析后的事件必须先按照`SourceRecord`/catalog格式进行规范化`TablePath`才能返回。
   > > ### 2. 新的列注释分类与现有的 MySQL 类型规范化不兼容。
   > > 测试 DDL 仅向现有`VARCHAR(512)`列添加注释:
   > > ```sql
   > > ALTER TABLE products
   > > MODIFY COLUMN description VARCHAR(512)
   > > COMMENT 'Product description text';
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > 然而,两个真正的 E2E 
作业都会发出一个`AlterTableModifyColumnEvent`;不会`AlterColumnCommentEvent`产生任何结果。
   > > 在此 PR 之前, MySQL 
转换就已经扩展了字符长度`charTo4ByteLength`。新的[`[isSameColumnExceptComment](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L254-L289)`](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-cdc/connector-cdc-base/src/main/java/org/apache/seatunnel/connectors/cdc/base/schema/AbstractSchemaChangeResolver.java#L254-L289)转换会比较原始列表示形式,包括
 `<string>` `columnLength`,因此语义相同的`VARCHAR(512)`定义会比较失败。
   > > 这并非之前正常运行的评论事件功能的回归——该功能之前根本不存在。这意味着此 PR 中声称的主列评论功能在实际的 CDC 路径中实际上无法正常工作。
   > > 当前的行为也允许接收器接收结构化事件`ModifyColumnEvent`。JDBC 会执行实际的事件`ALTER TABLE ... 
MODIFY COLUMN`,而像 Elasticsearch 这样的接收器可能会完全拒绝该事件。
   > > 比较必须使用规范化的列元数据,并且 E2E 测试必须断言纯粹的注释更改会产生`AlterColumnCommentEvent`。
   > > ### 3. 生成预期的列注释事件时,会发现 Zeta 和 Databend 集成缺失。
   > > 当前的 E2E 流程无法到达此路径,因为问题 2 阻止了`AlterColumnCommentEvent`流程的生成。
   > > 问题 2 解决后,该事件将嵌套在`AlterTableColumnsEvent`. 
Zeta[`[SeaTunnelSourceCollector](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/SeaTunnelSourceCollector.java#L270-L291)`](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/SeaTunnelSourceCollector.java#L270-L291)仍然使用已弃用的[`[DataTypeChangeEventDispatcher](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/schema/handler/DataTypeChangeEventDispatcher.java#L59-L79)`](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/schema/handler/DataTypeChangeEventDispatcher.java#L5
 9-L79).
   > > 
外部处理`AlterTableColumnsEvent`程序被分派到[`[AlterTableEventHandler](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/schema/handler/AlterTableEventHandler.java#L60-L86)`](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/schema/handler/AlterTableEventHandler.java#L60-L86),但该处理程序没有嵌套分支`AlterColumnCommentEvent`,将会抛出异常`UnsupportedOperationException`。
   > > 这些调度器类早于此次 PR,但新的事件类型并非如此。添加该事件需要将其与使用模式变更事件的引擎路径集成。
   > > Databend 在此 PR 
中引入了一个单独的问题。它会在检查之前[`[SchemaChangeManager](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/schema/SchemaChangeManager.java#L63-L140)`](https://github.com/apache/seatunnel/blob/12eba6fb116824f85cc7eb63c7b7b77c48bee612/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/schema/SchemaChangeManager.java#L63-L140)进行检查。由于继承自
 `extends` 
,它会首先进入通用分支,导致嵌套的处理程序最终抛出异常,而不是忽略评论事件。`AlterTableColumnEvent``AlterColumnCommentEvent``AlterColumnCommentEvent``AlterTableColumnEvent`
   > > 因此,仅修复生产者端分类将把当前的错误绿色 E2E 变成确定性的 Zeta 和 Databend 故障。
   > > ### 4. 此 PR 直接导致 MySQL DDL 解析器错误处理机制退化。
   > > 在此 PR 之前,自定义解析器调用了:
   > > ```java
   > > super();
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > Debezium 1.9.8 的默认设置等同于:
   > > ```java
   > > super(true, false, false, ...);
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > 在哪里`throwErrorsFromTreeWalk=true`。
   > > 此 PR 将其更改为:
   > > ```java
   > > super(false, false, true, ...);
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > 此项更改启用了注释解析,但同时也禁用了在解析树遍历过程中收集到的错误抛出。SeaTunnel 
不再检索或传播这些错误`getParsingExceptionsFromWalker()`,因此部分解析的 DDL 现在可能会静默地产生不完整的模式更改事件。
   > > 这是 PR 引入的直接行为回归。预期的构造函数调用应该保留之前的错误行为:
   > > ```java
   > > super(true, false, true, ...);
   > > ```
   > > 
   > > 
   > >     
   > >       
   > >     
   > > 
   > >       
   > >     
   > > 
   > >     
   > >   
   > > ### 需要后续跟进
   > > 这些发现不应被视为孤立的小问题,因为它们相互掩盖。特别是,如果不更新消费者,仅修正列分类将会暴露 Zeta 和 Databend 的确定性故障。
   > > 完整的纠正性变更应验证以下几点:
   > > 
   > > 1. 表格注释事件使用`.shop.products`,而不是`.null.products`。
   > > 2. 连续的表注释更改包含正确`oldComment`且非空的值`changeAfter`。
   > > 3. 纯粹的列注释更改会产生`AlterColumnCommentEvent`。
   > > 4. 真正的结构类型变化仍然会产生影响`AlterTableModifyColumnEvent`。
   > > 5. 评论事件能够顺利地通过 Zeta 和受影响的接收器分发路径。
   > > 6. 解析器树遍历错误仍在持续传播。
   > > 7. E2E 断言检查的是发出的事件类型、表路径和下游结果,而不仅仅是源数据库状态和普通的行连续性。
   > 
   > @CloverDew您好,能否提交一个 PR 来修复这个问题?谢谢 🙏 无需撤销此 PR;我已经修改了评论内容。
   
   ok, I'll add more later.


-- 
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]

Reply via email to