From 0a033c76c10fe0e3fbd3993385f4280f34182d6e Mon Sep 17 00:00:00 2001 From: Shao Hou Kun Date: Fri, 26 May 2023 04:45:53 +0800 Subject: [PATCH] feat(feat-set-binlogsyncer-maxreconnectattempts): feat-set-binlogsyncer-maxreconnectattempts (#1279) Co-authored-by: shaohoukun --- doc/command-line-flags.md | 3 +++ go/base/context.go | 2 ++ go/binlog/gomysql_reader.go | 17 +++++++++-------- go/cmd/gh-ost/main.go | 1 + 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/doc/command-line-flags.md b/doc/command-line-flags.md index 021462fa2..ac491b268 100644 --- a/doc/command-line-flags.md +++ b/doc/command-line-flags.md @@ -61,6 +61,9 @@ It is not reliable to parse the `ALTER` statement to determine if it is instant `gh-ost` will automatically fallback to the normal DDL process if the attempt to use instant DDL is unsuccessful. +### binlogsyncer-max-reconnect-attempts +`--binlogsyncer-max-reconnect-attempts=0`, the maximum number of attempts to re-establish a broken inspector connection for sync binlog. `0` or `negative number` means infinite retry, default `0` + ### conf `--conf=/path/to/my.cnf`: file where credentials are specified. Should be in (or contain) the following format: diff --git a/go/base/context.go b/go/base/context.go index e3472f5bd..63b6d6da7 100644 --- a/go/base/context.go +++ b/go/base/context.go @@ -232,6 +232,8 @@ type MigrationContext struct { recentBinlogCoordinates mysql.BinlogCoordinates + BinlogSyncerMaxReconnectAttempts int + Log Logger } diff --git a/go/binlog/gomysql_reader.go b/go/binlog/gomysql_reader.go index 6b7d06cc1..8cf35eabe 100644 --- a/go/binlog/gomysql_reader.go +++ b/go/binlog/gomysql_reader.go @@ -36,14 +36,15 @@ func NewGoMySQLReader(migrationContext *base.MigrationContext) *GoMySQLReader { currentCoordinates: mysql.BinlogCoordinates{}, currentCoordinatesMutex: &sync.Mutex{}, binlogSyncer: replication.NewBinlogSyncer(replication.BinlogSyncerConfig{ - ServerID: uint32(migrationContext.ReplicaServerId), - Flavor: gomysql.MySQLFlavor, - Host: connectionConfig.Key.Hostname, - Port: uint16(connectionConfig.Key.Port), - User: connectionConfig.User, - Password: connectionConfig.Password, - TLSConfig: connectionConfig.TLSConfig(), - UseDecimal: true, + ServerID: uint32(migrationContext.ReplicaServerId), + Flavor: gomysql.MySQLFlavor, + Host: connectionConfig.Key.Hostname, + Port: uint16(connectionConfig.Key.Port), + User: connectionConfig.User, + Password: connectionConfig.Password, + TLSConfig: connectionConfig.TLSConfig(), + UseDecimal: true, + MaxReconnectAttempts: migrationContext.BinlogSyncerMaxReconnectAttempts, }), } } diff --git a/go/cmd/gh-ost/main.go b/go/cmd/gh-ost/main.go index 3daf24441..926223293 100644 --- a/go/cmd/gh-ost/main.go +++ b/go/cmd/gh-ost/main.go @@ -134,6 +134,7 @@ func main() { flag.Int64Var(&migrationContext.HooksStatusIntervalSec, "hooks-status-interval", 60, "how many seconds to wait between calling onStatus hook") flag.UintVar(&migrationContext.ReplicaServerId, "replica-server-id", 99999, "server id used by gh-ost process. Default: 99999") + flag.IntVar(&migrationContext.BinlogSyncerMaxReconnectAttempts, "binlogsyncer-max-reconnect-attempts", 0, "when master node fails, the maximum number of binlog synchronization attempts to reconnect. 0 is unlimited") maxLoad := flag.String("max-load", "", "Comma delimited status-name=threshold. e.g: 'Threads_running=100,Threads_connected=500'. When status exceeds threshold, app throttles writes") criticalLoad := flag.String("critical-load", "", "Comma delimited status-name=threshold, same format as --max-load. When status exceeds threshold, app panics and quits")