schemamanager: Change PreflightSchemaChange to accept a list of changes instead of a single change.

This makes it easier to test multiple changes which depend on each other e.g. a CREATE TABLE after a DROP TABLE if the table already exists.

Fixes issue https://github.com/youtube/vitess/issues/1731#issuecomment-222914389.
This commit is contained in:
Michael Berlin 2016-06-01 03:24:08 -07:00
Родитель 29453c3eff
Коммит 4e1a52b50d
17 изменённых файлов: 376 добавлений и 340 удалений

Просмотреть файл

@ -715,16 +715,16 @@ func (itmc *internalTabletManagerClient) ReloadSchema(ctx context.Context, table
})
}
func (itmc *internalTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, change string) (*tmutils.SchemaChangeResult, error) {
func (itmc *internalTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tmutils.SchemaChangeResult, error) {
t, ok := tabletMap[tablet.Alias.Uid]
if !ok {
return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid)
}
var result *tmutils.SchemaChangeResult
var result []*tmutils.SchemaChangeResult
if err := t.agent.RPCWrapLockAction(ctx, tabletmanager.TabletActionPreflightSchema, nil, nil, true, func() error {
scr, err := t.agent.PreflightSchema(ctx, change)
diffs, err := t.agent.PreflightSchema(ctx, changes)
if err == nil {
result = scr
result = diffs
}
return err
}); err != nil {

Просмотреть файл

@ -65,7 +65,7 @@ type MysqlDaemon interface {
// Schema related methods
GetSchema(dbName string, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error)
PreflightSchemaChange(dbName string, change string) (*tmutils.SchemaChangeResult, error)
PreflightSchemaChange(dbName string, changes []string) ([]*tmutils.SchemaChangeResult, error)
ApplySchemaChange(dbName string, change *tmutils.SchemaChange) (*tmutils.SchemaChangeResult, error)
// GetAppConnection returns a app connection to be able to talk to the database.
@ -176,7 +176,7 @@ type FakeMysqlDaemon struct {
// PreflightSchemaChangeResult will be returned by PreflightSchemaChange.
// If nil we'll return an error.
PreflightSchemaChangeResult *tmutils.SchemaChangeResult
PreflightSchemaChangeResult []*tmutils.SchemaChangeResult
// ApplySchemaChangeResult will be returned by ApplySchemaChange.
// If nil we'll return an error.
@ -435,7 +435,7 @@ func (fmd *FakeMysqlDaemon) GetSchema(dbName string, tables, excludeTables []str
}
// PreflightSchemaChange is part of the MysqlDaemon interface
func (fmd *FakeMysqlDaemon) PreflightSchemaChange(dbName string, change string) (*tmutils.SchemaChangeResult, error) {
func (fmd *FakeMysqlDaemon) PreflightSchemaChange(dbName string, changes []string) ([]*tmutils.SchemaChangeResult, error) {
if fmd.PreflightSchemaChangeResult == nil {
return nil, fmt.Errorf("no preflight result defined")
}

Просмотреть файл

@ -198,60 +198,71 @@ func (mysqld *Mysqld) GetPrimaryKeyColumns(dbName, table string) ([]string, erro
return columns, err
}
// PreflightSchemaChange will apply the schema change to a fake
// database that has the same schema as the target database, see if it
// works.
func (mysqld *Mysqld) PreflightSchemaChange(dbName string, change string) (*tmutils.SchemaChangeResult, error) {
// gather current schema on real database
beforeSchema, err := mysqld.GetSchema(dbName, nil, nil, true)
// PreflightSchemaChange checks the schema changes in "changes" by applying them
// to an intermediate database that has the same schema as the target database.
func (mysqld *Mysqld) PreflightSchemaChange(dbName string, changes []string) ([]*tmutils.SchemaChangeResult, error) {
diffs := make([]*tmutils.SchemaChangeResult, len(changes))
// Get current schema from the real database.
originalSchema, err := mysqld.GetSchema(dbName, nil, nil, true)
if err != nil {
return nil, err
}
// populate temporary database with it
sql := "SET sql_log_bin = 0;\n"
sql += "DROP DATABASE IF EXISTS _vt_preflight;\n"
sql += "CREATE DATABASE _vt_preflight;\n"
sql += "USE _vt_preflight;\n"
for _, td := range beforeSchema.TableDefinitions {
// Populate temporary database with it.
initialCopySQL := "SET sql_log_bin = 0;\n"
initialCopySQL += "DROP DATABASE IF EXISTS _vt_preflight;\n"
initialCopySQL += "CREATE DATABASE _vt_preflight;\n"
initialCopySQL += "USE _vt_preflight;\n"
for _, td := range originalSchema.TableDefinitions {
if td.Type == tmutils.TableBaseTable {
sql += td.Schema + ";\n"
initialCopySQL += td.Schema + ";\n"
}
}
for _, td := range beforeSchema.TableDefinitions {
for _, td := range originalSchema.TableDefinitions {
if td.Type == tmutils.TableView {
// Views will have {{.DatabaseName}} in there, replace
// it with _vt_preflight
s := strings.Replace(td.Schema, "`{{.DatabaseName}}`", "`_vt_preflight`", -1)
sql += s + ";\n"
initialCopySQL += s + ";\n"
}
}
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, sql); err != nil {
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, initialCopySQL); err != nil {
return nil, err
}
// apply schema change to the temporary database
sql = "SET sql_log_bin = 0;\n"
sql += "USE _vt_preflight;\n"
sql += change
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, sql); err != nil {
return nil, err
}
// For each change, record the schema before and after.
for i, change := range changes {
beforeSchema, err := mysqld.GetSchema("_vt_preflight", nil, nil, true)
if err != nil {
return nil, err
}
// get the result
afterSchema, err := mysqld.GetSchema("_vt_preflight", nil, nil, true)
if err != nil {
return nil, err
// apply schema change to the temporary database
sql := "SET sql_log_bin = 0;\n"
sql += "USE _vt_preflight;\n"
sql += change
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, sql); err != nil {
return nil, err
}
// get the result
afterSchema, err := mysqld.GetSchema("_vt_preflight", nil, nil, true)
if err != nil {
return nil, err
}
diffs[i] = &tmutils.SchemaChangeResult{BeforeSchema: beforeSchema, AfterSchema: afterSchema}
}
// and clean up the extra database
sql = "SET sql_log_bin = 0;\n"
sql += "DROP DATABASE _vt_preflight;\n"
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, sql); err != nil {
dropSQL := "SET sql_log_bin = 0;\n"
dropSQL += "DROP DATABASE _vt_preflight;\n"
if err = mysqld.executeMysqlCommands(mysqld.dba.Uname, dropSQL); err != nil {
return nil, err
}
return &tmutils.SchemaChangeResult{BeforeSchema: beforeSchema, AfterSchema: afterSchema}, nil
return diffs, nil
}
// ApplySchemaChange will apply the schema change to the given database.

Просмотреть файл

@ -466,7 +466,7 @@ func (*ReloadSchemaResponse) ProtoMessage() {}
func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
type PreflightSchemaRequest struct {
Change string `protobuf:"bytes,1,opt,name=change" json:"change,omitempty"`
Changes []string `protobuf:"bytes,1,rep,name=changes" json:"changes,omitempty"`
}
func (m *PreflightSchemaRequest) Reset() { *m = PreflightSchemaRequest{} }
@ -475,8 +475,12 @@ func (*PreflightSchemaRequest) ProtoMessage() {}
func (*PreflightSchemaRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
type PreflightSchemaResponse struct {
BeforeSchema *SchemaDefinition `protobuf:"bytes,1,opt,name=before_schema,json=beforeSchema" json:"before_schema,omitempty"`
AfterSchema *SchemaDefinition `protobuf:"bytes,2,opt,name=after_schema,json=afterSchema" json:"after_schema,omitempty"`
// before_schemas holds the schema before each change.
// The number of elements is identical to the length of "changes" in the request.
BeforeSchemas []*SchemaDefinition `protobuf:"bytes,1,rep,name=before_schemas,json=beforeSchemas" json:"before_schemas,omitempty"`
// after_schemas holds the schema after each change.
// The number of elements is identical to the length of "changes" in the request.
AfterSchemas []*SchemaDefinition `protobuf:"bytes,2,rep,name=after_schemas,json=afterSchemas" json:"after_schemas,omitempty"`
}
func (m *PreflightSchemaResponse) Reset() { *m = PreflightSchemaResponse{} }
@ -484,16 +488,16 @@ func (m *PreflightSchemaResponse) String() string { return proto.Comp
func (*PreflightSchemaResponse) ProtoMessage() {}
func (*PreflightSchemaResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (m *PreflightSchemaResponse) GetBeforeSchema() *SchemaDefinition {
func (m *PreflightSchemaResponse) GetBeforeSchemas() []*SchemaDefinition {
if m != nil {
return m.BeforeSchema
return m.BeforeSchemas
}
return nil
}
func (m *PreflightSchemaResponse) GetAfterSchema() *SchemaDefinition {
func (m *PreflightSchemaResponse) GetAfterSchemas() []*SchemaDefinition {
if m != nil {
return m.AfterSchema
return m.AfterSchemas
}
return nil
}
@ -1200,127 +1204,129 @@ func init() {
}
var fileDescriptor0 = []byte{
// 1945 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x6f, 0x1b, 0xc7,
0x15, 0x07, 0x25, 0x59, 0x96, 0xdf, 0x92, 0x14, 0xb9, 0x92, 0x25, 0x5a, 0x01, 0x6c, 0x79, 0x9d,
0x36, 0xae, 0x8b, 0x2a, 0xb1, 0x92, 0x16, 0x41, 0x83, 0x14, 0x95, 0x25, 0x39, 0x76, 0xfe, 0x59,
0x59, 0xff, 0x2b, 0x7a, 0x59, 0x0c, 0xb9, 0x23, 0x71, 0xe1, 0xe5, 0xee, 0x66, 0x77, 0x96, 0x16,
0x81, 0xa2, 0xdf, 0xa2, 0xb7, 0xde, 0x0a, 0xb4, 0x87, 0xde, 0xfa, 0x61, 0x5a, 0xf4, 0x93, 0xf4,
0xd0, 0x4b, 0xdf, 0xcc, 0xbc, 0x21, 0x67, 0x49, 0xca, 0xa2, 0x8d, 0x14, 0xc8, 0x85, 0x98, 0xf9,
0xbd, 0x37, 0xef, 0xff, 0xbc, 0x79, 0x4b, 0xd8, 0x16, 0xac, 0x1b, 0x73, 0x31, 0x60, 0x09, 0x3b,
0xe3, 0x79, 0xc8, 0x04, 0xdb, 0xcb, 0xf2, 0x54, 0xa4, 0x6e, 0x7b, 0x86, 0xb0, 0xe3, 0x7c, 0x5f,
0xf2, 0x7c, 0xa4, 0xe9, 0x3b, 0x4d, 0x91, 0x66, 0xe9, 0x84, 0x7f, 0xe7, 0x7a, 0xce, 0xb3, 0x38,
0xea, 0x31, 0x11, 0xa5, 0x89, 0x05, 0x37, 0xe2, 0xf4, 0xac, 0x14, 0x51, 0xac, 0xb7, 0xde, 0xbf,
0x6b, 0xb0, 0xfe, 0x4c, 0x0a, 0x3e, 0xe2, 0xa7, 0x51, 0x12, 0x49, 0x66, 0xd7, 0x85, 0x95, 0x84,
0x0d, 0x78, 0xa7, 0xb6, 0x5b, 0xbb, 0x7b, 0xcd, 0x57, 0x6b, 0x77, 0x0b, 0x56, 0x8b, 0x5e, 0x9f,
0x0f, 0x58, 0x67, 0x49, 0xa1, 0xb4, 0x73, 0x3b, 0x70, 0xb5, 0x97, 0xc6, 0xe5, 0x20, 0x29, 0x3a,
0xcb, 0xbb, 0xcb, 0x48, 0x30, 0x5b, 0x77, 0x0f, 0x36, 0xb2, 0x3c, 0x1a, 0xb0, 0x7c, 0x14, 0xbc,
0xe2, 0xa3, 0xc0, 0x70, 0xad, 0x28, 0xae, 0x36, 0x91, 0xbe, 0xe2, 0xa3, 0x43, 0xe2, 0x47, 0xad,
0x62, 0x94, 0xf1, 0xce, 0x15, 0xad, 0x55, 0xae, 0xdd, 0x5b, 0xe0, 0x48, 0xd3, 0x83, 0x98, 0x27,
0x67, 0xa2, 0xdf, 0x59, 0x45, 0xd2, 0x8a, 0x0f, 0x12, 0xfa, 0x5a, 0x21, 0xee, 0x7b, 0x70, 0x2d,
0x4f, 0x5f, 0xa3, 0xf0, 0x32, 0x11, 0x9d, 0xab, 0x8a, 0xbc, 0x86, 0xc0, 0xa1, 0xdc, 0x7b, 0x7f,
0xad, 0x41, 0xeb, 0xa9, 0x32, 0xd3, 0x72, 0xee, 0x03, 0x58, 0x97, 0xe7, 0xbb, 0xac, 0xe0, 0x01,
0x79, 0xa4, 0xfd, 0x6c, 0x1a, 0x58, 0x1f, 0x71, 0x9f, 0x80, 0x8e, 0x78, 0x10, 0x8e, 0x0f, 0x17,
0xe8, 0xfc, 0xf2, 0x5d, 0x67, 0xdf, 0xdb, 0x9b, 0x4d, 0xd2, 0x54, 0x10, 0xfd, 0x96, 0xa8, 0x02,
0x85, 0x0c, 0xd5, 0x90, 0xe7, 0x05, 0xae, 0x31, 0x54, 0x52, 0xa3, 0xd9, 0x7a, 0xff, 0xa9, 0x41,
0xf3, 0x79, 0xc1, 0xf3, 0x13, 0x9e, 0x0f, 0xa2, 0xa2, 0xa0, 0x1c, 0xf4, 0xd3, 0x42, 0x98, 0x1c,
0xc8, 0xb5, 0xc4, 0x4a, 0xe4, 0xa2, 0x0c, 0xa8, 0xb5, 0xfb, 0x73, 0x68, 0x67, 0xac, 0x28, 0x5e,
0xa7, 0x79, 0x18, 0xa0, 0xdd, 0xbd, 0x57, 0x45, 0x39, 0x50, 0xe2, 0x57, 0xfc, 0x96, 0x21, 0x1c,
0x12, 0xee, 0x7e, 0x07, 0x80, 0x71, 0x1f, 0x46, 0x31, 0x3f, 0xe3, 0x3a, 0x13, 0xce, 0xfe, 0xfd,
0x39, 0xbe, 0x54, 0x6d, 0xd9, 0x3b, 0x19, 0x9f, 0x39, 0x4e, 0x44, 0x3e, 0xf2, 0x2d, 0x21, 0x3b,
0x9f, 0xc3, 0xfa, 0x14, 0xd9, 0x6d, 0xc1, 0x32, 0x26, 0x9c, 0x2c, 0x97, 0x4b, 0x77, 0x13, 0xae,
0x0c, 0x59, 0x5c, 0x72, 0xb2, 0x5c, 0x6f, 0x7e, 0xbd, 0xf4, 0x69, 0xcd, 0xfb, 0x67, 0x0d, 0xea,
0x47, 0xdd, 0x4b, 0xfc, 0x6e, 0xc2, 0x52, 0xd8, 0xa5, 0xb3, 0xb8, 0x1a, 0xc7, 0x61, 0xd9, 0x8a,
0xc3, 0x93, 0x39, 0xae, 0x7d, 0x38, 0xc7, 0x35, 0x5b, 0xd9, 0xff, 0xd3, 0xb1, 0xbf, 0xd4, 0xc0,
0x99, 0x68, 0x2a, 0xdc, 0xaf, 0xa1, 0x25, 0xed, 0x0c, 0xb2, 0x09, 0x86, 0x82, 0xa4, 0x95, 0xb7,
0x2f, 0x4d, 0x80, 0xbf, 0x5e, 0x56, 0xf6, 0x85, 0xfb, 0x10, 0x9a, 0x61, 0xb7, 0x22, 0x4b, 0x17,
0xe6, 0xad, 0x4b, 0x3c, 0xf6, 0x1b, 0xa1, 0xb5, 0x2b, 0xbc, 0xcf, 0xc0, 0x79, 0x10, 0x67, 0x27,
0x69, 0xa1, 0xef, 0x06, 0x3a, 0x58, 0x46, 0xa1, 0x72, 0xb0, 0xe1, 0xcb, 0xa5, 0xbb, 0x03, 0x6b,
0x19, 0x51, 0xc9, 0xc7, 0xf1, 0xde, 0xfb, 0x00, 0x3d, 0x8c, 0x92, 0x33, 0x9f, 0x63, 0x17, 0xc2,
0x2c, 0x61, 0x79, 0x67, 0x6c, 0x14, 0xa7, 0x2c, 0xa4, 0x08, 0x99, 0xad, 0x77, 0x17, 0xea, 0x9a,
0xb1, 0xc8, 0x50, 0x29, 0x7f, 0x03, 0xe7, 0x3d, 0xa8, 0x3f, 0x8d, 0x39, 0xcf, 0x8c, 0x4c, 0x54,
0x1f, 0x96, 0xb9, 0x6a, 0x61, 0x8a, 0x75, 0xd9, 0x1f, 0xef, 0xbd, 0x75, 0x68, 0x10, 0xaf, 0x16,
0xeb, 0xfd, 0xab, 0x06, 0xee, 0xf1, 0x39, 0xef, 0x95, 0x82, 0x3f, 0x4a, 0xd3, 0x57, 0x46, 0xc6,
0xbc, 0x6e, 0x76, 0x13, 0xab, 0x85, 0xe5, 0xb8, 0x12, 0x78, 0x03, 0x55, 0xec, 0xae, 0xf9, 0x16,
0xe2, 0x9e, 0xc0, 0x35, 0x7e, 0x2e, 0x72, 0x16, 0xf0, 0x64, 0xa8, 0xfa, 0x9a, 0xb3, 0xff, 0xf1,
0x9c, 0xd0, 0xce, 0x6a, 0x43, 0x08, 0x8f, 0x1d, 0x27, 0x43, 0x5d, 0x50, 0x6b, 0x9c, 0xb6, 0x3b,
0x9f, 0x41, 0xa3, 0x42, 0x7a, 0xab, 0x62, 0x3a, 0x85, 0x8d, 0x8a, 0x2a, 0x8a, 0x23, 0x76, 0x47,
0x7e, 0x1e, 0x89, 0xa0, 0x10, 0x4c, 0x94, 0x05, 0x05, 0x08, 0x24, 0xf4, 0x54, 0x21, 0xaa, 0x69,
0x8b, 0x30, 0x2d, 0xc5, 0xb8, 0x69, 0xab, 0x1d, 0xe1, 0x3c, 0x37, 0x57, 0x88, 0x76, 0xde, 0x10,
0x5a, 0x5f, 0x70, 0xa1, 0xfb, 0x9f, 0x09, 0x1f, 0xf2, 0x2a, 0xc7, 0x75, 0xb9, 0x22, 0xaf, 0xde,
0xb9, 0x77, 0xa0, 0x11, 0x25, 0xbd, 0xb8, 0x0c, 0x79, 0x30, 0x8c, 0xf8, 0xeb, 0x42, 0xa9, 0x58,
0xf3, 0xeb, 0x04, 0xbe, 0x90, 0x98, 0xfb, 0x13, 0x68, 0xf2, 0x73, 0xcd, 0x44, 0x42, 0xf4, 0x23,
0xd1, 0x20, 0x54, 0x35, 0xcd, 0xc2, 0xe3, 0xd0, 0xb6, 0xf4, 0x92, 0x77, 0x27, 0xd0, 0xd6, 0xfd,
0xd9, 0x6a, 0xc0, 0xca, 0x47, 0x67, 0xff, 0xce, 0x9c, 0x5c, 0x4c, 0x37, 0x7a, 0xbf, 0x55, 0x4c,
0x21, 0xde, 0x36, 0x5c, 0x47, 0x35, 0x56, 0xfd, 0x93, 0x8f, 0xde, 0xef, 0x61, 0x6b, 0x9a, 0x40,
0x46, 0xfc, 0x16, 0x9c, 0xea, 0x8d, 0x95, 0xea, 0x6f, 0xce, 0x51, 0x6f, 0x1f, 0xb6, 0x8f, 0x78,
0x9b, 0xe0, 0x3e, 0xe5, 0xc2, 0xe7, 0x2c, 0x7c, 0x92, 0xc4, 0x23, 0xa3, 0xf1, 0x3a, 0x6c, 0x54,
0x50, 0x2a, 0xe1, 0x09, 0xfc, 0x32, 0x8f, 0x04, 0x37, 0xdc, 0x5b, 0xb0, 0x59, 0x85, 0x89, 0xfd,
0x4b, 0x68, 0x1f, 0xf6, 0x59, 0x72, 0xc6, 0x9f, 0xe1, 0x63, 0x69, 0x12, 0xf6, 0x4b, 0x70, 0xb4,
0x79, 0x81, 0x7a, 0x4e, 0xa5, 0xc9, 0xcd, 0xfd, 0xcd, 0xbd, 0xf1, 0x74, 0xa0, 0x62, 0x2e, 0xd4,
0x09, 0x10, 0xe3, 0xb5, 0xb4, 0xd3, 0x96, 0x35, 0x31, 0xc8, 0xe7, 0xa7, 0x39, 0x2f, 0xfa, 0xb2,
0xa4, 0x6c, 0x83, 0xaa, 0x30, 0xb1, 0x63, 0x84, 0xfd, 0x32, 0x79, 0xc4, 0x59, 0x2c, 0xfa, 0xea,
0xd5, 0x31, 0x07, 0x3a, 0xb0, 0x35, 0x4d, 0xa0, 0x23, 0x9f, 0x40, 0xe7, 0xf1, 0x59, 0x92, 0xe6,
0x5c, 0x13, 0x8f, 0xf3, 0x3c, 0xcd, 0x2b, 0x2d, 0x45, 0xe0, 0x8d, 0x4c, 0x26, 0x8d, 0x42, 0x6d,
0xbd, 0xf7, 0xe0, 0xc6, 0x9c, 0x53, 0xb6, 0xd1, 0xb2, 0x9f, 0x54, 0x2a, 0x59, 0x1b, 0x6d, 0xc3,
0xc4, 0xfe, 0x11, 0x6c, 0x9d, 0xe4, 0xfc, 0x34, 0x8e, 0xce, 0xfa, 0xb3, 0xb5, 0xdf, 0x53, 0x31,
0x21, 0xf5, 0xb4, 0xf3, 0xfe, 0x5e, 0x83, 0xed, 0x99, 0x23, 0x54, 0x31, 0x8f, 0xa0, 0xd1, 0xe5,
0xa7, 0x68, 0x99, 0x3d, 0x5d, 0x2c, 0x58, 0xb2, 0x75, 0x7d, 0x92, 0x06, 0x90, 0x87, 0x50, 0x67,
0xa7, 0xe8, 0x6d, 0x60, 0x0d, 0x5e, 0x0b, 0x0a, 0x72, 0xd4, 0x41, 0x0d, 0x7b, 0xff, 0xc5, 0xbe,
0x78, 0x90, 0x65, 0xf1, 0xa8, 0xea, 0x1c, 0x36, 0xa0, 0xe2, 0xfb, 0xd8, 0x34, 0x20, 0x5c, 0xca,
0x06, 0x84, 0xea, 0x7b, 0x9c, 0xae, 0xb2, 0xde, 0xc8, 0x09, 0x83, 0xc5, 0x31, 0x0e, 0x59, 0xd6,
0x3c, 0xa9, 0xfa, 0xc6, 0x9a, 0xdf, 0x52, 0x04, 0x7f, 0x82, 0xcf, 0x7a, 0xbf, 0xf2, 0x43, 0x79,
0x7f, 0xe5, 0x1d, 0xbd, 0xff, 0x5b, 0x0d, 0x36, 0x2a, 0xde, 0xff, 0x68, 0xf3, 0xf4, 0x8f, 0x1a,
0x74, 0xa8, 0xcd, 0x3f, 0xe4, 0xa2, 0xd7, 0x3f, 0x28, 0x8e, 0xba, 0xe3, 0x6c, 0x61, 0x6e, 0xd4,
0xb0, 0x4f, 0xf9, 0xd2, 0x1b, 0x77, 0x1b, 0xae, 0xe2, 0x1c, 0xa0, 0x9e, 0x37, 0xea, 0xf0, 0x61,
0xf7, 0x5b, 0xf9, 0xc0, 0xdd, 0x80, 0xb5, 0x01, 0x3b, 0x0f, 0x70, 0x14, 0x2e, 0x68, 0x1a, 0xbc,
0x8a, 0x7b, 0x1f, 0xb7, 0x6a, 0x00, 0x8e, 0x0a, 0x35, 0xd9, 0x76, 0xa3, 0x04, 0xbf, 0x06, 0x0a,
0x95, 0xa4, 0x35, 0x1c, 0x80, 0x35, 0xfc, 0x40, 0xa3, 0xb2, 0xc3, 0xe7, 0xea, 0xbe, 0xd8, 0x29,
0xc0, 0x0e, 0x9f, 0x5b, 0x97, 0xc8, 0xfb, 0x02, 0x6e, 0xcc, 0xb1, 0x99, 0x62, 0x7c, 0x0f, 0x56,
0xb1, 0x47, 0x94, 0xb1, 0xa0, 0xe0, 0xba, 0x7b, 0xfa, 0x83, 0xe5, 0x3b, 0xf9, 0xeb, 0x2b, 0x8a,
0x4f, 0x1c, 0xde, 0x57, 0xd3, 0xce, 0x63, 0xd2, 0xde, 0xec, 0xbc, 0xed, 0xe3, 0x52, 0xc5, 0xc7,
0x59, 0xab, 0x94, 0xb0, 0x77, 0xb0, 0x4a, 0x76, 0xef, 0x98, 0x0d, 0xb9, 0x7e, 0x50, 0x4d, 0x27,
0x79, 0x88, 0x6d, 0xda, 0x46, 0x49, 0xf0, 0x87, 0xf2, 0x59, 0x1d, 0x3f, 0xc5, 0xce, 0xfe, 0xf6,
0xde, 0xf4, 0x27, 0x18, 0x1d, 0x20, 0x36, 0xd9, 0x2e, 0xbf, 0x61, 0x05, 0x56, 0x80, 0x99, 0xc0,
0x8c, 0x82, 0x4f, 0x60, 0x6b, 0x9a, 0x40, 0x3a, 0xec, 0x81, 0xac, 0x36, 0x35, 0x90, 0xb9, 0xf8,
0xb9, 0x83, 0x6d, 0x5e, 0x99, 0x66, 0x24, 0x6d, 0x40, 0xdb, 0xc2, 0xa8, 0xe3, 0xfd, 0x0e, 0xb6,
0xc7, 0xe0, 0x37, 0x58, 0x8b, 0x83, 0x72, 0x60, 0x4d, 0x5c, 0x17, 0xc9, 0x77, 0x6f, 0x43, 0xfd,
0x35, 0xc3, 0x79, 0x43, 0x44, 0x03, 0x6e, 0x86, 0x8a, 0x65, 0xdf, 0x91, 0xd8, 0x33, 0x0d, 0x79,
0xbf, 0x82, 0xce, 0xac, 0xe4, 0x05, 0x4c, 0x57, 0x66, 0xb2, 0x5c, 0x54, 0x6c, 0x97, 0xc1, 0xb7,
0x40, 0x32, 0xfe, 0x08, 0x6e, 0xeb, 0x27, 0x0c, 0xe7, 0x29, 0x7c, 0x0a, 0xb0, 0x05, 0x61, 0xd2,
0x70, 0x76, 0xe3, 0x89, 0xe0, 0xa1, 0x71, 0x43, 0x8d, 0x46, 0x9a, 0x1c, 0x44, 0x66, 0xcc, 0x04,
0x03, 0x3d, 0x0e, 0xbd, 0xf7, 0xc1, 0x7b, 0x93, 0x14, 0xd2, 0xb5, 0x0b, 0x37, 0xa7, 0xb9, 0x8e,
0x63, 0xde, 0x9b, 0x28, 0xf2, 0x6e, 0xc3, 0xad, 0x0b, 0x39, 0x48, 0x88, 0xab, 0xa7, 0x2a, 0xe9,
0xc4, 0xb8, 0x82, 0x7e, 0xa6, 0x27, 0x1e, 0xc2, 0x28, 0x40, 0x58, 0xe6, 0x2c, 0x0c, 0x73, 0x33,
0x69, 0xe9, 0x8d, 0xf7, 0x47, 0xd8, 0x7a, 0x89, 0x11, 0xb6, 0xe6, 0x74, 0xe3, 0xe4, 0x01, 0xd4,
0xbb, 0x71, 0x16, 0x54, 0x82, 0x3a, 0x7f, 0x3a, 0xb1, 0x0f, 0x3b, 0x5d, 0x6b, 0xe2, 0x5f, 0x20,
0xa5, 0x37, 0x60, 0x7b, 0x46, 0x3f, 0x79, 0xd6, 0x82, 0xa6, 0xcc, 0x36, 0x92, 0x8c, 0x5f, 0x2f,
0x60, 0x7d, 0x8c, 0x90, 0x57, 0x87, 0xd8, 0x68, 0x2d, 0x2b, 0xcd, 0x67, 0xcf, 0x65, 0x66, 0xd6,
0x2d, 0x33, 0x0b, 0xaf, 0x2d, 0xe5, 0x62, 0x29, 0x58, 0xaa, 0x54, 0xb5, 0x1b, 0x88, 0x0c, 0xfa,
0x03, 0xb8, 0x38, 0x66, 0x20, 0xf2, 0x3c, 0x11, 0x51, 0x6c, 0xe2, 0xf4, 0x43, 0x58, 0xb0, 0x48,
0xa4, 0xee, 0xe3, 0xdc, 0x61, 0x6b, 0x5f, 0xa0, 0xee, 0x31, 0xb8, 0xc8, 0x27, 0x67, 0xbb, 0x71,
0xa3, 0x30, 0xfe, 0xed, 0x40, 0x67, 0x96, 0x44, 0x7e, 0xe2, 0x75, 0x79, 0x8c, 0x4f, 0x88, 0xee,
0x11, 0xe6, 0xc0, 0x47, 0xe0, 0xda, 0xe0, 0x02, 0xda, 0xf1, 0xeb, 0xfb, 0xe6, 0x49, 0x9a, 0x95,
0xb1, 0x9a, 0xe1, 0x74, 0xf5, 0x7f, 0x99, 0x96, 0xb2, 0x8c, 0x4d, 0xec, 0x7e, 0x0a, 0xeb, 0xd2,
0xe3, 0xa0, 0x97, 0x73, 0x64, 0x0a, 0x83, 0xc4, 0x7c, 0x67, 0x34, 0x24, 0x7c, 0xa8, 0xd1, 0x6f,
0x0b, 0x79, 0xe1, 0x58, 0x4f, 0x0a, 0xb5, 0x5f, 0x23, 0xd0, 0x90, 0x7a, 0x91, 0x3e, 0x85, 0xfa,
0x40, 0x59, 0x16, 0xb0, 0x38, 0x62, 0xfa, 0x55, 0x72, 0xf6, 0xaf, 0x4f, 0xcf, 0xa5, 0x07, 0x92,
0xe8, 0x3b, 0x9a, 0x55, 0x6d, 0xdc, 0xfb, 0xb0, 0x69, 0xf5, 0xd1, 0x49, 0xb9, 0xaf, 0x28, 0x1d,
0x1b, 0x16, 0xcd, 0x64, 0x4b, 0xde, 0xca, 0x0b, 0xfd, 0xa2, 0x10, 0xfe, 0xb9, 0x06, 0x2d, 0x19,
0x2e, 0xbb, 0xe3, 0xb8, 0xbf, 0x80, 0x55, 0xcd, 0x4d, 0x77, 0xe9, 0x02, 0xf3, 0x88, 0xe9, 0x42,
0xcb, 0x96, 0x2e, 0xb4, 0x6c, 0x5e, 0x3c, 0x97, 0xe7, 0xc4, 0xd3, 0x64, 0xb8, 0xda, 0xfa, 0x70,
0xb0, 0x3d, 0xe2, 0x83, 0x54, 0xf0, 0x6a, 0xe2, 0xf7, 0x61, 0xb3, 0x0a, 0x2f, 0x90, 0xfa, 0xcf,
0x31, 0x42, 0x79, 0x2a, 0x0f, 0x29, 0x15, 0x2f, 0xfb, 0x3c, 0x39, 0x64, 0x25, 0x8e, 0xb3, 0xcf,
0xb3, 0x05, 0x9e, 0x02, 0xef, 0x37, 0xb0, 0x7b, 0xf1, 0xf1, 0xc5, 0xea, 0x5e, 0x1f, 0x64, 0x05,
0xc9, 0x09, 0xad, 0xba, 0x9f, 0x25, 0x51, 0x00, 0xfe, 0x24, 0xff, 0xd1, 0xe3, 0xd5, 0xba, 0x7f,
0xdb, 0xa4, 0xcd, 0xc9, 0xc0, 0xd2, 0xbc, 0x8a, 0xbe, 0x07, 0x6d, 0x35, 0x00, 0xcb, 0xcf, 0xeb,
0x1c, 0x3f, 0xb2, 0xa5, 0x4d, 0x34, 0xf7, 0xae, 0x2b, 0xc2, 0xe4, 0x6d, 0x52, 0xcf, 0x17, 0x9f,
0xba, 0x79, 0xde, 0xe3, 0x89, 0x23, 0x88, 0x49, 0xe6, 0xc9, 0xfb, 0xf4, 0x76, 0x36, 0xcb, 0xcf,
0x9d, 0x39, 0xa2, 0x48, 0x0f, 0x3e, 0x65, 0xb2, 0xe7, 0x5a, 0x7d, 0xe2, 0x20, 0x09, 0xe5, 0xeb,
0x52, 0x99, 0x59, 0x5e, 0xc0, 0x9d, 0x37, 0x72, 0xbd, 0xeb, 0x0c, 0x83, 0x35, 0x69, 0x57, 0x82,
0x55, 0x93, 0x55, 0x78, 0x81, 0xa2, 0xb8, 0x0f, 0x8d, 0x07, 0xac, 0xf7, 0xaa, 0x1c, 0x57, 0xe0,
0x2e, 0x38, 0xbd, 0x34, 0xe9, 0x95, 0x39, 0x06, 0xa1, 0x37, 0xa2, 0xc6, 0x63, 0x43, 0x38, 0x6f,
0x34, 0xcd, 0x11, 0x52, 0xf0, 0x3e, 0x5c, 0xe1, 0xc3, 0x49, 0x60, 0x9b, 0x7b, 0xe6, 0xff, 0xee,
0x63, 0x89, 0xfa, 0x9a, 0xd8, 0x5d, 0x55, 0xff, 0x7e, 0x7f, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff,
0xff, 0x02, 0xd3, 0x4c, 0xf2, 0x6e, 0x17, 0x00, 0x00,
// 1970 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x58, 0xdd, 0x6f, 0xdb, 0xc8,
0x11, 0x87, 0x6c, 0xc7, 0x71, 0x86, 0x92, 0x2c, 0xd1, 0x8e, 0xad, 0xf8, 0x80, 0xc4, 0x61, 0xae,
0xbd, 0x34, 0x45, 0x7d, 0x8d, 0xee, 0x5a, 0x1c, 0x7a, 0xb8, 0xa2, 0x8e, 0xed, 0x5c, 0x92, 0xfb,
0x88, 0x8f, 0xf9, 0x2a, 0xfa, 0x42, 0xac, 0xc4, 0xb5, 0x44, 0x84, 0x22, 0x79, 0xdc, 0xa5, 0x62,
0x01, 0x45, 0xff, 0x8b, 0xbe, 0xf5, 0xad, 0x40, 0xfb, 0x58, 0xa0, 0x7f, 0x4c, 0x8b, 0xfe, 0x25,
0x7d, 0xe8, 0x4b, 0x67, 0xbf, 0xa8, 0xa5, 0x24, 0xc7, 0x4a, 0x70, 0xf7, 0x62, 0x70, 0x7f, 0x33,
0x3b, 0xdf, 0x3b, 0x33, 0x32, 0xec, 0x72, 0xd2, 0x8b, 0x29, 0x1f, 0x91, 0x84, 0x0c, 0x68, 0x1e,
0x12, 0x4e, 0x0e, 0xb2, 0x3c, 0xe5, 0xa9, 0xdb, 0x9e, 0x23, 0xec, 0x39, 0xdf, 0x17, 0x34, 0x9f,
0x28, 0xfa, 0x5e, 0x93, 0xa7, 0x59, 0x3a, 0xe5, 0xdf, 0xbb, 0x9e, 0xd3, 0x2c, 0x8e, 0xfa, 0x84,
0x47, 0x69, 0x62, 0xc1, 0x8d, 0x38, 0x1d, 0x14, 0x3c, 0x8a, 0xd5, 0xd1, 0xfb, 0x4f, 0x0d, 0x36,
0x9f, 0x0b, 0xc1, 0xc7, 0xf4, 0x2c, 0x4a, 0x22, 0xc1, 0xec, 0xba, 0xb0, 0x96, 0x90, 0x11, 0xed,
0xd4, 0xf6, 0x6b, 0x77, 0xaf, 0xf9, 0xf2, 0xdb, 0xdd, 0x81, 0x75, 0xd6, 0x1f, 0xd2, 0x11, 0xe9,
0xac, 0x48, 0x54, 0x9f, 0xdc, 0x0e, 0x5c, 0xed, 0xa7, 0x71, 0x31, 0x4a, 0x58, 0x67, 0x75, 0x7f,
0x15, 0x09, 0xe6, 0xe8, 0x1e, 0xc0, 0x56, 0x96, 0x47, 0x23, 0x92, 0x4f, 0x82, 0xd7, 0x74, 0x12,
0x18, 0xae, 0x35, 0xc9, 0xd5, 0xd6, 0xa4, 0xaf, 0xe8, 0xe4, 0x48, 0xf3, 0xa3, 0x56, 0x3e, 0xc9,
0x68, 0xe7, 0x8a, 0xd2, 0x2a, 0xbe, 0xdd, 0x5b, 0xe0, 0x08, 0xd3, 0x83, 0x98, 0x26, 0x03, 0x3e,
0xec, 0xac, 0x23, 0x69, 0xcd, 0x07, 0x01, 0x7d, 0x2d, 0x11, 0xf7, 0x03, 0xb8, 0x96, 0xa7, 0x6f,
0x50, 0x78, 0x91, 0xf0, 0xce, 0x55, 0x49, 0xde, 0x40, 0xe0, 0x48, 0x9c, 0xbd, 0xbf, 0xd5, 0xa0,
0xf5, 0x4c, 0x9a, 0x69, 0x39, 0xf7, 0x11, 0x6c, 0x8a, 0xfb, 0x3d, 0xc2, 0x68, 0xa0, 0x3d, 0x52,
0x7e, 0x36, 0x0d, 0xac, 0xae, 0xb8, 0x4f, 0x41, 0x45, 0x3c, 0x08, 0xcb, 0xcb, 0x0c, 0x9d, 0x5f,
0xbd, 0xeb, 0x74, 0xbd, 0x83, 0xf9, 0x24, 0xcd, 0x04, 0xd1, 0x6f, 0xf1, 0x2a, 0xc0, 0x44, 0xa8,
0xc6, 0x34, 0x67, 0xf8, 0x8d, 0xa1, 0x12, 0x1a, 0xcd, 0xd1, 0xfb, 0x6f, 0x0d, 0x9a, 0x2f, 0x18,
0xcd, 0x4f, 0x69, 0x3e, 0x8a, 0x18, 0xd3, 0x39, 0x18, 0xa6, 0x8c, 0x9b, 0x1c, 0x88, 0x6f, 0x81,
0x15, 0xc8, 0xa5, 0x33, 0x20, 0xbf, 0xdd, 0x9f, 0x43, 0x3b, 0x23, 0x8c, 0xbd, 0x49, 0xf3, 0x30,
0x40, 0xbb, 0xfb, 0xaf, 0x59, 0x31, 0x92, 0xe2, 0xd7, 0xfc, 0x96, 0x21, 0x1c, 0x69, 0xdc, 0xfd,
0x0e, 0x00, 0xe3, 0x3e, 0x8e, 0x62, 0x3a, 0xa0, 0x2a, 0x13, 0x4e, 0xf7, 0xfe, 0x02, 0x5f, 0xaa,
0xb6, 0x1c, 0x9c, 0x96, 0x77, 0x4e, 0x12, 0x9e, 0x4f, 0x7c, 0x4b, 0xc8, 0xde, 0x17, 0xb0, 0x39,
0x43, 0x76, 0x5b, 0xb0, 0x8a, 0x09, 0xd7, 0x96, 0x8b, 0x4f, 0x77, 0x1b, 0xae, 0x8c, 0x49, 0x5c,
0x50, 0x6d, 0xb9, 0x3a, 0xfc, 0x66, 0xe5, 0xb3, 0x9a, 0xf7, 0xaf, 0x1a, 0xd4, 0x8f, 0x7b, 0x97,
0xf8, 0xdd, 0x84, 0x95, 0xb0, 0xa7, 0xef, 0xe2, 0x57, 0x19, 0x87, 0x55, 0x2b, 0x0e, 0x4f, 0x17,
0xb8, 0xf6, 0xf1, 0x02, 0xd7, 0x6c, 0x65, 0x3f, 0xa6, 0x63, 0x7f, 0xad, 0x81, 0x33, 0xd5, 0xc4,
0xdc, 0xaf, 0xa1, 0x25, 0xec, 0x0c, 0xb2, 0x29, 0x86, 0x82, 0x84, 0x95, 0xb7, 0x2f, 0x4d, 0x80,
0xbf, 0x59, 0x54, 0xce, 0xcc, 0x7d, 0x08, 0xcd, 0xb0, 0x57, 0x91, 0xa5, 0x0a, 0xf3, 0xd6, 0x25,
0x1e, 0xfb, 0x8d, 0xd0, 0x3a, 0x31, 0xef, 0x73, 0x70, 0x1e, 0xc4, 0xd9, 0x69, 0xca, 0xd4, 0xdb,
0x40, 0x07, 0x8b, 0x28, 0x94, 0x0e, 0x36, 0x7c, 0xf1, 0xe9, 0xee, 0xc1, 0x46, 0xa6, 0xa9, 0xda,
0xc7, 0xf2, 0xec, 0x7d, 0x84, 0x1e, 0x46, 0xc9, 0xc0, 0xa7, 0xd8, 0x85, 0x30, 0x4b, 0x58, 0xde,
0x19, 0x99, 0xc4, 0x29, 0x09, 0x75, 0x84, 0xcc, 0xd1, 0xbb, 0x0b, 0x75, 0xc5, 0xc8, 0x32, 0x54,
0x4a, 0xdf, 0xc2, 0x79, 0x0f, 0xea, 0xcf, 0x62, 0x4a, 0x33, 0x23, 0x13, 0xd5, 0x87, 0x45, 0x2e,
0x5b, 0x98, 0x64, 0x5d, 0xf5, 0xcb, 0xb3, 0xb7, 0x09, 0x0d, 0xcd, 0xab, 0xc4, 0x7a, 0xff, 0xae,
0x81, 0x7b, 0x72, 0x4e, 0xfb, 0x05, 0xa7, 0x8f, 0xd2, 0xf4, 0xb5, 0x91, 0xb1, 0xa8, 0x9b, 0xdd,
0xc4, 0x6a, 0x21, 0x39, 0x7e, 0x71, 0x7c, 0x81, 0x32, 0x76, 0xd7, 0x7c, 0x0b, 0x71, 0x4f, 0xe1,
0x1a, 0x3d, 0xe7, 0x39, 0x09, 0x68, 0x32, 0x96, 0x7d, 0xcd, 0xe9, 0x7e, 0xb2, 0x20, 0xb4, 0xf3,
0xda, 0x10, 0xc2, 0x6b, 0x27, 0xc9, 0x58, 0x15, 0xd4, 0x06, 0xd5, 0xc7, 0xbd, 0xcf, 0xa1, 0x51,
0x21, 0xbd, 0x53, 0x31, 0x9d, 0xc1, 0x56, 0x45, 0x95, 0x8e, 0x23, 0x76, 0x47, 0x7a, 0x1e, 0xf1,
0x80, 0x71, 0xc2, 0x0b, 0xa6, 0x03, 0x04, 0x02, 0x7a, 0x26, 0x11, 0xd9, 0xb4, 0x79, 0x98, 0x16,
0xbc, 0x6c, 0xda, 0xf2, 0xa4, 0x71, 0x9a, 0x9b, 0x27, 0xa4, 0x4f, 0xde, 0x18, 0x5a, 0x5f, 0x52,
0xae, 0xfa, 0x9f, 0x09, 0x1f, 0xf2, 0x4a, 0xc7, 0x55, 0xb9, 0x22, 0xaf, 0x3a, 0xb9, 0x77, 0xa0,
0x11, 0x25, 0xfd, 0xb8, 0x08, 0x69, 0x30, 0x8e, 0xe8, 0x1b, 0x26, 0x55, 0x6c, 0xf8, 0x75, 0x0d,
0xbe, 0x14, 0x98, 0xfb, 0x13, 0x68, 0xd2, 0x73, 0xc5, 0xa4, 0x85, 0xa8, 0x21, 0xd1, 0xd0, 0xa8,
0x6c, 0x9a, 0xcc, 0xa3, 0xd0, 0xb6, 0xf4, 0x6a, 0xef, 0x4e, 0xa1, 0xad, 0xfa, 0xb3, 0xd5, 0x80,
0xa5, 0x8f, 0x4e, 0xf7, 0xce, 0x82, 0x5c, 0xcc, 0x36, 0x7a, 0xbf, 0xc5, 0x66, 0x10, 0x6f, 0x17,
0xae, 0xa3, 0x1a, 0xab, 0xfe, 0xb5, 0x8f, 0xde, 0x1f, 0x60, 0x67, 0x96, 0xa0, 0x8d, 0xf8, 0x1d,
0x38, 0xd5, 0x17, 0x2b, 0xd4, 0xdf, 0x5c, 0xa0, 0xde, 0xbe, 0x6c, 0x5f, 0xf1, 0xb6, 0xc1, 0x7d,
0x46, 0xb9, 0x4f, 0x49, 0xf8, 0x34, 0x89, 0x27, 0x46, 0xe3, 0x75, 0xd8, 0xaa, 0xa0, 0xba, 0x84,
0xa7, 0xf0, 0xab, 0x3c, 0xe2, 0xd4, 0x70, 0xef, 0xc0, 0x76, 0x15, 0xd6, 0xec, 0x4f, 0xa0, 0x7d,
0x34, 0x24, 0xc9, 0x80, 0x3e, 0xc7, 0x61, 0x69, 0x12, 0xf6, 0x2b, 0x70, 0x94, 0x79, 0x81, 0x1c,
0xa7, 0xc2, 0xe4, 0x66, 0x77, 0xfb, 0xa0, 0xdc, 0x0e, 0x64, 0xcc, 0xb9, 0xbc, 0x01, 0xbc, 0xfc,
0x16, 0x76, 0xda, 0xb2, 0xa6, 0x06, 0xf9, 0xf4, 0x2c, 0xa7, 0x6c, 0x28, 0x4a, 0xca, 0x36, 0xa8,
0x0a, 0x6b, 0x76, 0x8c, 0xb0, 0x5f, 0x24, 0x8f, 0x28, 0x89, 0xf9, 0x50, 0x4e, 0x1d, 0x73, 0xa1,
0x03, 0x3b, 0xb3, 0x04, 0x7d, 0xe5, 0x53, 0xe8, 0x3c, 0x1e, 0x24, 0x69, 0x4e, 0x15, 0xf1, 0x24,
0xcf, 0xd3, 0xbc, 0xd2, 0x52, 0x38, 0xbe, 0xc8, 0x64, 0xda, 0x28, 0xe4, 0xd1, 0xfb, 0x00, 0x6e,
0x2c, 0xb8, 0x65, 0x1b, 0x2d, 0xfa, 0x49, 0xa5, 0x92, 0x95, 0xd1, 0x36, 0xac, 0xd9, 0xbb, 0xb0,
0x73, 0x9a, 0xd3, 0xb3, 0x38, 0x1a, 0x0c, 0x67, 0x6a, 0x5f, 0x2c, 0x37, 0x32, 0x26, 0xa6, 0xf8,
0xcd, 0xd1, 0xfb, 0x47, 0x0d, 0x76, 0xe7, 0x2e, 0xe9, 0x9a, 0x79, 0x02, 0xcd, 0x1e, 0x3d, 0x43,
0xdb, 0xf4, 0x7e, 0x61, 0x1a, 0xfd, 0x52, 0x55, 0xdb, 0x50, 0x57, 0x15, 0xce, 0xdc, 0x47, 0xd0,
0x20, 0x67, 0xe8, 0x71, 0x29, 0x6a, 0x65, 0x79, 0x51, 0x75, 0x79, 0x53, 0x4b, 0xf2, 0xfe, 0x87,
0xdd, 0xf1, 0x30, 0xcb, 0xe2, 0x49, 0xd5, 0x45, 0x6c, 0x43, 0xec, 0xfb, 0xd8, 0xb4, 0x21, 0xfc,
0x14, 0x6d, 0x08, 0x2d, 0xe8, 0x53, 0xfd, 0xa0, 0xd5, 0x41, 0xec, 0x19, 0x24, 0x8e, 0x71, 0xd5,
0xb2, 0xb6, 0x4a, 0xd9, 0x3d, 0x36, 0xfc, 0x96, 0x24, 0xf8, 0x53, 0x5c, 0x58, 0x5d, 0x89, 0x00,
0xce, 0xe3, 0xa5, 0x9f, 0x6d, 0xdd, 0x0e, 0x00, 0x0e, 0xba, 0xba, 0xed, 0xbf, 0x5c, 0x0e, 0x97,
0x14, 0xe4, 0x58, 0xee, 0x7b, 0x7f, 0xaf, 0xc1, 0x56, 0xc5, 0x7b, 0x9d, 0xab, 0x39, 0x4b, 0x6b,
0x3f, 0x94, 0xa5, 0x2b, 0xef, 0x69, 0xe9, 0x3f, 0x6b, 0xd0, 0xd1, 0xcd, 0xfe, 0x21, 0xe5, 0xfd,
0xe1, 0x21, 0x3b, 0xee, 0x95, 0xd9, 0xc2, 0xdc, 0xc8, 0x95, 0x5f, 0xe7, 0x4b, 0x1d, 0xdc, 0x5d,
0xb8, 0x8a, 0xdb, 0x80, 0x1c, 0x72, 0xba, 0xcf, 0x87, 0xbd, 0x6f, 0xc5, 0x98, 0xbb, 0x01, 0x1b,
0x23, 0x72, 0x1e, 0xe0, 0x42, 0xcc, 0xf4, 0x4e, 0x78, 0x15, 0xcf, 0x3e, 0x1e, 0xe5, 0x1a, 0x1c,
0x31, 0xb9, 0xdf, 0xf6, 0xa2, 0x04, 0x7f, 0x13, 0x30, 0x99, 0xa4, 0x0d, 0x5c, 0x83, 0x15, 0xfc,
0x40, 0xa1, 0xa2, 0xcf, 0xe7, 0xf2, 0xd5, 0xd8, 0x29, 0xc0, 0x3e, 0x9f, 0x5b, 0x4f, 0xc9, 0xfb,
0x12, 0x6e, 0x2c, 0xb0, 0x59, 0xc7, 0xf8, 0x1e, 0xac, 0x63, 0xa7, 0x28, 0x62, 0xae, 0x83, 0xeb,
0x1e, 0xa8, 0x9f, 0x2d, 0xdf, 0x89, 0xbf, 0xbe, 0xa4, 0xf8, 0x9a, 0xc3, 0xfb, 0x6a, 0xd6, 0x79,
0x4c, 0xda, 0xdb, 0x9d, 0xb7, 0x7d, 0x5c, 0xa9, 0xf8, 0x38, 0x6f, 0x95, 0x14, 0xf6, 0x1e, 0x56,
0x89, 0x1e, 0x1e, 0x93, 0x31, 0x55, 0x63, 0xd5, 0xf4, 0x93, 0x87, 0xd8, 0xac, 0x6d, 0x54, 0x0b,
0xfe, 0x58, 0x0c, 0xd7, 0x72, 0x20, 0x3b, 0xdd, 0xdd, 0x83, 0xd9, 0x1f, 0x62, 0xfa, 0x82, 0x66,
0x13, 0x4d, 0xf3, 0x1b, 0xc2, 0xb0, 0x02, 0xcc, 0x1e, 0x66, 0x14, 0x7c, 0x0a, 0x3b, 0xb3, 0x04,
0xad, 0xc3, 0x5e, 0xcb, 0x6a, 0x33, 0x6b, 0x99, 0x8b, 0x3f, 0x7a, 0xb0, 0xd9, 0x4b, 0xd3, 0x8c,
0xa4, 0x2d, 0x68, 0x5b, 0x98, 0xee, 0x7b, 0xbf, 0x87, 0xdd, 0x12, 0xfc, 0x06, 0x6b, 0x71, 0x54,
0x8c, 0xac, 0xbd, 0xeb, 0x22, 0xf9, 0xee, 0x6d, 0xa8, 0xbf, 0x21, 0xb8, 0x75, 0xf0, 0x68, 0x44,
0xcd, 0x6a, 0xb1, 0xea, 0x3b, 0x02, 0x7b, 0xae, 0x20, 0xef, 0xd7, 0xd0, 0x99, 0x97, 0xbc, 0x84,
0xe9, 0xd2, 0x4c, 0x92, 0xf3, 0x8a, 0xed, 0x22, 0xf8, 0x16, 0xa8, 0x8d, 0x3f, 0x86, 0xdb, 0x6a,
0x90, 0xe1, 0x56, 0x85, 0x03, 0x01, 0x5b, 0x10, 0x26, 0x0d, 0x37, 0x38, 0x9a, 0x70, 0x1a, 0x1a,
0x37, 0xe4, 0x82, 0xa4, 0xc8, 0x41, 0x64, 0x96, 0x4d, 0x30, 0xd0, 0xe3, 0xd0, 0xfb, 0x10, 0xbc,
0xb7, 0x49, 0xd1, 0xba, 0xf6, 0xe1, 0xe6, 0x2c, 0xd7, 0x49, 0x4c, 0xfb, 0x53, 0x45, 0xde, 0x6d,
0xb8, 0x75, 0x21, 0x87, 0x16, 0xe2, 0xaa, 0xdd, 0x4a, 0x38, 0x51, 0x56, 0xd0, 0xcf, 0xd4, 0xde,
0xa3, 0x31, 0x1d, 0x20, 0x2c, 0x73, 0x12, 0x86, 0xb9, 0x19, 0x39, 0xea, 0xe0, 0xfd, 0x09, 0x76,
0x5e, 0x61, 0x84, 0xad, 0x6d, 0xdd, 0x38, 0x79, 0x08, 0xf5, 0x5e, 0x9c, 0x05, 0x95, 0xa0, 0x2e,
0xde, 0x51, 0xec, 0xcb, 0x4e, 0xcf, 0xda, 0xfb, 0x97, 0x48, 0xe9, 0x0d, 0xd8, 0x9d, 0xd3, 0xaf,
0x3d, 0x6b, 0x41, 0x53, 0x64, 0x1b, 0x49, 0xc6, 0xaf, 0x97, 0xb0, 0x59, 0x22, 0xda, 0xab, 0x23,
0x6c, 0xb4, 0x96, 0x95, 0x66, 0x26, 0x5e, 0x66, 0x66, 0xdd, 0x32, 0x93, 0x79, 0x6d, 0x21, 0x17,
0x4b, 0xc1, 0x52, 0x25, 0xab, 0xdd, 0x40, 0xda, 0xa0, 0x3f, 0x82, 0x8b, 0xcb, 0x06, 0x22, 0x2f,
0x12, 0x1e, 0xc5, 0x26, 0x4e, 0x3f, 0x84, 0x05, 0xcb, 0x44, 0xea, 0x3e, 0x6e, 0x1f, 0xb6, 0xf6,
0x25, 0xea, 0x1e, 0x83, 0x8b, 0x7c, 0x62, 0xc3, 0x2b, 0x1b, 0x85, 0xf1, 0x6f, 0x0f, 0x3a, 0xf3,
0x24, 0xed, 0x27, 0x3e, 0x97, 0xc7, 0x38, 0x42, 0x54, 0x8f, 0x30, 0x17, 0x7e, 0x09, 0xae, 0x0d,
0x2e, 0xa1, 0x1d, 0x7f, 0x83, 0xdf, 0x3c, 0x4d, 0xb3, 0x22, 0x96, 0x9b, 0x9c, 0xaa, 0xfe, 0x27,
0x69, 0x21, 0xca, 0xd8, 0xc4, 0xee, 0xa7, 0xb0, 0x29, 0x3c, 0x0e, 0xfa, 0x39, 0x45, 0xa6, 0x30,
0x48, 0xcc, 0xaf, 0x8d, 0x86, 0x80, 0x8f, 0x14, 0xfa, 0x2d, 0x13, 0x0f, 0x8e, 0xf4, 0x85, 0x50,
0x7b, 0x1a, 0x81, 0x82, 0xe4, 0x44, 0xfa, 0x0c, 0xea, 0x23, 0x69, 0x59, 0x40, 0xe2, 0x88, 0xa8,
0xa9, 0xe4, 0x74, 0xaf, 0xcf, 0x6e, 0xa7, 0x87, 0x82, 0xe8, 0x3b, 0x8a, 0x55, 0x1e, 0xdc, 0xfb,
0xb0, 0x6d, 0xf5, 0xd1, 0x69, 0xb9, 0xaf, 0x49, 0x1d, 0x5b, 0x16, 0xcd, 0x64, 0x4b, 0xbc, 0xca,
0x0b, 0xfd, 0xd2, 0x21, 0xfc, 0x4b, 0x0d, 0x5a, 0x22, 0x5c, 0x76, 0xc7, 0x71, 0x7f, 0x01, 0xeb,
0x8a, 0x5b, 0xbf, 0xa5, 0x0b, 0xcc, 0xd3, 0x4c, 0x17, 0x5a, 0xb6, 0x72, 0xa1, 0x65, 0x8b, 0xe2,
0xb9, 0xba, 0x20, 0x9e, 0x26, 0xc3, 0xd5, 0xd6, 0x87, 0xeb, 0xed, 0x31, 0x1d, 0xa5, 0x9c, 0x56,
0x13, 0xdf, 0x85, 0xed, 0x2a, 0xbc, 0x44, 0xea, 0xbf, 0xc0, 0x08, 0xe5, 0xa9, 0xb8, 0x24, 0x55,
0xbc, 0x1a, 0xd2, 0xe4, 0x88, 0x14, 0xb8, 0xd2, 0xbe, 0xc8, 0x96, 0x18, 0x05, 0xde, 0x6f, 0x61,
0xff, 0xe2, 0xeb, 0xcb, 0xd5, 0xbd, 0xba, 0x48, 0x98, 0x96, 0x13, 0x5a, 0x75, 0x3f, 0x4f, 0xd2,
0x01, 0xf8, 0xb3, 0xf8, 0xbf, 0x1e, 0xad, 0xd6, 0xfd, 0xbb, 0x26, 0x6d, 0x41, 0x06, 0x56, 0x16,
0x55, 0xf4, 0x3d, 0x68, 0xcb, 0x05, 0x58, 0xfc, 0xc8, 0xce, 0xf1, 0xa7, 0xb6, 0xb0, 0x49, 0xef,
0xbd, 0x9b, 0x92, 0x30, 0x9d, 0x4d, 0x72, 0x7c, 0xd1, 0x99, 0x97, 0xe7, 0x3d, 0x9e, 0x3a, 0x82,
0x98, 0x60, 0x9e, 0xce, 0xa7, 0x77, 0xb3, 0x59, 0xfc, 0xe8, 0x59, 0x20, 0x4a, 0xeb, 0xc1, 0x51,
0x26, 0x7a, 0xae, 0xd5, 0x27, 0x0e, 0x93, 0x50, 0x4c, 0x97, 0xca, 0xce, 0xf2, 0x12, 0xee, 0xbc,
0x95, 0xeb, 0x7d, 0x77, 0x18, 0xac, 0x49, 0xbb, 0x12, 0xac, 0x9a, 0xac, 0xc2, 0x4b, 0x14, 0xc5,
0x7d, 0x68, 0x3c, 0x20, 0xfd, 0xd7, 0x45, 0x59, 0x81, 0xfb, 0xe0, 0xf4, 0xd3, 0xa4, 0x5f, 0xe4,
0x18, 0x84, 0xfe, 0x44, 0x37, 0x1e, 0x1b, 0xc2, 0x7d, 0xa3, 0x69, 0xae, 0x68, 0x05, 0x1f, 0xc2,
0x15, 0x3a, 0x9e, 0x06, 0xb6, 0x79, 0x60, 0xfe, 0xeb, 0x7d, 0x22, 0x50, 0x5f, 0x11, 0x7b, 0xeb,
0xf2, 0x7f, 0xe0, 0x9f, 0xfc, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x78, 0xf0, 0x91, 0x46, 0x74, 0x17,
0x00, 0x00,
}

Просмотреть файл

@ -244,11 +244,14 @@ func (client *fakeTabletManagerClient) AddSchemaDefinition(
client.schemaDefinitions[dbName] = schemaDefinition
}
func (client *fakeTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, change string) (*tmutils.SchemaChangeResult, error) {
result, ok := client.preflightSchemas[change]
if !ok {
var scr tmutils.SchemaChangeResult
return &scr, nil
func (client *fakeTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tmutils.SchemaChangeResult, error) {
var result []*tmutils.SchemaChangeResult
for _, change := range changes {
scr, ok := client.preflightSchemas[change]
if !ok {
result = append(result, &tmutils.SchemaChangeResult{})
}
result = append(result, scr)
}
return result, nil
}

Просмотреть файл

@ -153,23 +153,21 @@ func (exec *TabletExecutor) detectBigSchemaChanges(ctx context.Context, parsedDD
}
func (exec *TabletExecutor) preflightSchemaChanges(ctx context.Context, sqls []string) error {
exec.schemaDiffs = make([]*tmutils.SchemaChangeResult, len(sqls))
for i := range sqls {
schemaDiff, err := exec.tmClient.PreflightSchema(
ctx, exec.tablets[0], sqls[i])
if err != nil {
return err
}
exec.schemaDiffs[i] = schemaDiff
schemaDiffs, err := exec.tmClient.PreflightSchema(ctx, exec.tablets[0], sqls)
if err != nil {
return err
}
for i, schemaDiff := range schemaDiffs {
diffs := tmutils.DiffSchemaToArray(
"BeforeSchema",
exec.schemaDiffs[i].BeforeSchema,
schemaDiff.BeforeSchema,
"AfterSchema",
exec.schemaDiffs[i].AfterSchema)
schemaDiff.AfterSchema)
if len(diffs) == 0 {
return fmt.Errorf("Schema change: '%s' does not introduce any table definition change.", sqls[i])
}
}
exec.schemaDiffs = schemaDiffs
return nil
}

Просмотреть файл

@ -507,17 +507,19 @@ func agentRPCTestReloadSchemaPanic(ctx context.Context, t *testing.T, client tmc
expectRPCWrapLockActionPanic(t, err)
}
var testPreflightSchema = "change table add table cloth"
var testSchemaChangeResult = &tmutils.SchemaChangeResult{
BeforeSchema: testGetSchemaReply,
AfterSchema: testGetSchemaReply,
var testPreflightSchema = []string{"change table add table cloth"}
var testSchemaChangeResult = []*tmutils.SchemaChangeResult{
{
BeforeSchema: testGetSchemaReply,
AfterSchema: testGetSchemaReply,
},
}
func (fra *fakeRPCAgent) PreflightSchema(ctx context.Context, change string) (*tmutils.SchemaChangeResult, error) {
func (fra *fakeRPCAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tmutils.SchemaChangeResult, error) {
if fra.panics {
panic(fmt.Errorf("test-triggered panic"))
}
compare(fra.t, "PreflightSchema result", change, testPreflightSchema)
compare(fra.t, "PreflightSchema result", changes, testPreflightSchema)
return testSchemaChangeResult, nil
}
@ -544,12 +546,12 @@ func (fra *fakeRPCAgent) ApplySchema(ctx context.Context, change *tmutils.Schema
panic(fmt.Errorf("test-triggered panic"))
}
compare(fra.t, "ApplySchema change", change, testSchemaChange)
return testSchemaChangeResult, nil
return testSchemaChangeResult[0], nil
}
func agentRPCTestApplySchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) {
scr, err := client.ApplySchema(ctx, tablet, testSchemaChange)
compareError(t, "ApplySchema", err, scr, testSchemaChangeResult)
compareError(t, "ApplySchema", err, scr, testSchemaChangeResult[0])
}
func agentRPCTestApplySchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) {

Просмотреть файл

@ -122,8 +122,8 @@ func (client *FakeTabletManagerClient) ReloadSchema(ctx context.Context, tablet
}
// PreflightSchema is part of the tmclient.TabletManagerClient interface.
func (client *FakeTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, change string) (*tmutils.SchemaChangeResult, error) {
return &tmutils.SchemaChangeResult{}, nil
func (client *FakeTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tmutils.SchemaChangeResult, error) {
return make([]*tmutils.SchemaChangeResult, len(changes)), nil
}
// ApplySchema is part of the tmclient.TabletManagerClient interface.

Просмотреть файл

@ -253,22 +253,28 @@ func (client *Client) ReloadSchema(ctx context.Context, tablet *topodatapb.Table
}
// PreflightSchema is part of the tmclient.TabletManagerClient interface.
func (client *Client) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, change string) (*tmutils.SchemaChangeResult, error) {
func (client *Client) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tmutils.SchemaChangeResult, error) {
cc, c, err := client.dial(ctx, tablet)
if err != nil {
return nil, err
}
defer cc.Close()
response, err := c.PreflightSchema(ctx, &tabletmanagerdatapb.PreflightSchemaRequest{
Change: change,
Changes: changes,
})
if err != nil {
return nil, err
}
return &tmutils.SchemaChangeResult{
BeforeSchema: response.BeforeSchema,
AfterSchema: response.AfterSchema,
}, err
diffs := make([]*tmutils.SchemaChangeResult, len(changes))
for i := 0; i < len(changes); i++ {
diffs[i] = &tmutils.SchemaChangeResult{
BeforeSchema: response.BeforeSchemas[i],
AfterSchema: response.AfterSchemas[i],
}
}
return diffs, nil
}
// ApplySchema is part of the tmclient.TabletManagerClient interface.

Просмотреть файл

@ -155,10 +155,14 @@ func (s *server) PreflightSchema(ctx context.Context, request *tabletmanagerdata
ctx = callinfo.GRPCCallInfo(ctx)
response := &tabletmanagerdatapb.PreflightSchemaResponse{}
return response, s.agent.RPCWrapLockAction(ctx, tabletmanager.TabletActionPreflightSchema, request, response, true, func() error {
scr, err := s.agent.PreflightSchema(ctx, request.Change)
diffs, err := s.agent.PreflightSchema(ctx, request.Changes)
if err == nil {
response.BeforeSchema = scr.BeforeSchema
response.AfterSchema = scr.AfterSchema
response.BeforeSchemas = make([]*tabletmanagerdatapb.SchemaDefinition, len(request.Changes))
response.AfterSchemas = make([]*tabletmanagerdatapb.SchemaDefinition, len(request.Changes))
for i := 0; i < len(request.Changes); i++ {
response.BeforeSchemas[i] = diffs[i].BeforeSchema
response.AfterSchemas[i] = diffs[i].AfterSchema
}
}
return err
})

Просмотреть файл

@ -193,7 +193,7 @@ type RPCAgent interface {
ReloadSchema(ctx context.Context)
PreflightSchema(ctx context.Context, change string) (*tmutils.SchemaChangeResult, error)
PreflightSchema(ctx context.Context, changes []string) ([]*tmutils.SchemaChangeResult, error)
ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tmutils.SchemaChangeResult, error)

Просмотреть файл

@ -32,14 +32,14 @@ func (agent *ActionAgent) ReloadSchema(ctx context.Context) {
agent.QueryServiceControl.ReloadSchema()
}
// PreflightSchema will try out the schema change
// PreflightSchema will try out the schema changes in "changes".
// Should be called under RPCWrapLockAction.
func (agent *ActionAgent) PreflightSchema(ctx context.Context, change string) (*tmutils.SchemaChangeResult, error) {
func (agent *ActionAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tmutils.SchemaChangeResult, error) {
// get the db name from the tablet
dbName := topoproto.TabletDbName(agent.Tablet())
// and preflight the change
return agent.MysqlDaemon.PreflightSchemaChange(dbName, change)
return agent.MysqlDaemon.PreflightSchemaChange(dbName, changes)
}
// ApplySchema will apply a schema change

Просмотреть файл

@ -70,8 +70,8 @@ type TabletManagerClient interface {
// ReloadSchema asks the remote tablet to reload its schema
ReloadSchema(ctx context.Context, tablet *topodatapb.Tablet) error
// PreflightSchema will test a schema change
PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, change string) (*tmutils.SchemaChangeResult, error)
// PreflightSchema will test a list of schema changes.
PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tmutils.SchemaChangeResult, error)
// ApplySchema will apply a schema change
ApplySchema(ctx context.Context, tablet *topodatapb.Tablet, change *tmutils.SchemaChange) (*tmutils.SchemaChangeResult, error)

Просмотреть файл

@ -185,12 +185,12 @@ func (wr *Wrangler) ValidateSchemaKeyspace(ctx context.Context, keyspace string,
}
// PreflightSchema will try a schema change on the remote tablet.
func (wr *Wrangler) PreflightSchema(ctx context.Context, tabletAlias *topodatapb.TabletAlias, change string) (*tmutils.SchemaChangeResult, error) {
func (wr *Wrangler) PreflightSchema(ctx context.Context, tabletAlias *topodatapb.TabletAlias, changes []string) ([]*tmutils.SchemaChangeResult, error) {
ti, err := wr.ts.GetTablet(ctx, tabletAlias)
if err != nil {
return nil, err
}
return wr.tmc.PreflightSchema(ctx, ti.Tablet, change)
return wr.tmc.PreflightSchema(ctx, ti.Tablet, changes)
}
// ApplySchemaKeyspace applies a schema change to an entire keyspace.

Просмотреть файл

@ -63,9 +63,11 @@ func TestApplySchema_AllowLongUnavailability(t *testing.T) {
},
},
}
preflightSchemaChange := &tmutils.SchemaChangeResult{
BeforeSchema: beforeSchema,
AfterSchema: afterSchema,
preflightSchemaChanges := []*tmutils.SchemaChangeResult{
{
BeforeSchema: beforeSchema,
AfterSchema: afterSchema,
},
}
tShard1 := NewFakeTablet(t, wr, cells[0], 0,
@ -77,7 +79,7 @@ func TestApplySchema_AllowLongUnavailability(t *testing.T) {
defer ft.StopActionLoop(t)
ft.FakeMysqlDaemon.Schema = beforeSchema
ft.FakeMysqlDaemon.PreflightSchemaChangeResult = preflightSchemaChange
ft.FakeMysqlDaemon.PreflightSchemaChangeResult = preflightSchemaChanges
}
changeToDb := "USE vt_ks"

Просмотреть файл

@ -169,12 +169,16 @@ message ReloadSchemaResponse {
}
message PreflightSchemaRequest {
string change = 1;
repeated string changes = 1;
}
message PreflightSchemaResponse {
SchemaDefinition before_schema = 1;
SchemaDefinition after_schema = 2;
// before_schemas holds the schema before each change.
// The number of elements is identical to the length of "changes" in the request.
repeated SchemaDefinition before_schemas = 1;
// after_schemas holds the schema after each change.
// The number of elements is identical to the length of "changes" in the request.
repeated SchemaDefinition after_schemas = 2;
}
message ApplySchemaRequest {

Различия файлов скрыты, потому что одна или несколько строк слишком длинны