Skip to content

Commit 8b76415

Browse files
dveedenlance6716
andauthored
replication,cmd: improve flavor handling (#946)
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". Co-authored-by: lance6716 <[email protected]>
1 parent b1f4fb3 commit 8b76415

File tree

5 files changed

+70
-0
lines changed

5 files changed

+70
-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
@@ -50,6 +50,12 @@ func main() {
5050
MaxReconnectAttempts: 10,
5151
}
5252

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

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

mysql/mysql_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,26 @@ 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", true},
350+
{"msql", false},
351+
{"mArIAdb", true},
352+
}
353+
354+
for _, f := range tbls {
355+
err := ValidateFlavor(f.flavor)
356+
if f.valid == true {
357+
require.NoError(t, err)
358+
} else {
359+
require.Error(t, err)
360+
}
361+
}
362+
}

mysql/validate.go

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

replication/binlogsyncer.go

+17
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,18 @@ 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+
// Setting the flavor to `mysql` causes MariaDB to try and behave
433+
// in a MySQL compatible way. In this mode MariaDB won't use
434+
// MariaDB specific binlog event types, but may used dummy events instead.
435+
b.cfg.Logger.Errorf("misconfigured flavor (%s) for server %s",
436+
b.cfg.Flavor, serverVersion)
437+
}
438+
}
439+
427440
// StartSync starts syncing from the `pos` position.
428441
func (b *BinlogSyncer) StartSync(pos Position) (*BinlogStreamer, error) {
429442
b.cfg.Logger.Infof("begin to sync binlog from position %s", pos)
@@ -439,6 +452,8 @@ func (b *BinlogSyncer) StartSync(pos Position) (*BinlogStreamer, error) {
439452
return nil, errors.Trace(err)
440453
}
441454

455+
b.checkFlavor()
456+
442457
return b.startDumpStream(), nil
443458
}
444459

@@ -477,6 +492,8 @@ func (b *BinlogSyncer) StartSyncGTID(gset GTIDSet) (*BinlogStreamer, error) {
477492
return nil, err
478493
}
479494

495+
b.checkFlavor()
496+
480497
return b.startDumpStream(), nil
481498
}
482499

0 commit comments

Comments
 (0)