diff --git a/src/mysql/api.go b/src/mysql/api.go index 3f1753e..eecebc8 100644 --- a/src/mysql/api.go +++ b/src/mysql/api.go @@ -19,14 +19,29 @@ import ( "github.com/pkg/errors" ) -// PingStart used to start the ping. -func (m *Mysql) PingStart() { +// HealthCheckStart used to check mysql status. +// 1. Check if mysql alived or not +// 2. Check the repl accout exists or not, it may be deleted unexpectly. +func (m *Mysql) HealthCheckStart() { go func() { for range m.pingTicker.C { m.Ping() + + exists, err := m.CheckUserExists(m.conf.ReplUser, "%") + if err != nil { + m.log.Error("server.mysql.check.repl.user.accout.error[%+v]", err) + } + if !exists { + m.log.Info("server.mysql.prepare.to.create.replication.user[%v]", m.conf.ReplUser) + if err = m.CreateReplUserWithoutBinlog( + m.conf.ReplUser, + m.conf.ReplPasswd); err != nil { + m.log.Error("server.mysql.create.replication.user[%v].error[%+v]", m.conf.ReplUser, err) + } + } } }() - m.log.Info("mysql[%v].startping...", m.getConnStr()) + m.log.Info("mysql[%v].health.check.start...", m.getConnStr()) } // PingStop used to stop the ping. diff --git a/src/mysql/api_test.go b/src/mysql/api_test.go index 96cfb35..360360d 100644 --- a/src/mysql/api_test.go +++ b/src/mysql/api_test.go @@ -793,7 +793,7 @@ func TestWaitMysqlWorks(t *testing.T) { conf := config.DefaultMysqlConfig() mysql := NewMysql(conf, 10000, log) mysql.db = db - mysql.PingStart() + mysql.HealthCheckStart() defer mysql.PingStop() // works @@ -825,7 +825,7 @@ func TestWaitMysqlWorks(t *testing.T) { conf := config.DefaultMysqlConfig() mysql := NewMysql(conf, 10000, log) mysql.db = db - mysql.PingStart() + mysql.HealthCheckStart() defer mysql.PingStop() query := "SHOW SLAVE STATUS" diff --git a/src/mysql/mock.go b/src/mysql/mock.go index 8a230dc..f4233ba 100644 --- a/src/mysql/mock.go +++ b/src/mysql/mock.go @@ -1096,8 +1096,8 @@ func MockMysql(log *xlog.Log, port int, h MysqlHandler) (string, *Mysql, func()) // Set mock functions mysql.SetMysqlHandler(h) - // start ping - mysql.PingStart() + // Health check start + mysql.HealthCheckStart() return id, mysql, func() { mysql.PingStop() rpc.Stop() @@ -1122,8 +1122,8 @@ func MockMysqlReplUser(log *xlog.Log, port int, h MysqlHandler) (string, *Mysql, // Set Repl functions mysql.SetMysqlHandler(h) - // start ping - mysql.PingStart() + // Health check startping + mysql.HealthCheckStart() return id, mysql, func() { mysql.PingStop() rpc.Stop() diff --git a/src/mysql/mysql.go b/src/mysql/mysql.go index 49bb0c9..7a765af 100644 --- a/src/mysql/mysql.go +++ b/src/mysql/mysql.go @@ -102,15 +102,17 @@ func (m *Mysql) Ping() { return } - // check replication users - if exists, err := m.mysqlHandler.CheckUserExists(db, m.conf.ReplUser, "%"); err == nil { - if !exists { - log.Info("mysql[%v].ping.create.replication.user[%v]", m.getConnStr(), m.conf.ReplUser) - if err = m.mysqlHandler.CreateReplUserWithoutBinlog(db, m.conf.ReplUser, m.conf.ReplPasswd); err != nil { - log.Error("server.mysql.create.replication.user[%v].error[%+v]", m.conf.ReplUser, err) + /* + // check replication users + if exists, err := m.mysqlHandler.CheckUserExists(db, m.conf.ReplUser, "%"); err == nil { + if !exists { + log.Info("mysql[%v].ping.create.replication.user[%v]", m.getConnStr(), m.conf.ReplUser) + if err = m.mysqlHandler.CreateReplUserWithoutBinlog(db, m.conf.ReplUser, m.conf.ReplPasswd); err != nil { + log.Error("server.mysql.create.replication.user[%v].error[%+v]", m.conf.ReplUser, err) + } } } - } + */ // reset downs. m.downs = 0 diff --git a/src/mysql/mysql_test.go b/src/mysql/mysql_test.go index 8cd4402..51c9d46 100644 --- a/src/mysql/mysql_test.go +++ b/src/mysql/mysql_test.go @@ -79,8 +79,8 @@ func TestMysqlGTIDGreatThan(t *testing.T) { // Set mock functions mysql.SetMysqlHandler(new(MockGTIDB)) - // start ping - mysql.PingStart() + // health check start + mysql.HealthCheckStart() // wait for ping time.Sleep(time.Duration(conf.PingTimeout*2) * time.Millisecond) diff --git a/src/raft/mock.go b/src/raft/mock.go index dc43287..2807213 100644 --- a/src/raft/mock.go +++ b/src/raft/mock.go @@ -86,7 +86,7 @@ func mockRafts(log *xlog.Log, conf *config.RaftConfig, port int, count int, idle // setup mysql mysql57 := mysql.NewMysql(config.DefaultMysqlConfig(), 10000, log) mysql57.SetMysqlHandler(mysql.NewMockGTIDA()) - mysql57.PingStart() + mysql57.HealthCheckStart() for i, id := range ids { if idleStart != -1 && i >= idleStart { diff --git a/src/server/server.go b/src/server/server.go index bc84c63..b017864 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -103,12 +103,12 @@ func (s *Server) setupMysql() { } log.Info("server.mysql.check.replication.user...") - ret, err := s.mysql.CheckUserExists(s.conf.Mysql.ReplUser, "%") + exists, err := s.mysql.CheckUserExists(s.conf.Mysql.ReplUser, "%") if err != nil { log.Error("server.mysql.CheckUserExists.error[%+v]", err) return } - if !ret { + if !exists { log.Info("setupMysql.server.mysql.prepare.to.create.replication.user[%v]", s.conf.Mysql.ReplUser) user := s.conf.Mysql.ReplUser pwd := s.conf.Mysql.ReplPasswd @@ -171,7 +171,7 @@ func (s *Server) Start() { }() s.mysqld.MonitorStart() - s.mysql.PingStart() + s.mysql.HealthCheckStart() if err := s.raft.Start(); err != nil { log.Panic("server.raft.start.error[%+v]", err) }