Skip to content

Commit

Permalink
raft: set rpl_semi_sync_master_wait_for_slave_count to quorum-1
Browse files Browse the repository at this point in the history
  • Loading branch information
lunsir authored and Toknowledge committed Aug 16, 2018
1 parent 4099c40 commit fd8a8e7
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/mysql/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,15 @@ func (m *Mysql) EnableSemiSyncMaster() error {
return m.replHandler.EnableSemiSyncMaster(db)
}

// SetSemiWaitSlaveCount used to set rpl_semi_sync_master_wait_for_slave_count
func (m *Mysql) SetSemiWaitSlaveCount(count int) error {
db, err := m.getDB()
if err != nil {
return err
}
return m.replHandler.SetSemiWaitSlaveCount(db, count)
}

// DisableSemiSyncMaster used to disable the semi-sync from master.
func (m *Mysql) DisableSemiSyncMaster() error {
db, err := m.getDB()
Expand Down
13 changes: 13 additions & 0 deletions src/mysql/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type MockGTID struct {
EnableSemiSyncMasterFn func(*sql.DB) error
DisableSemiSyncMasterFn func(*sql.DB) error
SelectSysVarFn func(*sql.DB, string) (string, error)
SetSemiWaitSlaveCountFn func(*sql.DB, int) error
}

// DefaultGetSlaveGTID returns the default slave gtid.
Expand Down Expand Up @@ -225,6 +226,16 @@ func (mogtid *MockGTID) SelectSysVar(db *sql.DB, query string) (string, error) {
return mogtid.SelectSysVarFn(db, query)
}

// DefaultSetSemiWaitSlaveCount mock.
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)
}

func defaultMockGTID() *MockGTID {
mock := &MockGTID{}
mock.PingFn = DefaultPing
Expand All @@ -245,6 +256,8 @@ func defaultMockGTID() *MockGTID {
mock.EnableSemiSyncMasterFn = DefaultEnableSemiSyncMaster
mock.DisableSemiSyncMasterFn = DefaultDisableSemiSyncMaster
mock.SelectSysVarFn = DefaultSelectSysVar
mock.SetSemiWaitSlaveCountFn = DefaultSetSemiWaitSlaveCount

return mock
}

Expand Down
6 changes: 6 additions & 0 deletions src/mysql/mysql57.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,12 @@ func (my *Mysql57) EnableSemiSyncMaster(db *sql.DB) error {
return ExecuteWithTimeout(db, reqTimeout, cmds)
}

//SetSemiWaitSlaveCount used set rpl_semi_sync_master_wait_for_slave_count
func (my *Mysql57) SetSemiWaitSlaveCount(db *sql.DB, count int) error {
cmds := fmt.Sprintf("SET GLOBAL rpl_semi_sync_master_wait_for_slave_count = %d", count)
return ExecuteWithTimeout(db, reqTimeout, cmds)
}

// DisableSemiSyncMaster used to disable the semi-sync from master.
func (my *Mysql57) DisableSemiSyncMaster(db *sql.DB) error {
cmds := "SET GLOBAL rpl_semi_sync_master_enabled=OFF"
Expand Down
3 changes: 3 additions & 0 deletions src/mysql/repl_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,7 @@ type ReplHandler interface {

// disable master semi sync: don't wait slave ack
DisableSemiSyncMaster(db *sql.DB) error

//set rpl_semi_master_wait_for_slave_count
SetSemiWaitSlaveCount(db *sql.DB, count int) error
}
3 changes: 3 additions & 0 deletions src/raft/leader.go
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,9 @@ func (r *Leader) checkSemiSync() {
if err := r.mysql.EnableSemiSyncMaster(); err != nil {
r.ERROR("mysql.enable.semi-sync.error[%v]", err)
}
if err := r.mysql.SetSemiWaitSlaveCount((cur - 1) / 2); err != nil {
r.ERROR("mysql.set.semi.wait.slave.count.error[%v]", err)
}
}
}

Expand Down

0 comments on commit fd8a8e7

Please sign in to comment.