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

OnlineDDL: 'mysql' strategy, managed by the scheduler, but executed via normal MySQL statements #12027

Merged
merged 5 commits into from
Jan 13, 2023

Conversation

shlomi-noach
Copy link
Contributor

@shlomi-noach shlomi-noach commented Jan 2, 2023

Description

This PR introduces a new DDL strategy: mysql. This strategy is a hybrid between direct (which is completely non-Online) and the various online strategies.

A migration submitted with mysql strategy is managed. That is, it gets a migration UUID. The scheduler queues it, reviews it, runs it. The user may cancel or retry it, much like all Online DDL migrations. The difference is that when the scheduler runs the migration via normal MySQL CREATE/ALTER/DROP TABLE statements.

The user may add ALGORITHM=INPLACE or ALGORITHM=INSTANT as they please, and the scheduler will attempt to run those as is. Some migrations will be completely blocking. See the MySQL documentation. In particular, consider that for non-INSTANT DDLs, replicas will accumulate substantial lag.

This was requested and discussed by @derekperkins in a recent Vitess Open Hour call.

Related Issue(s)

Tracking: #6926

Checklist

  • "Backport to:" labels have been added if this change should be back-ported
  • Tests were added or are not required
  • Documentation was added or is not required

Deployment Notes

…ia normal MySQL 'ALTER TABLE'

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
@shlomi-noach shlomi-noach added Type: Enhancement Logical improvement (somewhere between a bug and feature) Component: Query Serving labels Jan 2, 2023
@vitess-bot
Copy link
Contributor

vitess-bot bot commented Jan 2, 2023

Review Checklist

Hello reviewers! 👋 Please follow this checklist when reviewing this Pull Request.

General

  • Ensure that the Pull Request has a descriptive title.
  • If this is a change that users need to know about, please apply the release notes (needs details) label so that merging is blocked unless the summary release notes document is included.
  • If a test is added or modified, there should be a documentation on top of the test to explain what the expected behavior is what the test does.

If a new flag is being introduced:

  • Is it really necessary to add this flag?
  • Flag names should be clear and intuitive (as far as possible)
  • Help text should be descriptive.
  • Flag names should use dashes (-) as word separators rather than underscores (_).

If a workflow is added or modified:

  • Each item in Jobs should be named in order to mark it as required.
  • If the workflow should be required, the maintainer team should be notified.

Bug fixes

  • There should be at least one unit or end-to-end test.
  • The Pull Request description should include a link to an issue that describes the bug.

Non-trivial changes

  • There should be some code comments as to why things are implemented the way they are.

New/Existing features

  • Should be documented, either by modifying the existing documentation or creating new documentation.
  • New features should have a link to a feature request issue or an RFC that documents the use cases, corner cases and test cases.

Backward compatibility

  • Protobuf changes should be wire-compatible.
  • Changes to _vt tables and RPCs need to be backward compatible.
  • vtctl command output order should be stable and awk-able.
  • RPC changes should be compatible with vitess-operator
  • If a flag is removed, then it should also be removed from VTop, if used there.

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
t.Run("declarative", func(t *testing.T) {
t1uuid = testOnlineDDLStatement(t, createT1Statement, "mysql --declarative", "vtgate", "just-created", "", false)

status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed)
Copy link
Contributor

Choose a reason for hiding this comment

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

Curious why we specify multiple statuses in WaitForMigrationStatus but then only a single one in CheckMigrationStatus?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The reason is that we wait till either status is seen (the function will otherwise give some 30sec for the migration to "evolve"). So there are terminal states for the function, so that it does not need to wait after meeting these states. This just reduces test time. Then, we really want to validate that we reached a particular result: typically we look for a success, ie OnlineDDLStatusComplete. But sometimes we intentionally seek a failure.

Copy link
Member

@derekperkins derekperkins left a comment

Choose a reason for hiding this comment

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

This is awesome, thanks for pushing this through!

@deepthi deepthi added the NeedsWebsiteDocsUpdate What it says label Jan 9, 2023
Copy link
Member

@deepthi deepthi left a comment

Choose a reason for hiding this comment

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

This is great. I like how you keep improving online DDL to take advantage of upstream MySQL improvements.
I think this is significant enough to either warrant a new issue altogether, or at least a specific comment in the tracking issue as to why we want to introduce this option. Currently there's nothing in the tracking issue that tells us anything about why this PR is being proposed.
Also website docs 😄

@shlomi-noach
Copy link
Contributor Author

This is great. I like how you keep improving online DDL to take advantage of upstream MySQL improvements.
I think this is significant enough to either warrant a new issue altogether, or at least a specific comment in the tracking issue as to why we want to introduce this option. Currently there's nothing in the tracking issue that tells us anything about why this PR is being proposed.

👍

Also website docs smile

👍

Let me first create all the necessary docs before we merge this PR

@shlomi-noach
Copy link
Contributor Author

Website docs: vitessio/website#1342

@shlomi-noach
Copy link
Contributor Author

Fixes #12075

I've put #12075 up to explain why we're doing this.

@shlomi-noach shlomi-noach removed the NeedsWebsiteDocsUpdate What it says label Jan 11, 2023
@shlomi-noach
Copy link
Contributor Author

@deepthi for final approval + merge, as there's now a tracking issue as well as website docs

@deepthi deepthi merged commit 836b3c1 into vitessio:main Jan 13, 2023
@deepthi deepthi deleted the onlineddl-mysql-strategy branch January 13, 2023 00:20
@mattlord mattlord mentioned this pull request Jan 13, 2023
3 tasks
dbussink pushed a commit that referenced this pull request Jan 30, 2023
…er, but executed via normal MySQL statements (#1499)

* OnlineDDL: 'mysql' strategy, managed by the scheduler, but executed via normal MySQL statements (#12027)

* OnlineDDL: 'mysql' strategy: managed by the scheduler, but executed via normal MySQL 'ALTER TABLE'

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

* use 'mysql' strategy

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

* fail mysql strategy on incompatible strategy flags

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

* endtoend tests

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

* release notes

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>

* Fix bad merge. (#12087)

GitHub did not seem to pick up the merge conflict between
these two commits (older to newer):
  - 673573a
  - 836b3c1

The first commit changed the function signature for
testOnlineDDLStatement(), while the later commit
used the old signature.

Signed-off-by: Matt Lord <mattalord@gmail.com>

Signed-off-by: Matt Lord <mattalord@gmail.com>

Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com>
Signed-off-by: Matt Lord <mattalord@gmail.com>
Co-authored-by: Matt Lord <mattalord@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Component: Query Serving Type: Enhancement Logical improvement (somewhere between a bug and feature)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants