From 3922116b61cd85f8d2b16624f716a05966b53d34 Mon Sep 17 00:00:00 2001 From: tai Date: Thu, 27 Dec 2018 11:59:35 +0800 Subject: [PATCH] Feature 2-node xenon turn on semisync(#44) --- src/mysql/api.go | 9 +++++++ src/mysql/mock.go | 51 ++++++++++++++++++++++++--------------- src/mysql/mysql57.go | 6 +++++ src/mysql/mysql57_test.go | 14 +++++++++++ src/mysql/repl_handler.go | 3 +++ src/raft/leader.go | 4 +-- 6 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/mysql/api.go b/src/mysql/api.go index 5260f2d..b61455a 100644 --- a/src/mysql/api.go +++ b/src/mysql/api.go @@ -355,6 +355,15 @@ func (m *Mysql) DisableSemiSyncMaster() error { return m.replHandler.DisableSemiSyncMaster(db) } +// SetSemiSyncMasterDefault useed to set semi-sync master timeout = default. +func (m *Mysql) SetSemiSyncMasterDefault() error { + db, err := m.getDB() + if err != nil { + return err + } + return m.replHandler.SetSemiSyncMasterDefault(db) +} + // CheckUserExists used to check the user exists or not. func (m *Mysql) CheckUserExists(user string) (bool, error) { db, err := m.getDB() diff --git a/src/mysql/mock.go b/src/mysql/mock.go index d1fc4a2..c4056d0 100644 --- a/src/mysql/mock.go +++ b/src/mysql/mock.go @@ -23,25 +23,26 @@ import ( // MockGTID tuple. type MockGTID struct { - PingFn func(*sql.DB) (*PingEntry, error) - SetReadOnlyFn func(*sql.DB, bool) error - GetMasterGTIDFn func(*sql.DB) (*model.GTID, error) - GetSlaveGTIDFn func(*sql.DB) (*model.GTID, error) - StartSlaveIOThreadFn func(*sql.DB) error - StopSlaveIOThreadFn func(*sql.DB) error - StartSlaveFn func(*sql.DB) error - StopSlaveFn func(*sql.DB) error - ChangeMasterToFn func(*sql.DB, *model.Repl) error - ChangeToMasterFn func(*sql.DB) error - WaitUntilAfterGTIDFn func(*sql.DB, string) error - SetGlobalSysVarFn func(*sql.DB, string) error - ResetMasterFn func(*sql.DB) error - ResetSlaveAllFn func(*sql.DB) error - PurgeBinlogsToFn func(*sql.DB, string) error - EnableSemiSyncMasterFn func(*sql.DB) error - DisableSemiSyncMasterFn func(*sql.DB) error - SelectSysVarFn func(*sql.DB, string) (string, error) - SetSemiWaitSlaveCountFn func(*sql.DB, int) error + PingFn func(*sql.DB) (*PingEntry, error) + SetReadOnlyFn func(*sql.DB, bool) error + GetMasterGTIDFn func(*sql.DB) (*model.GTID, error) + GetSlaveGTIDFn func(*sql.DB) (*model.GTID, error) + StartSlaveIOThreadFn func(*sql.DB) error + StopSlaveIOThreadFn func(*sql.DB) error + StartSlaveFn func(*sql.DB) error + StopSlaveFn func(*sql.DB) error + ChangeMasterToFn func(*sql.DB, *model.Repl) error + ChangeToMasterFn func(*sql.DB) error + WaitUntilAfterGTIDFn func(*sql.DB, string) error + SetGlobalSysVarFn func(*sql.DB, string) error + ResetMasterFn func(*sql.DB) error + ResetSlaveAllFn func(*sql.DB) error + PurgeBinlogsToFn func(*sql.DB, string) error + EnableSemiSyncMasterFn func(*sql.DB) error + DisableSemiSyncMasterFn func(*sql.DB) error + SelectSysVarFn func(*sql.DB, string) (string, error) + SetSemiWaitSlaveCountFn func(*sql.DB, int) error + SetSemiSyncMasterDefaultFn func(*sql.DB) error } // DefaultGetSlaveGTID returns the default slave gtid. @@ -216,6 +217,11 @@ func (mogtid *MockGTID) DisableSemiSyncMaster(db *sql.DB) error { return mogtid.DisableSemiSyncMasterFn(db) } +// SetSemiSyncMasterDefault mock. +func (mogtid *MockGTID) SetSemiSyncMasterDefault(db *sql.DB) error { + return mogtid.SetSemiSyncMasterDefaultFn(db) +} + // DefaultSelectSysVar mock. func DefaultSelectSysVar(db *sql.DB, query string) (string, error) { return "", nil @@ -231,11 +237,17 @@ func DefaultSetSemiWaitSlaveCount(db *sql.DB, count int) error { return nil } + // SetSemiWaitSlaveCount mock func (mogtid *MockGTID) SetSemiWaitSlaveCount(db *sql.DB, count int) error { return mogtid.SetSemiWaitSlaveCountFn(db, count) } +// SetSemiSyncMasterDefault mock +func SetSemiSyncMasterDefault(db *sql.DB) error { + return nil +} + func defaultMockGTID() *MockGTID { mock := &MockGTID{} mock.PingFn = DefaultPing @@ -257,6 +269,7 @@ func defaultMockGTID() *MockGTID { mock.DisableSemiSyncMasterFn = DefaultDisableSemiSyncMaster mock.SelectSysVarFn = DefaultSelectSysVar mock.SetSemiWaitSlaveCountFn = DefaultSetSemiWaitSlaveCount + mock.SetSemiSyncMasterDefaultFn = SetSemiSyncMasterDefault return mock } diff --git a/src/mysql/mysql57.go b/src/mysql/mysql57.go index 9659f43..59abf7b 100644 --- a/src/mysql/mysql57.go +++ b/src/mysql/mysql57.go @@ -219,3 +219,9 @@ func (my *Mysql57) DisableSemiSyncMaster(db *sql.DB) error { cmds := "SET GLOBAL rpl_semi_sync_master_enabled=OFF" return ExecuteWithTimeout(db, reqTimeout, cmds) } + +// SetSemiSyncMasterDefault useed to set semi-sync master timeout = default +func (my *Mysql57) SetSemiSyncMasterDefault(db *sql.DB) error { + cmds := "SET GLOBAL rpl_semi_sync_master_timeout=default" + return ExecuteWithTimeout(db, reqTimeout, cmds) +} \ No newline at end of file diff --git a/src/mysql/mysql57_test.go b/src/mysql/mysql57_test.go index af9c8d1..4ec113e 100644 --- a/src/mysql/mysql57_test.go +++ b/src/mysql/mysql57_test.go @@ -329,3 +329,17 @@ func TestMysql57SemiMaster(t *testing.T) { err = mysql57.DisableSemiSyncMaster(db) assert.Nil(t, err) } + +func TestMysql57SemiMasterDefault(t *testing.T) { + db, mock, err := sqlmock.New() + assert.Nil(t, err) + defer db.Close() + + queryList := []string{ + "SET GLOBAL rpl_semi_sync_master_timeout=default", + } + + mock.ExpectExec(queryList[0]).WillReturnResult(sqlmock.NewResult(1, 1)) + err = mysql57.SetSemiSyncMasterDefault(db) + assert.Nil(t, err) +} diff --git a/src/mysql/repl_handler.go b/src/mysql/repl_handler.go index c80420a..a7cf04a 100644 --- a/src/mysql/repl_handler.go +++ b/src/mysql/repl_handler.go @@ -66,6 +66,9 @@ type ReplHandler interface { // disable master semi sync: don't wait slave ack DisableSemiSyncMaster(db *sql.DB) error + // set semi-sync master-timeout = default + SetSemiSyncMasterDefault(db *sql.DB) error + //set rpl_semi_master_wait_for_slave_count SetSemiWaitSlaveCount(db *sql.DB, count int) error } diff --git a/src/raft/leader.go b/src/raft/leader.go index dba19fb..e2c1570 100644 --- a/src/raft/leader.go +++ b/src/raft/leader.go @@ -452,8 +452,8 @@ func (r *Leader) checkSemiSync() { min := 3 cur := r.getMembers() if cur < min { - if err := r.mysql.DisableSemiSyncMaster(); err != nil { - r.ERROR("mysql.disable.semi-sync.error[%v]", err) + if err := r.mysql.SetSemiSyncMasterDefault(); err != nil { + r.ERROR("mysql.set.semi-sync.master.timeout.error[%v]", err) } } else { if err := r.mysql.EnableSemiSyncMaster(); err != nil {