From 92b87b99dfbfab263b5387696505f0f163794b04 Mon Sep 17 00:00:00 2001 From: lance6716 Date: Thu, 3 Dec 2020 16:48:20 +0800 Subject: [PATCH] export: don't write SHOW MASTER STATUS when lacking privilege (#208) --- v4/export/metadata.go | 14 +++++++++----- v4/export/metadata_test.go | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/v4/export/metadata.go b/v4/export/metadata.go index d9cc6021..e3a9f90d 100644 --- a/v4/export/metadata.go +++ b/v4/export/metadata.go @@ -65,12 +65,14 @@ func (m *globalMetadata) recordGlobalMetaData(db *sql.Conn, serverType ServerTyp } func recordGlobalMetaData(db *sql.Conn, buffer *bytes.Buffer, serverType ServerType, afterConn bool, snapshot string) error { - // get master status info - buffer.WriteString("SHOW MASTER STATUS:") - if afterConn { - buffer.WriteString(" /* AFTER CONNECTION POOL ESTABLISHED */") + writeMasterStatusHeader := func() { + buffer.WriteString("SHOW MASTER STATUS:") + if afterConn { + buffer.WriteString(" /* AFTER CONNECTION POOL ESTABLISHED */") + } + buffer.WriteString("\n") } - buffer.WriteString("\n") + switch serverType { // For MySQL: // mysql 5.6+ @@ -106,6 +108,7 @@ func recordGlobalMetaData(db *sql.Conn, buffer *bytes.Buffer, serverType ServerT gtidSet := getValidStr(str, gtidSetFieldIndex) if logFile != "" { + writeMasterStatusHeader() fmt.Fprintf(buffer, "\tLog: %s\n\tPos: %s\n\tGTID:%s\n", logFile, pos, gtidSet) } // For MariaDB: @@ -136,6 +139,7 @@ func recordGlobalMetaData(db *sql.Conn, buffer *bytes.Buffer, serverType ServerT } if logFile != "" { + writeMasterStatusHeader() fmt.Fprintf(buffer, "\tLog: %s\n\tPos: %s\n\tGTID:%s\n", logFile, pos, gtidSet) } default: diff --git a/v4/export/metadata_test.go b/v4/export/metadata_test.go index 0cdf3ca5..ed1e0c91 100644 --- a/v4/export/metadata_test.go +++ b/v4/export/metadata_test.go @@ -4,6 +4,7 @@ package export import ( "context" + "errors" "fmt" "github.com/DATA-DOG/go-sqlmock" @@ -269,3 +270,18 @@ func (s *testMetaDataSuite) TestTiDBSnapshotMetaData(c *C) { "\tGTID:\n\n") c.Assert(mock.ExpectationsWereMet(), IsNil) } + +func (s *testMetaDataSuite) TestNoPrivilege(c *C) { + db, mock, err := sqlmock.New() + c.Assert(err, IsNil) + defer db.Close() + conn, err := db.Conn(context.Background()) + c.Assert(err, IsNil) + + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnError(errors.New("lack SUPER or REPLICATION CLIENT privilege")) + + m := newGlobalMetadata(s.createStorage(c), "") + // some consistencyType will ignore this error, this test make sure no extra message is written + c.Assert(m.recordGlobalMetaData(conn, ServerTypeTiDB, false), NotNil) + c.Assert(m.buffer.String(), Equals, "") +}