Skip to content

Commit 71df3e8

Browse files
committed
feat: add an optimizer switch params to migration context
to be able to pass for example: `--optimizer-switch="prefer_ordering_index=on"`
1 parent 7320fda commit 71df3e8

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

go/base/context.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ type MigrationContext struct {
209209
CutOverCompleteFlag int64
210210
InCutOverCriticalSectionFlag int64
211211
PanicAbort chan error
212+
OptimizerSwitch string
212213

213214
OriginalTableColumnsOnApplier *sql.ColumnList
214215
OriginalTableColumns *sql.ColumnList

go/cmd/gh-ost/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ func main() {
139139
criticalLoad := flag.String("critical-load", "", "Comma delimited status-name=threshold, same format as --max-load. When status exceeds threshold, app panics and quits")
140140
flag.Int64Var(&migrationContext.CriticalLoadIntervalMilliseconds, "critical-load-interval-millis", 0, "When 0, migration immediately bails out upon meeting critical-load. When non-zero, a second check is done after given interval, and migration only bails out if 2nd check still meets critical load")
141141
flag.Int64Var(&migrationContext.CriticalLoadHibernateSeconds, "critical-load-hibernate-seconds", 0, "When non-zero, critical-load does not panic and bail out; instead, gh-ost goes into hibernation for the specified duration. It will not read/write anything from/to any server")
142+
flag.StringVar(&migrationContext.OptimizerSwitch, "optimizer-switch", "", "Optimizer switch params, eg: prefer_ordering_index=on")
142143
quiet := flag.Bool("quiet", false, "quiet")
143144
verbose := flag.Bool("verbose", false, "verbose")
144145
debug := flag.Bool("debug", false, "debug mode (very verbose)")

go/logic/applier.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ func newDmlBuildResultError(err error) *dmlBuildResult {
4949
}
5050
}
5151

52+
func (this *Applier) setOptimizer(tx *gosql.Tx) error {
53+
if this.migrationContext.OptimizerSwitch == "" {
54+
return nil
55+
}
56+
optimizerString := fmt.Sprintf("set session optimizer_switch=%q", this.migrationContext.OptimizerSwitch)
57+
_, err := tx.Query(optimizerString)
58+
return err
59+
}
60+
5261
// Applier connects and writes the applier-server, which is the server where migration
5362
// happens. This is typically the master, but could be a replica when `--test-on-replica` or
5463
// `--execute-on-replica` are given.
@@ -477,6 +486,11 @@ func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *sql.UniqueK
477486
return err
478487
}
479488

489+
err = this.setOptimizer(tx)
490+
if err != nil {
491+
return err
492+
}
493+
480494
rows, err := tx.Query(query)
481495
if err != nil {
482496
return err
@@ -502,6 +516,11 @@ func (this *Applier) readMigrationMaxValues(tx *gosql.Tx, uniqueKey *sql.UniqueK
502516
return err
503517
}
504518

519+
err = this.setOptimizer(tx)
520+
if err != nil {
521+
return err
522+
}
523+
505524
rows, err := tx.Query(query)
506525
if err != nil {
507526
return err

0 commit comments

Comments
 (0)