Skip to content

Commit 2463162

Browse files
Merge branch 'master' of https://github.com/github/gh-ost into arthur/tweak-testcontainers
2 parents b888b2d + a834c00 commit 2463162

File tree

5 files changed

+256
-98
lines changed

5 files changed

+256
-98
lines changed

go/logic/applier.go

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ type Applier struct {
6060
migrationContext *base.MigrationContext
6161
finishedMigrating int64
6262
name string
63+
64+
dmlDeleteQueryBuilder *sql.DMLDeleteQueryBuilder
65+
dmlInsertQueryBuilder *sql.DMLInsertQueryBuilder
66+
dmlUpdateQueryBuilder *sql.DMLUpdateQueryBuilder
6367
}
6468

6569
func NewApplier(migrationContext *base.MigrationContext) *Applier {
@@ -106,6 +110,37 @@ func (this *Applier) InitDBConnections() (err error) {
106110
return nil
107111
}
108112

113+
func (this *Applier) prepareQueries() (err error) {
114+
if this.dmlDeleteQueryBuilder, err = sql.NewDMLDeleteQueryBuilder(
115+
this.migrationContext.DatabaseName,
116+
this.migrationContext.GetGhostTableName(),
117+
this.migrationContext.OriginalTableColumns,
118+
&this.migrationContext.UniqueKey.Columns,
119+
); err != nil {
120+
return err
121+
}
122+
if this.dmlInsertQueryBuilder, err = sql.NewDMLInsertQueryBuilder(
123+
this.migrationContext.DatabaseName,
124+
this.migrationContext.GetGhostTableName(),
125+
this.migrationContext.OriginalTableColumns,
126+
this.migrationContext.SharedColumns,
127+
this.migrationContext.MappedSharedColumns,
128+
); err != nil {
129+
return err
130+
}
131+
if this.dmlUpdateQueryBuilder, err = sql.NewDMLUpdateQueryBuilder(
132+
this.migrationContext.DatabaseName,
133+
this.migrationContext.GetGhostTableName(),
134+
this.migrationContext.OriginalTableColumns,
135+
this.migrationContext.SharedColumns,
136+
this.migrationContext.MappedSharedColumns,
137+
&this.migrationContext.UniqueKey.Columns,
138+
); err != nil {
139+
return err
140+
}
141+
return nil
142+
}
143+
109144
// validateAndReadGlobalVariables potentially reads server global variables, such as the time_zone and wait_timeout.
110145
func (this *Applier) validateAndReadGlobalVariables() error {
111146
query := `select /* gh-ost */ @@global.time_zone, @@global.wait_timeout`
@@ -631,6 +666,8 @@ func (this *Applier) ApplyIterationInsertQuery() (chunkSize int64, rowsAffected
631666
this.migrationContext.MigrationIterationRangeMaxValues.AbstractValues(),
632667
this.migrationContext.GetIteration() == 0,
633668
this.migrationContext.IsTransactionalTable(),
669+
// TODO: Don't hardcode this
670+
strings.HasPrefix(this.migrationContext.ApplierMySQLVersion, "8."),
634671
)
635672
if err != nil {
636673
return chunkSize, rowsAffected, duration, err
@@ -1135,35 +1172,36 @@ func (this *Applier) updateModifiesUniqueKeyColumns(dmlEvent *binlog.BinlogDMLEv
11351172

11361173
// buildDMLEventQuery creates a query to operate on the ghost table, based on an intercepted binlog
11371174
// event entry on the original table.
1138-
func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEvent) (results [](*dmlBuildResult)) {
1175+
func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEvent) []*dmlBuildResult {
11391176
switch dmlEvent.DML {
11401177
case binlog.DeleteDML:
11411178
{
1142-
query, uniqueKeyArgs, err := sql.BuildDMLDeleteQuery(dmlEvent.DatabaseName, this.migrationContext.GetGhostTableName(), this.migrationContext.OriginalTableColumns, &this.migrationContext.UniqueKey.Columns, dmlEvent.WhereColumnValues.AbstractValues())
1143-
return append(results, newDmlBuildResult(query, uniqueKeyArgs, -1, err))
1179+
query, uniqueKeyArgs, err := this.dmlDeleteQueryBuilder.BuildQuery(dmlEvent.WhereColumnValues.AbstractValues())
1180+
return []*dmlBuildResult{newDmlBuildResult(query, uniqueKeyArgs, -1, err)}
11441181
}
11451182
case binlog.InsertDML:
11461183
{
1147-
query, sharedArgs, err := sql.BuildDMLInsertQuery(dmlEvent.DatabaseName, this.migrationContext.GetGhostTableName(), this.migrationContext.OriginalTableColumns, this.migrationContext.SharedColumns, this.migrationContext.MappedSharedColumns, dmlEvent.NewColumnValues.AbstractValues())
1148-
return append(results, newDmlBuildResult(query, sharedArgs, 1, err))
1184+
query, sharedArgs, err := this.dmlInsertQueryBuilder.BuildQuery(dmlEvent.NewColumnValues.AbstractValues())
1185+
return []*dmlBuildResult{newDmlBuildResult(query, sharedArgs, 1, err)}
11491186
}
11501187
case binlog.UpdateDML:
11511188
{
11521189
if _, isModified := this.updateModifiesUniqueKeyColumns(dmlEvent); isModified {
1190+
results := make([]*dmlBuildResult, 0, 2)
11531191
dmlEvent.DML = binlog.DeleteDML
11541192
results = append(results, this.buildDMLEventQuery(dmlEvent)...)
11551193
dmlEvent.DML = binlog.InsertDML
11561194
results = append(results, this.buildDMLEventQuery(dmlEvent)...)
11571195
return results
11581196
}
1159-
query, sharedArgs, uniqueKeyArgs, err := sql.BuildDMLUpdateQuery(dmlEvent.DatabaseName, this.migrationContext.GetGhostTableName(), this.migrationContext.OriginalTableColumns, this.migrationContext.SharedColumns, this.migrationContext.MappedSharedColumns, &this.migrationContext.UniqueKey.Columns, dmlEvent.NewColumnValues.AbstractValues(), dmlEvent.WhereColumnValues.AbstractValues())
1197+
query, sharedArgs, uniqueKeyArgs, err := this.dmlUpdateQueryBuilder.BuildQuery(dmlEvent.NewColumnValues.AbstractValues(), dmlEvent.WhereColumnValues.AbstractValues())
11601198
args := sqlutils.Args()
11611199
args = append(args, sharedArgs...)
11621200
args = append(args, uniqueKeyArgs...)
1163-
return append(results, newDmlBuildResult(query, args, 0, err))
1201+
return []*dmlBuildResult{newDmlBuildResult(query, args, 0, err)}
11641202
}
11651203
}
1166-
return append(results, newDmlBuildResultError(fmt.Errorf("Unknown dml event type: %+v", dmlEvent.DML)))
1204+
return []*dmlBuildResult{newDmlBuildResultError(fmt.Errorf("Unknown dml event type: %+v", dmlEvent.DML))}
11671205
}
11681206

11691207
// ApplyDMLEventQueries applies multiple DML queries onto the _ghost_ table

go/logic/applier_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ func TestApplierBuildDMLEventQuery(t *testing.T) {
9999
columnValues := sql.ToColumnValues([]interface{}{123456, 42})
100100

101101
migrationContext := base.NewMigrationContext()
102+
migrationContext.DatabaseName = "test"
102103
migrationContext.OriginalTableName = "test"
103104
migrationContext.OriginalTableColumns = columns
104105
migrationContext.SharedColumns = columns
@@ -109,6 +110,7 @@ func TestApplierBuildDMLEventQuery(t *testing.T) {
109110
}
110111

111112
applier := NewApplier(migrationContext)
113+
applier.prepareQueries()
112114

113115
t.Run("delete", func(t *testing.T) {
114116
binlogEvent := &binlog.BinlogDMLEvent{
@@ -302,8 +304,13 @@ func (suite *ApplierTestSuite) TestApplyDMLEventQueries() {
302304
migrationContext.OriginalTableColumns = sql.NewColumnList([]string{"id", "item_id"})
303305
migrationContext.SharedColumns = sql.NewColumnList([]string{"id", "item_id"})
304306
migrationContext.MappedSharedColumns = sql.NewColumnList([]string{"id", "item_id"})
307+
migrationContext.UniqueKey = &sql.UniqueKey{
308+
Name: "primary_key",
309+
Columns: *sql.NewColumnList([]string{"id"}),
310+
}
305311

306312
applier := NewApplier(migrationContext)
313+
suite.Require().NoError(applier.prepareQueries())
307314
defer applier.Teardown()
308315

309316
err = applier.InitDBConnections()

go/logic/migrator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,10 @@ func (this *Migrator) Migrate() (err error) {
386386
if err := this.inspector.inspectOriginalAndGhostTables(); err != nil {
387387
return err
388388
}
389+
// We can prepare some of the queries on the applier
390+
if err := this.applier.prepareQueries(); err != nil {
391+
return err
392+
}
389393
// Validation complete! We're good to execute this migration
390394
if err := this.hooksExecutor.onValidated(); err != nil {
391395
return err

0 commit comments

Comments
 (0)