Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix sync schema after schema version key be removed #7072

Merged
merged 14 commits into from
Mar 16, 2023

Conversation

yongman
Copy link
Member

@yongman yongman commented Mar 14, 2023

What problem does this PR solve?

Issue Number: close #7071

Problem Summary:

What is changed and how it works?

If schema version key for keyspace not exists, load all schema and tombstone tables and databases in this keyspace.

Check List

Tests

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

Side effects

  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Breaking backward compatibility

Documentation

  • Affects user behaviors
  • Contains syntax changes
  • Contains variable changes
  • Contains experimental features
  • Changes MySQL compatibility

Release note

None

@ti-chi-bot
Copy link
Member

ti-chi-bot commented Mar 14, 2023

[REVIEW NOTIFICATION]

This pull request has been approved by:

  • JaySon-Huang
  • Lloyd-Pottiger

To complete the pull request process, please ask the reviewers in the list to review by filling /cc @reviewer in the comment.
After your PR has acquired the required number of LGTMs, you can assign this pull request to the committer in the list by filling /assign @committer in the comment to help you merge this pull request.

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

Reviewer can indicate their review by submitting an approval review.
Reviewer can cancel approval by submitting a request changes review.

@ti-chi-bot ti-chi-bot added do-not-merge/needs-triage-completed release-note-none Denotes a PR that doesn't merit a release note. size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Mar 14, 2023
@yongman
Copy link
Member Author

yongman commented Mar 14, 2023

/cc @JaySon-Huang @CalvinNeo

@yongman
Copy link
Member Author

yongman commented Mar 14, 2023

/cc @iosmanthus

@ti-chi-bot ti-chi-bot requested a review from iosmanthus March 14, 2023 08:29
Comment on lines 119 to 123
if (version == -1 && cur_version == version)
{
// Tables and databases are already tombstoned and waiting for GC.
return false;
}
Copy link
Contributor

@iosmanthus iosmanthus Mar 14, 2023

Choose a reason for hiding this comment

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

I think it's too implicit, the reader does not know the table's dropped in builder.syncAllSchemas. How about constructing a builder here and calling applyDropSchema for each table/database explicitly? /cc @JaySon-Huang

Copy link
Contributor

@JaySon-Huang JaySon-Huang Mar 14, 2023

Choose a reason for hiding this comment

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

How about constructing a builder here and calling applyDropSchema for each table/database explicitly?

Is there a chance that SchemaGetter::getVersion get -1, but the tables and databases metadata on TiKV does not get fully cleaned yet?

Copy link
Contributor

Choose a reason for hiding this comment

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

I think it's too implicit

I agree, now it is kind of complicated, we can add a shortcut logic when version < 0 to skip some codes and make the flow more clear.

Copy link
Member Author

Choose a reason for hiding this comment

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

Is there a chance that SchemaGetter::getVersion get -1, but the tables and databases metadata on TiKV does not get fully cleaned yet?

I think partial deletion of an entire keyspace is illegal.

Copy link
Contributor

Choose a reason for hiding this comment

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

how do the Regions of a "deleted" keyspace get removed from TiKV? Are they removed one by one?

Copy link
Member Author

@yongman yongman Mar 14, 2023

Choose a reason for hiding this comment

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

@JaySon-Huang No, the keyspace range will be delete in two UnsafeDestroyRange requests, one for transaction kv space, the other for raw kv space.

Copy link
Member Author

@yongman yongman Mar 14, 2023

Choose a reason for hiding this comment

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

I agree that it's better make the logic more direct, the logic now is to treat the version=-1 as same as version>=0 to sync schema, but return ASAP in tryLoadSchemaDiffs if version=-1.
Emm, is it necessary to implement a branch to syncAllSchemas and maintain the metrics ? 🤦 /cc @JaySon-Huang @iosmanthus

Copy link
Member Author

Choose a reason for hiding this comment

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

Considering of possibility inconsistency of getVersion and listDBs after UnsafeDestroyRange, we do not need to listDB or listTables if the schema version key not exists. It‘s neccessary to run shortcut logic in this case. We can add a new method SchemaBuilder::dropAllSchema() to resolve this. /cc @JaySon-Huang @iosmanthus

