Skip to content

Conversation

@OliverS929
Copy link
Contributor

What problem does this PR solve?

Issue Number: ref #12350

What is changed and how it works?

This PR introduces foreign key-causality support to the DM syncer.

  • In the schema tracker, DownstreamTableInfo now captures a set of ForeignKeyCausalityRelation entries that represent parent→child table dependencies via foreign key constraints.
  • The syncer’s RowChange objects now include these relations so that change processing can honour FK dependencies.
  • A new integration test suite foreign_key_multi_worker validates correct multi-worker behaviour when foreign key chains exist, helping ensure correctness under concurrent execution.

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
  • No code

Questions

Will it cause performance regression or break compatibility?
Do you need to update user documentation, design documentation or monitoring documentation?

Release note

Please refer to [Release Notes Language Style Guide](https://pingcap.github.io/tidb-dev-guide/contribute-to-tidb/release-notes-style-guide.html) to write a quality release note.

If you don't think this PR needs a release note then fill it with `None`.

@ti-chi-bot ti-chi-bot bot added release-note Denotes a PR that will be considered when it comes time to generate release notes. area/dm Issues or PRs related to DM. labels Nov 25, 2025
@ti-chi-bot
Copy link
Contributor

ti-chi-bot bot commented Nov 25, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign benjamin2037 for approval. For more information see the Code Review Process.
Please ensure that each of them provides their approval before proceeding.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@ti-chi-bot ti-chi-bot bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Nov 25, 2025
@gemini-code-assist
Copy link

Summary of Changes

Hello @OliverS929, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the DM syncer's capability to handle foreign key constraints. By tracking and incorporating foreign key causality relations into row change processing, the syncer can now ensure data consistency and correct behavior when dealing with complex parent-child table dependencies, especially in multi-worker environments. This improvement is vital for reliable data migration and synchronization where relational integrity is paramount.

Highlights

  • Foreign Key Causality Tracking: The schema tracker's DownstreamTableInfo now captures ForeignKeyCausalityRelation entries, representing parent-child table dependencies based on foreign key constraints. This involves new logic to recursively build these relations.
  • Enhanced Row Change Processing: The syncer's RowChange objects now include these foreign key causality relations. This ensures that change processing honors foreign key dependencies, which is crucial for maintaining data integrity during synchronization.
  • New Integration Test Suite: A new integration test suite, foreign_key_multi_worker, has been added. This suite specifically validates the correct multi-worker behavior when complex foreign key chains exist, ensuring robustness under concurrent execution scenarios.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces foreign key causality support to the DM syncer, a significant feature for ensuring data consistency in multi-worker scenarios. The changes are well-structured. The core logic in buildForeignKeyRelations correctly traverses the foreign key graph to find root dependencies, handling memoization and cycle detection. The new causality keys are then correctly integrated into the existing DML generation and validation paths. The addition of a comprehensive integration test (foreign_key_multi_worker) is excellent and provides strong validation for this new feature. I have a few suggestions to improve logging for better observability and a fix for a typo in the new test script.

run_sql_tidb_with_retry "SELECT COUNT(*) FROM fk_chain.parent;" "COUNT(*): 2"
run_sql_tidb_with_retry "SELECT COUNT(*) FROM fk_chain.child;" "COUNT(*): 4"
run_sql_tidb_with_retry "SELECT data FROM fk_chain.child WHERE child_id=100;" "data: c100_updated"
run_sql_tidb_with_retry "SELECT parent_id FROM fk_chain.child WHERE child_id=201;" "parent_id: 10"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

There's a typo in the table name in this SELECT query. It should be fk_chain.child instead of fk.chain.child. This will cause the integration test to fail.

Suggested change
run_sql_tidb_with_retry "SELECT parent_id FROM fk_chain.child WHERE child_id=201;" "parent_id: 10"
run_sql_tidb_with_retry "SELECT parent_id FROM fk_chain.child WHERE child_id=201;" "parent_id: 10"

Comment on lines +538 to +540
if _, ok := visiting[tableID]; ok {
return nil, nil
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

When a foreign key cycle is detected, the function currently returns nil, nil silently. While this correctly breaks the recursion, it would be beneficial for debugging and observability to log a warning when this happens. This would make it easier to diagnose unexpected causality behavior in schemas with cyclic dependencies.

Suggested change
if _, ok := visiting[tableID]; ok {
return nil, nil
}
if _, ok := visiting[tableID]; ok {
tctx.Logger.Warn("foreign key cycle detected, will be ignored for causality", zap.String("table", tableID))
return nil, nil
}

Comment on lines +173 to +176
if idx >= len(values) {
skip = true
break
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The code currently handles an out-of-bounds index by silently skipping the foreign key relation. While this is safe, it would be better to log a warning. An out-of-bounds index could indicate a discrepancy between the schema information and the row data, which might be a symptom of a deeper issue. Logging this would improve debuggability.

                        if idx >= len(values) {
					log.L().Warn("foreign key child column index out of bounds, skipping relation",
						zap.Stringer("table", r.sourceTable),
						zap.Int("index", idx),
						zap.Int("values-count", len(values)))
					skip = true
					break
				}

@ti-chi-bot
Copy link
Contributor

ti-chi-bot bot commented Nov 25, 2025

@OliverS929: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
pull-verify 0c154bf link true /test pull-verify
pull-dm-integration-test 0c154bf link true /test pull-dm-integration-test

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/dm Issues or PRs related to DM. release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant