-
Notifications
You must be signed in to change notification settings - Fork 2.1k
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
VSCopy: Enable to copy from all shards in either a specified keyspace or all keyspaces #11909
VSCopy: Enable to copy from all shards in either a specified keyspace or all keyspaces #11909
Conversation
…est doesn't include keyspace and shard Signed-off-by: yoheimuta <[email protected]>
…mpty gtid Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
…mCopyWithoutKeyspaceShard from failing when running tests together Signed-off-by: yoheimuta <[email protected]>
Review ChecklistHello reviewers! 👋 Please follow this checklist when reviewing this Pull Request. General
If a new flag is being introduced:
If a workflow is added or modified:
Bug fixes
Non-trivial changes
New/Existing features
Backward compatibility
|
if err != nil { | ||
return err | ||
} | ||
schemaDir = tempSchemaDir |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The main change in this file is the above lines.
The below is a trivial diff.
) | ||
|
||
func TestRowCount(t *testing.T) { | ||
ctx := context.Background() | ||
conn, err := mysql.Connect(ctx, &vtParams) | ||
require.NoError(t, err) | ||
defer conn.Close() | ||
utils.Exec(t, conn, "use ks") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This use statement is now necessary because the number of keyspace is multiple. 3afc402
@@ -55,6 +56,16 @@ func TestCreateAndDropDatabase(t *testing.T) { | |||
require.NoError(t, err) | |||
defer conn.Close() | |||
|
|||
// cleanup the keyspace from the topology. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A leaked "testitest" keyspace makes TestVStreamCopyWithoutKeyspaceShard/copy_from_all_keyspaces
fail.
Specifically, the VStreamer API itself fails with the below error.
E1207 19:46:02.204532 47701 tablet_picker.go:179] error getting shard testitest/0: node doesn't exist: keyspaces/testitest/shards/0/Shard
To fix it, 05e5ea0 adds a new cleanup function to delete the keyspace explicitly.
Signed-off-by: yoheimuta <[email protected]>
…cks either keyspace or shard Signed-off-by: yoheimuta <[email protected]>
Hi @yoheimuta, Thank you for another PR! I just wanted to note that before we merge this, we need to catch up on the vtgate VStream RPC docs: vitessio/website#1216 We can add info there about the new ability to copy not only individual tables, but all tables in a keyspace or all tables in all keyspaces. I'll link this PR to that docs PR for now. You should be able to push directly to that PR but if not let me know and I can get you setup with the website repo. We're not supposed to merge PRs w/o any accompanying docs but we did, and I don't want to fall further behind on that front. (There's another tangentially related PR here too: #11771) Thanks! |
Thank you for telling me! I'm checking out the docs PR. |
@mattlord I couldn't push directly to the PR.
|
go/vt/vtgate/vstream_manager.go
Outdated
// that has an empty keyspace. | ||
if len(vgtid.ShardGtids) == 1 && vgtid.ShardGtids[0].Keyspace == "" { | ||
if vgtid.ShardGtids[0].Gtid != "current" { | ||
return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "for an empty keyspace, the Gtid value must be 'current': %v", vgtid) | ||
} | ||
keyspaces, err := vsm.toposerv.GetSrvKeyspaceNames(ctx, vsm.cell, false) | ||
if err != nil { | ||
return nil, nil, nil, err |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would prefer the request be more explicit as it will likely generate A LOT of load and could have a big impact on production. I think it would also be nice if the keyspace wildcard selection lined up with the table wildcard selection in binlogdata.Filter.Rule.Match
, which is /.*
as a valid regular expression is accepted if the string has a /
prefix. So I think accepting valid regular expressions for the keyspace would be much nicer: /.*
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mattlord It makes sense in terms of the difference in impact between "streaming" and "copy."
Accepting the keyspace wildcard sounds useful. With this feature, we don't have to accept the request with an empty keyspace and empty gtid.
Do you think the following specifications are still required?
- A special request flag, for example, "EnableEmptyKeyspace" or "EnableWildcardKeyspace" in VStreamFlags.
- I think only the keyspace wildcard like
/.*
is enough.
- I think only the keyspace wildcard like
- The valid combination of an empty keyspace and "current" gtid.
- While the combination of an empty keyspace and the gtid other than "current" is invalid. It complicates the code, but not so much.
- Some may think it's better to stop accepting this input for the sake of simplicity at this moment.
As such, I plan to update accepting the keyspace wildcard and preserve the previous behavior as much as possible like the below table. What do you think?
gtid | keyspace | valid or invalid(=noop) |
---|---|---|
"" | "" | invalid because of no literal match. No change. |
"current" | "" | valid because of the compatibility. No change. |
"" | "/.*" | valid if found because of wildcard match. New behavior. |
"current" | "/.*" | valid if found because of wildcard match. New behavior. |
"" | "/ks.*/" | valid if found because of wildcard match. New behavior. |
"current" | "/ks.*/" | valid if found because of wildcard match. New behavior. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the explicit keyspace wildcard is enough and we don't need a new flag around that.
Now that I understand the usage of current
better, I think we have to keep it in place for compatibility sake. What do you think @rohit-nayak-ps ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @rohit-nayak-ps, I'd appreciate your feedback. Let me know if anything is missing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@yoheimuta, sorry for the delay. I am fine with the approach outlined above.
We should add a (or modify the existing) e2e test to confirm that resharding will continue to work if multiple keyspaces are being streamed. We have code (see the logic around journaler
in vstream_manager
), which waits for participating shards to converge, before automatically continuing to stream from the new shards. I think it should be fine, when there are multiple keyspaces, but confirming with a test will be useful.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your confirmation!
I'm looking into e2e test too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @yoheimuta, we will review it soon. Yes, that CI failure is also happening on other PRs and I have asked the related team to look at it.
ShardGtids: []*binlogdatapb.ShardGtid{{ | ||
Keyspace: "TestVStream", | ||
}}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These test additions are unrelated to this PR, or no? I would think we would test the new behavior, which would mean NOT specifying the shards and now not getting an error?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mattlord I thought they were related to this PR.
Technically, I didn't add new test cases (input & output). I changed the expected output in the following existing two cases:
- When the input is
ShardGtids: []*binlogdatapb.ShardGtid{{}},
- prev output: Returning an error
- new output: Returning all shards in all keyspaces without any errors.
- Moving the case code to the special-case tables because output is too big. https://github.com/vitessio/vitess/pull/11909/files#diff-3e2894943e5628aa7d63298e06c321fe82602d18693b2d5e99541fafd2c01395R1021
- When the input is
ShardGtids: []*binlogdatapb.ShardGtid{{Keyspace: "TestVStream"}},
- prev output: Returning an error
- new output: Returning all shards in the TestVStream keyspace without any errors.
- https://github.com/vitessio/vitess/pull/11909/files#diff-3e2894943e5628aa7d63298e06c321fe82602d18693b2d5e99541fafd2c01395R893
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here as well I think that comments noting what we're actually testing, how, and why are helpful. The future reader won't easily see comments here on the PR. And I know that the existing code is very poorly commented, but I want to do better moving forward. 🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added by 3b41d76.
…selection Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
…the streaming two keyspaces works even after reshard Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
…ier to read Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Signed-off-by: yoheimuta <[email protected]>
Instead, I first posted a question as a follow-up comment. |
The errors are due to a change in the signature of a test function, see: 8970182 You probably need to |
…yspace-shard Signed-off-by: yoheimuta <[email protected]>
…as introduced in the main repository Signed-off-by: yoheimuta <[email protected]>
@rohit-nayak-ps Thank you for your information! 256400f fixed the test signature. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, @yoheimuta ! ❤️ This is a nice usability improvement.
@yoheimuta if we merge in / rebase on main now, the tests should all be good. |
@mattlord Thank you for your review and helpful suggestions! I really appreciate it. |
…yspace-shard Signed-off-by: yoheimuta <[email protected]>
Thanks for the info! I have merged the main branch. |
@mattlord Is there anything missing to pass the test? |
And I'm thinking of preparing a PR for https://github.com/vitessio/website after it's been approved by two people. |
I don't think so. We just need @rohit-nayak-ps to take another look when he can (PRs need 2 approvals).
Those are unrelated. It's a known issue that we're discussing the proper/best solution to. Thanks! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm. Nice work!
… or all keyspaces (vitessio#11909) * VSCopy: Demonstrate to fail a test case on which the vstream API request doesn't include keyspace and shard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Copy from all shards in all keyspaces by specifying only an empty gtid Signed-off-by: yoheimuta <[email protected]> * tests: Make TestRowCount stable regardless of the number of keyspaces Signed-off-by: yoheimuta <[email protected]> * tests: Cleanup TestCreateAndDropDatabase correctly to stop TestVStreamCopyWithoutKeyspaceShard from failing when running tests together Signed-off-by: yoheimuta <[email protected]> * tests: Tweak to fix a comment Signed-off-by: yoheimuta <[email protected]> * VSCopy: fix the unit tests when the input vgtid with an empty gtid lacks either keyspace or shard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Keyspace wildcard selection lines up with the table wildcard selection Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tests the VCopy with multiple keyspaces and resharding Signed-off-by: yoheimuta <[email protected]> * VSCopy: Make TestVStreamCopyMultiKeyspaceReshard clearer to check if the streaming two keyspaces works even after reshard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Return an invalid argument error if shards are unspecified and gtid is neither 'current' nor empty Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a test description about its purpose and target Signed-off-by: yoheimuta <[email protected]> * VSCopy: Remove duplicate literals in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Retain defaultReplicas variable in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Explain why we are setting Match to 'customer.*' in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Remove an unused VStreamFlag for the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use sentence capitalization in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Verify that we didn't lose any events or get duplicates of the keyspace being reshareded in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Return a value instead of a pointer because there is no need to modify the value Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment describing what TestVStreamCopyFromAllKeyspacesAndAllShards is doing and why Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment describing why we expect these specific numbers of events from VStream API Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tweak the test case name Signed-off-by: yoheimuta <[email protected]> * VSCopy: Make a utility function to sort COPY_COMPLETED events in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Replace the matcher with a simpler one in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Move the print debug call to the FailNow section in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use require.NoError in new tests Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use require instead of t.Fatalf in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Apply the reviewer's suggestion to make the error message easier to read Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment noting what we're actually testing Signed-off-by: yoheimuta <[email protected]> * VSCopy: Correct the test comment and elaborate the special-case Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tweak an error message and a comment Signed-off-by: yoheimuta <[email protected]> * VSCopy: Adjust to a change in the signature of a test function that was introduced in the main repository Signed-off-by: yoheimuta <[email protected]> --------- Signed-off-by: yoheimuta <[email protected]>
* add vtgate flag that explicitly allows vstream copy (#125) * fix fs.BoolVar Signed-off-by: Tim Vaillancourt <[email protected]> * VSCopy: Resume the copy phase consistently from given GTID and lastpk (vitessio#11103) * VSCopy: Demonstrate to fail a test case on which the vstream API is supposed to resume the copy phase consistently Signed-off-by: yoheimuta <[email protected]> * VSCopy: Resume the copy phase consistently from given GTID and lastpk Signed-off-by: yoheimuta <[email protected]> * Build out the unit test some more Signed-off-by: Matt Lord <[email protected]> * Update tests for new behavior Signed-off-by: Matt Lord <[email protected]> * Improve comments Signed-off-by: Matt Lord <[email protected]> * Limit uvstreamer changes and update test Signed-off-by: Matt Lord <[email protected]> * Revert uvstreamer test changes Signed-off-by: Matt Lord <[email protected]> * Revert all uvstream changes Signed-off-by: Matt Lord <[email protected]> * VCopy: Revert the last three commits Signed-off-by: yoheimuta <[email protected]> * VCopy: Add a new vstream type that allows picking up where we left off Signed-off-by: yoheimuta <[email protected]> * VCopy: Revert the unit test change Signed-off-by: yoheimuta <[email protected]> * VCopy: Fix the end-to-end CI test Signed-off-by: yoheimuta <[email protected]> * Update logic for setting up uvstreamer based on input vgtid/tablepks. Add more catchup events to test Signed-off-by: Rohit Nayak <[email protected]> * Refactor logic to decide if event is to be sent. Enhance unit and e2e tests. Signed-off-by: Rohit Nayak <[email protected]> * Don't send events for tables which we can identify as ones we haven't started copy for Signed-off-by: Rohit Nayak <[email protected]> * Minor changes after self-review Signed-off-by: Rohit Nayak <[email protected]> * Add vstream copy resume to release notes Signed-off-by: Matt Lord <[email protected]> * Address review comments Signed-off-by: Matt Lord <[email protected]> Signed-off-by: yoheimuta <[email protected]> Signed-off-by: Matt Lord <[email protected]> Signed-off-by: Rohit Nayak <[email protected]> Co-authored-by: Matt Lord <[email protected]> Co-authored-by: Rohit Nayak <[email protected]> * VSCopy: Send COPY_COMPLETED events when the copy operation is done (vitessio#11740) * VSCopy: Demonstrate to fail a test case on which the vstream API sends new events showing copy completed Signed-off-by: yoheimuta <[email protected]> * VSCopy: Send new events when the copy operation is done Signed-off-by: yoheimuta <[email protected]> * VSCopy: Fix typo Signed-off-by: yoheimuta <[email protected]> * Initialize new map for the 'vstream * from' vtgate sql interface. Make vtadmin web protos Signed-off-by: Rohit Nayak <[email protected]> * VSCopy: Make TestVStreamCopyBasic fail fast to avoid the end2end timeout out Signed-off-by: yoheimuta <[email protected]> * VSCopy: stop sharing the 't1' table among multiple test cases running concurrently Signed-off-by: yoheimuta <[email protected]> * VSCopy: refactor the function signature to be clearer Signed-off-by: yoheimuta <[email protected]> * VSCopy: refactor the VEvents sorter to be simpler Signed-off-by: yoheimuta <[email protected]> * VSCopy: refactor to stop the sorter from including a fully copied event Signed-off-by: yoheimuta <[email protected]> Signed-off-by: yoheimuta <[email protected]> Signed-off-by: Rohit Nayak <[email protected]> Co-authored-by: Rohit Nayak <[email protected]> * VSCopy: Enable to copy from all shards in either a specified keyspace or all keyspaces (vitessio#11909) * VSCopy: Demonstrate to fail a test case on which the vstream API request doesn't include keyspace and shard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Copy from all shards in all keyspaces by specifying only an empty gtid Signed-off-by: yoheimuta <[email protected]> * tests: Make TestRowCount stable regardless of the number of keyspaces Signed-off-by: yoheimuta <[email protected]> * tests: Cleanup TestCreateAndDropDatabase correctly to stop TestVStreamCopyWithoutKeyspaceShard from failing when running tests together Signed-off-by: yoheimuta <[email protected]> * tests: Tweak to fix a comment Signed-off-by: yoheimuta <[email protected]> * VSCopy: fix the unit tests when the input vgtid with an empty gtid lacks either keyspace or shard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Keyspace wildcard selection lines up with the table wildcard selection Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tests the VCopy with multiple keyspaces and resharding Signed-off-by: yoheimuta <[email protected]> * VSCopy: Make TestVStreamCopyMultiKeyspaceReshard clearer to check if the streaming two keyspaces works even after reshard Signed-off-by: yoheimuta <[email protected]> * VSCopy: Return an invalid argument error if shards are unspecified and gtid is neither 'current' nor empty Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a test description about its purpose and target Signed-off-by: yoheimuta <[email protected]> * VSCopy: Remove duplicate literals in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Retain defaultReplicas variable in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Explain why we are setting Match to 'customer.*' in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Remove an unused VStreamFlag for the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use sentence capitalization in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Verify that we didn't lose any events or get duplicates of the keyspace being reshareded in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Return a value instead of a pointer because there is no need to modify the value Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment describing what TestVStreamCopyFromAllKeyspacesAndAllShards is doing and why Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment describing why we expect these specific numbers of events from VStream API Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tweak the test case name Signed-off-by: yoheimuta <[email protected]> * VSCopy: Make a utility function to sort COPY_COMPLETED events in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Replace the matcher with a simpler one in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Move the print debug call to the FailNow section in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use require.NoError in new tests Signed-off-by: yoheimuta <[email protected]> * VSCopy: Use require instead of t.Fatalf in the test Signed-off-by: yoheimuta <[email protected]> * VSCopy: Apply the reviewer's suggestion to make the error message easier to read Signed-off-by: yoheimuta <[email protected]> * VSCopy: Add a comment noting what we're actually testing Signed-off-by: yoheimuta <[email protected]> * VSCopy: Correct the test comment and elaborate the special-case Signed-off-by: yoheimuta <[email protected]> * VSCopy: Tweak an error message and a comment Signed-off-by: yoheimuta <[email protected]> * VSCopy: Adjust to a change in the signature of a test function that was introduced in the main repository Signed-off-by: yoheimuta <[email protected]> --------- Signed-off-by: yoheimuta <[email protected]> * attempt unit test fix Signed-off-by: Tim Vaillancourt <[email protected]> * update test error expected Signed-off-by: Tim Vaillancourt <[email protected]> --------- Signed-off-by: Tim Vaillancourt <[email protected]> Signed-off-by: yoheimuta <[email protected]> Signed-off-by: Matt Lord <[email protected]> Signed-off-by: Rohit Nayak <[email protected]> Co-authored-by: pbibra <[email protected]> Co-authored-by: yohei yoshimuta <[email protected]> Co-authored-by: Matt Lord <[email protected]> Co-authored-by: Rohit Nayak <[email protected]>
Description
This PR removes the two checks by which VTGate refuses a copy request lacking either shard or keyspace.
Let's say you have two keyspaces named
ks
andks2,
and each keyspace includes two shards called-80
and80-.
Here's the table of the input and expected output:
ks.-80
,ks.80-
,ks2.-80
,ks2.80-
ks.-80
,ks.80-
Related Issue(s)
Fixes #11886
Checklist
Deployment Notes