Copy link
Contributor

Choose a reason for hiding this comment

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

LGTM

JaySon-Huang and others added 3 commits March 14, 2023 20:07
@ti-chi-bot ti-chi-bot added size/L Denotes a PR that changes 100-499 lines, ignoring generated files. and removed size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Mar 15, 2023
@yongman
Copy link
Member Author

yongman commented Mar 15, 2023

@JaySon-Huang @iosmanthus PTAL

Signed-off-by: yongman <[email protected]>
dbms/src/TiDB/Schema/SchemaBuilder.cpp Outdated Show resolved Hide resolved
dbms/src/TiDB/Schema/TiDBSchemaSyncer.h Outdated Show resolved Hide resolved
dbms/src/TiDB/Schema/TiDBSchemaSyncer.h Outdated Show resolved Hide resolved
Copy link
Contributor

@JaySon-Huang JaySon-Huang left a comment

Choose a reason for hiding this comment

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

The rest LGTM

dbms/src/TiDB/Schema/SchemaGetter.h Outdated Show resolved Hide resolved
dbms/src/TiDB/Schema/TiDBSchemaSyncer.h Outdated Show resolved Hide resolved
dbms/src/TiDB/Schema/TiDBSchemaSyncer.h Outdated Show resolved Hide resolved
@ti-chi-bot ti-chi-bot added the status/LGT1 Indicates that a PR has LGTM 1. label Mar 15, 2023
Signed-off-by: yongman <[email protected]>
@yongman
Copy link
Member Author

yongman commented Mar 16, 2023

/run-all-tests

Comment on lines 1391 to 1400
for (auto it = storage_map.begin(); it != storage_map.end(); it++)
{
auto table_info = it->second->getTableInfo();
if (table_info.keyspace_id != keyspace_id)
{
continue;
}
applyDropPhysicalTable(it->second->getDatabaseName(), table_info.id);
LOG_DEBUG(log, "Table {}.{} dropped during drop all schemas", it->second->getDatabaseName(), name_mapper.debugTableName(table_info));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

better to use Range-based for loop

Copy link
Member Author

@yongman yongman Mar 16, 2023

Choose a reason for hiding this comment

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

@Lloyd-Pottiger This code block is copied from syncAllSchemas, we should keep the code style same?

Copy link
Contributor

Choose a reason for hiding this comment

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

no, improve it, I think.

Copy link
Member Author

Choose a reason for hiding this comment

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

PTAL~

Signed-off-by: yongman <[email protected]>
@ti-chi-bot ti-chi-bot added status/LGT2 Indicates that a PR has LGTM 2. and removed status/LGT1 Indicates that a PR has LGTM 1. labels Mar 16, 2023
@Lloyd-Pottiger
Copy link
Contributor

/merge

@ti-chi-bot
Copy link
Member

@Lloyd-Pottiger: It seems you want to merge this PR, I will help you trigger all the tests:

/run-all-tests

You only need to trigger /merge once, and if the CI test fails, you just re-trigger the test that failed and the bot will merge the PR for you after the CI passes.

If you have any questions about the PR merge process, please refer to pr process.

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 ti-community-infra/tichi repository.

@ti-chi-bot
Copy link
Member

This pull request has been accepted and is ready to merge.

Commit hash: 80a2e5b

@ti-chi-bot ti-chi-bot added the status/can-merge Indicates a PR has been approved by a committer. label Mar 16, 2023
@ti-chi-bot
Copy link
Member

@yongman: Your PR was out of date, I have automatically updated it for you.

At the same time I will also trigger all tests for you:

/run-all-tests

trigger some heavy tests which will not run always when PR updated.

If the CI test fails, you just re-trigger the test that failed and the bot will merge the PR for you after the CI passes.

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 ti-community-infra/tichi repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release-note-none Denotes a PR that doesn't merit a release note. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. status/can-merge Indicates a PR has been approved by a committer. status/LGT2 Indicates that a PR has LGTM 2.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Storage can not be removed after keyspace are deleted in TiKV
5 participants