-
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
Add linearizable support to SQL VSchema management #17401
base: main
Are you sure you want to change the base?
Conversation
Review ChecklistHello reviewers! 👋 Please follow this checklist when reviewing this Pull Request. General
Tests
Documentation
New flags
If a workflow is added or modified:
Backward compatibility
|
4b4578d
to
be1ccd1
Compare
Signed-off-by: Matt Lord <[email protected]>
be1ccd1
to
b2e2ba6
Compare
Signed-off-by: Matt Lord <[email protected]>
e9319d3
to
1ccc129
Compare
Signed-off-by: Matt Lord <[email protected]>
1ccc129
to
e02adaf
Compare
Signed-off-by: Matt Lord <[email protected]>
Signed-off-by: Matt Lord <[email protected]>
Signed-off-by: Matt Lord <[email protected]>
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #17401 +/- ##
==========================================
- Coverage 67.71% 67.70% -0.02%
==========================================
Files 1584 1584
Lines 254721 254799 +78
==========================================
+ Hits 172473 172499 +26
- Misses 82248 82300 +52 ☔ View full report in Codecov by Sentry. |
This reverts commit cd455a0. Signed-off-by: Matt Lord <[email protected]>
Signed-off-by: Matt Lord <[email protected]>
Signed-off-by: Matt Lord <[email protected]>
e1122ea
to
1e3a496
Compare
Signed-off-by: Matt Lord <[email protected]>
1e3a496
to
f5c6c63
Compare
Signed-off-by: Matt Lord <[email protected]>
Signed-off-by: Matt Lord <[email protected]>
return err | ||
} | ||
} else { | ||
// Use the cached version as we are in read-only mode |
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.
When do we get to this code path? Later on we are calling vc.vm.UpdateVSchema()
which is expected to write back to the topo, correct? Should we just return an error here, if it is going to fail anyway later on?
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.
When the topo connection is read-only, which would be e.g. when using --keyspaces_to_watch
(see #8988). In that case it's fine to use the cached version because we know that the subsequent ApplyVSchemaDDL()
call will fail. I could return an error here rather than make the Apply call. I left it this way to leave the flow (and unit test) unchanged.
I agree that it's a little awkward, so I'm happy to instead return an error about the topo being in read-only mode when vc.topoServer == nil
if others prefer that.
This is the current error that users see:
go/test/endtoend/vtgate/keyspace_watches/keyspace_watch_test.go: vschemaDDLError = fmt.Sprintf("Error 1105 (HY000): cannot perform Update on keyspaces/%s/VSchema as the topology server connection is read-only",
I'll see if I can maintain that with an earlier failure here.
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.
@harshit-gangal what do you think? I'll hold off until you have a chance to review. Perhaps the error here doesn't really matter much and I can instead just return:
cannot update the VSchema as the topology server connection is read-only
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.
One change needs to be made, but otherwise looks good to me. Approving so that PR can be merged after the change has been made. ❤️
// keyspace's vschema. | ||
type KeyspaceVSchemaInfo struct { | ||
Name string | ||
*vschemapb.Keyspace | ||
version Version | ||
} |
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 struct is a duplicate of an existing one in this same package. There exists KeyspaceInfo
in keyspace.go. The struct definition is as follows -
// KeyspaceInfo is a meta struct that contains metadata to give the
// data more context and convenience. This is the main way we interact
// with a keyspace.
type KeyspaceInfo struct {
keyspace string
version Version
*topodatapb.Keyspace
}
It pretty much has the same information just with a different nomenclature. I think we should remove this and use that struct directly or vice versa.
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.
KeyspaceInfo
is for the topo Keyspace record:
Lines 259 to 301 in eaaa206
// A Keyspace contains data about a keyspace. | |
message Keyspace { | |
// OBSOLETE string sharding_column_name = 1; | |
reserved 1; | |
// OBSOLETE KeyspaceIdType sharding_column_type = 2; | |
reserved 2; | |
// OBSOLETE int32 split_shard_count = 3; | |
reserved 3; | |
// OBSOLETE ServedFrom served_froms = 4; | |
reserved 4; | |
// keyspace_type will determine how this keyspace is treated by | |
// vtgate / vschema. Normal keyspaces are routable by | |
// any query. Snapshot keyspaces are only accessible | |
// by explicit addresssing or by calling "use keyspace" first | |
KeyspaceType keyspace_type = 5; | |
// base_keyspace is the base keyspace from which a snapshot | |
// keyspace is created. empty for normal keyspaces | |
string base_keyspace = 6; | |
// snapshot_time (in UTC) is a property of snapshot | |
// keyspaces which tells us what point in time | |
// the snapshot is of | |
vttime.Time snapshot_time = 7; | |
// DurabilityPolicy is the durability policy to be | |
// used for the keyspace. | |
string durability_policy = 8; | |
// ThrottlerConfig has the configuration for the tablet | |
// server's lag throttler, and applies to the entire | |
// keyspace, across all shards and tablets. | |
ThrottlerConfig throttler_config = 9; | |
// SidecarDBName is the name of the Vitess sidecar database | |
// used for various system metadata that is stored in each | |
// tablet's mysqld instance. | |
string sidecar_db_name = 10; | |
} |
KeyspaceVSchemaInfo
is for the keyspace's vschema:
Lines 40 to 60 in eaaa206
// Keyspace is the vschema for a keyspace. | |
message Keyspace { | |
// If sharded is false, vindexes and tables are ignored. | |
bool sharded = 1; | |
map<string, Vindex> vindexes = 2; | |
map<string, Table> tables = 3; | |
// If require_explicit_routing is true, vindexes and tables are not added to global routing | |
bool require_explicit_routing = 4; | |
// foreign_key_mode dictates how Vitess should handle foreign keys for this keyspace. | |
ForeignKeyMode foreign_key_mode = 5; | |
enum ForeignKeyMode { | |
unspecified = 0; | |
disallow = 1; | |
unmanaged = 2; | |
managed = 3; | |
} | |
// multi_tenant_mode specifies that the keyspace is multi-tenant. Currently used during migrations with MoveTables. | |
MultiTenantSpec multi_tenant_spec = 6; | |
} |
Definitely not the same thing 🙂
|
||
// TestVSchemaSQLAPIConcurrency tests that we prevent lost writes when we have | ||
// concurrent vschema changes being made via the SQL API. | ||
func TestVSchemaSQLAPIConcurrency(t *testing.T) { |
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.
Good test 😍
Description
This PR prevents lost writes when using the VTGate SQL API for VSchema management (see issue).
It also lays the foundation for supporting linearizability guarantees for vschemas within Vitess. Please see the tracking issue for the other known pieces.
Related Issue(s)
Checklist