Skip to content

Commit 641d0b6

Browse files
committed
replication,cmd: improve flavor handling
For `go-mysqlbinlog` and `go-canal`: return an error for invalid flavors. For `go-mysqlbinlog`: log a non-critical error if the server version has "MariaDB" in it but the flavor isn't set to "mariadb".
1 parent 867d4cc commit 641d0b6

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

cmd/go-canal/main.go

+7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/go-mysql-org/go-mysql/canal"
1515
"github.com/go-mysql-org/go-mysql/mysql"
16+
"github.com/pingcap/errors"
1617
)
1718

1819
var (
@@ -41,6 +42,12 @@ var (
4142
func main() {
4243
flag.Parse()
4344

45+
err := mysql.ValidateFlavor(*flavor)
46+
if err != nil {
47+
fmt.Printf("Flavor error: %v\n", errors.ErrorStack(err))
48+
return
49+
}
50+
4451
cfg := canal.NewDefaultConfig()
4552
cfg.Addr = net.JoinHostPort(*host, strconv.Itoa(*port))
4653
cfg.User = *user

cmd/go-mysqlbinlog/main.go

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ func main() {
4949
UseDecimal: true,
5050
}
5151

52+
err := mysql.ValidateFlavor(*flavor)
53+
if err != nil {
54+
fmt.Printf("Flavor error: %v\n", errors.ErrorStack(err))
55+
return
56+
}
57+
5258
b := replication.NewBinlogSyncer(cfg)
5359

5460
pos := mysql.Position{Name: *file, Pos: uint32(*pos)}

mysql/mysql_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,25 @@ func mysqlGTIDfromString(t *testing.T, gtidStr string) MysqlGTIDSet {
337337

338338
return *gtid.(*MysqlGTIDSet)
339339
}
340+
341+
func TestValidateFlavor(t *testing.T) {
342+
tbls := []struct {
343+
flavor string
344+
valid bool
345+
}{
346+
{"mysql", true},
347+
{"mariadb", true},
348+
{"maria", false},
349+
{"MariaDB", false},
350+
{"msql", false},
351+
}
352+
353+
for _, f := range tbls {
354+
err := ValidateFlavor(f.flavor)
355+
if f.valid == true {
356+
require.NoError(t, err)
357+
} else {
358+
require.Error(t, err)
359+
}
360+
}
361+
}

mysql/validate.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package mysql
2+
3+
import "fmt"
4+
5+
func ValidateFlavor(flavor string) error {
6+
switch flavor {
7+
case MySQLFlavor:
8+
return nil
9+
case MariaDBFlavor:
10+
return nil
11+
default:
12+
return fmt.Errorf("%s is not a valid flavor", flavor)
13+
}
14+
}

replication/binlogsyncer.go

+14
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net"
99
"os"
1010
"strconv"
11+
"strings"
1112
"sync"
1213
"time"
1314

@@ -424,6 +425,15 @@ func (b *BinlogSyncer) GetNextPosition() Position {
424425
return b.nextPos
425426
}
426427

428+
func (b *BinlogSyncer) checkFlavor() {
429+
serverVersion := b.c.GetServerVersion()
430+
if b.cfg.Flavor != MariaDBFlavor &&
431+
strings.Contains(b.c.GetServerVersion(), "MariaDB") {
432+
b.cfg.Logger.Errorf("misconfigured flavor (%s) for server %s",
433+
b.cfg.Flavor, serverVersion)
434+
}
435+
}
436+
427437
// StartSync starts syncing from the `pos` position.
428438
func (b *BinlogSyncer) StartSync(pos Position) (*BinlogStreamer, error) {
429439
b.cfg.Logger.Infof("begin to sync binlog from position %s", pos)
@@ -439,6 +449,8 @@ func (b *BinlogSyncer) StartSync(pos Position) (*BinlogStreamer, error) {
439449
return nil, errors.Trace(err)
440450
}
441451

452+
b.checkFlavor()
453+
442454
return b.startDumpStream(), nil
443455
}
444456

@@ -477,6 +489,8 @@ func (b *BinlogSyncer) StartSyncGTID(gset GTIDSet) (*BinlogStreamer, error) {
477489
return nil, err
478490
}
479491

492+
b.checkFlavor()
493+
480494
return b.startDumpStream(), nil
481495
}
482496

0 commit comments

Comments
 (0)