airbytehq / airbytehq/airbyte

[source-mysql] MySQL CDC GTID validation can fail with "other is null"

未關閉
#75,558 6 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
area/connectors autoteam community connectors/source/mysql needs-triage team/extensibility team/use type/bug
主要語言
Python
星號
22.1k
分支
5.4k
平均合併
5 小時
30 天內合併 PR
671

描述

### Connector Name

source-mysql

### Connector Version

3.51.5

### What step the error happened?

During the sync

### Relevant information

We observed MySQL CDC failures with the following error:

- `Incumbent CDC state is invalid`
- `java.lang.NullPointerException`
- `Cannot invoke "io.debezium.connector.mysql.gtid.MySqlGtidSet$UUIDSet.getUUID()" because "other" is null`

This came up while validating CDC against a restored MySQL instance used for staging/testing.

Related discussion:
- https://github.com/airbytehq/airbyte/discussions/74305

Upstream Debezium context:
- https://github.com/debezium/debezium/pull/6894
- https://github.com/debezium/debezium/commit/84206138cdb1983a33623f31517e2caea5d16c35

Findings from investigation:

1. The Bulk Extract CDC toolkit still depended on Debezium `3.1.2.Final`.
2. In local validation, moving that dependency line to Debezium `3.4.2.Final` removed the GTID null-handling failure
path.
3. While validating that change, we found that `source-mysql` was still pinned to Bulk CDK `0.1.77`, and the current
connector sources on `master` no longer compile cleanly against that stale published artifact.
4. `source-mysql` also still used the deprecated Jackson API `ObjectNode.fields()`, which fails under Kotlin `-Werror`.

This needs to be addressed in two follow-up PRs:
- one PR for the Bulk Extract CDC toolkit Debezium bump
- one PR for `source-mysql` Bulk CDK alignment and deprecated Jackson API cleanup

### Relevant log output

```shell
2026-03-27 15:14:01 source ERROR main i.a.c.AirbyteConnectorRunnable(run):38 Failed class io.airbyte.cdk.read.ReadOperation operation execution. io.airbyte.cdk.ConfigErrorException: Incumbent CDC state is invalid, reason: java.lang.NullPointerException: Cannot invoke "io.debezium.connector.mysql.gtid.MySqlGtidSet$UUIDSet.getUUID()" because "other" is null
at io.airbyte.cdk.read.cdc.CdcPartitionsCreator.run(CdcPartitionsCreator.kt:85) ~[bulk-cdk-toolkit-extract-cdc-0.1.77.jar:?]
at io.airbyte.cdk.read.FeedReader.createPartitionsWithResources(FeedReader.kt:148) ~[bulk-cdk-core-extract-0.1.77.jar:?]
at io.airbyte.cdk.read.FeedReader.access$createPartitionsWithResources(FeedReader.kt:35) ~[bulk-cdk-core-extract-0.1.77.jar:?]
at io.airbyte.cdk.read.FeedReader$createPartitions$3.invokeSuspend(FeedReader.kt:121) ~[bulk-cdk-core-extract-0.1.77.jar:?]
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ~[kotlin-stdlib-2.1.10.jar:2.1.10-release-473]
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702) ~[kotlinx-coroutines-core-jvm-1.8.1.jar:?]

Stack Trace: io.airbyte.cdk.ConfigErrorException: Incumbent CDC state is invalid, reason: java.lang.NullPointerException: Cannot invoke "io.debezium.connector.mysql.gtid.MySqlGtidSet$UUIDSet.getUUID()" because "other" is null
at io.airbyte.cdk.read.cdc.CdcPartitionsCreator.run(CdcPartitionsCreator.kt:85)
at io.airbyte.cdk.read.FeedReader.createPartitionsWithResources(FeedReader.kt:148)
at io.airbyte.cdk.read.FeedReader.access$createPartitionsWithResources(FeedReader.kt:35)
at io.airbyte.cdk.read.FeedReader$createPartitions$3.invokeSuspend(FeedReader.kt:121)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702)
```

### Contribute

- [x] Yes, I want to contribute

---
**Internal Tracking:** https://github.com/airbytehq/oncall/issues/11532

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。