diff --git a/go/vt/vtorc/inst/binlog.go b/go/vt/vtorc/inst/binlog.go index 558dfa6b64e..b4abf34ac7e 100644 --- a/go/vt/vtorc/inst/binlog.go +++ b/go/vt/vtorc/inst/binlog.go @@ -44,7 +44,8 @@ type BinlogCoordinates struct { Type BinlogType } -// ParseInstanceKey will parse an InstanceKey from a string representation such as 127.0.0.1:3306 +// ParseBinlogCoordinates will parse a string representation such as "mysql-bin.000001:12345" +// into a BinlogCoordinates struct. func ParseBinlogCoordinates(logFileLogPos string) (*BinlogCoordinates, error) { tokens := strings.SplitN(logFileLogPos, ":", 2) if len(tokens) != 2 { diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index 51dceeeaa3d..72bb8e39281 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -281,8 +281,7 @@ func ReadTopologyInstanceBufferable(tabletAlias string, latency *stopwatch.Named errorChan <- err instance.IsDetached, _ = instance.ExecBinlogCoordinates.ExtractDetachedCoordinates() - tbp, err := ParseBinlogCoordinates(fs.ReplicationStatus.RelayLogFilePosition) - binlogPos = *tbp + binlogPos, err = getBinlogCoordinatesFromString(fs.ReplicationStatus.FilePosition) instance.RelaylogCoordinates = binlogPos instance.RelaylogCoordinates.Type = RelayLog errorChan <- err @@ -451,6 +450,21 @@ func getKeyspaceShardName(keyspace, shard string) string { return fmt.Sprintf("%v:%v", keyspace, shard) } +// getBinlogCoordinatesFromString is a bridge function to support upgrades and +// downgrades when a given string may be in one of two formats depending on +// the component versions: +// 1. GTID position, e.g. FilePos/relay-bin.000001:12345 +// 2. A simple binlog file position, e.g. relay-bin.000001:12345 +func getBinlogCoordinatesFromString(s string) (BinlogCoordinates, error) { + if strings.Contains(s, "/") { + // We have a GTID position which includes the flavor. + return getBinlogCoordinatesFromPositionString(s) + } + // We have a simple binlog file position. + binLogCoordinates, err := ParseBinlogCoordinates(s) + return *binLogCoordinates, err +} + func getBinlogCoordinatesFromPositionString(position string) (BinlogCoordinates, error) { pos, err := replication.DecodePosition(position) if err != nil || pos.GTIDSet == nil {