From eb2d2d7d816c7c3b80c5d52d53bbd54f4ceac573 Mon Sep 17 00:00:00 2001 From: Weizhen Wang Date: Thu, 2 Dec 2021 12:07:54 +0800 Subject: [PATCH] server: close sql rows to fix unstable test Signed-off-by: Weizhen Wang --- server/server_test.go | 130 +++++++++++++++-------- server/statistics_handler_serial_test.go | 1 + server/tidb_serial_test.go | 1 + server/tidb_test.go | 84 +++++++++------ 4 files changed, 141 insertions(+), 75 deletions(-) diff --git a/server/server_test.go b/server/server_test.go index e623af576b1de..034587d7be1f7 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -106,7 +106,7 @@ func (cli *testServerClient) getDSN(overriders ...configOverrider) string { // runTests runs tests using the default database `test`. func (cli *testServerClient) runTests(t *testing.T, overrider configOverrider, tests ...func(dbt *testkit.DBTestKit)) { db, err := sql.Open("mysql", cli.getDSN(overrider)) - require.NoErrorf(t, err, "Error connecting") + require.NoError(t, err) defer func() { err := db.Close() require.NoError(t, err) @@ -124,12 +124,11 @@ func (cli *testServerClient) runTestsOnNewDB(t *testing.T, overrider configOverr config.DBName = "" }) db, err := sql.Open("mysql", dsn) - require.NoErrorf(t, err, "Error connecting") + require.NoError(t, err) defer func() { err := db.Close() require.NoError(t, err) }() - _, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS `%s`;", dbName)) if err != nil { fmt.Println(err) @@ -167,7 +166,7 @@ func (cli *testServerClient) runTestRegression(t *testing.T, overrider configOve var out bool rows := dbt.MustQuery("SELECT * FROM test") require.Falsef(t, rows.Next(), "unexpected data in empty table") - + require.NoError(t, rows.Close()) // Create Data res := dbt.MustExec("INSERT INTO test VALUES (1)") // res := dbt.mustExec("INSERT INTO test VALUES (?)", 1) @@ -188,7 +187,7 @@ func (cli *testServerClient) runTestRegression(t *testing.T, overrider configOve } else { require.Fail(t, "no data") } - rows.Close() + require.NoError(t, rows.Close()) // Update res = dbt.MustExec("UPDATE test SET val = 0 WHERE val = ?", 1) @@ -206,7 +205,7 @@ func (cli *testServerClient) runTestRegression(t *testing.T, overrider configOve } else { require.Fail(t, "no data") } - rows.Close() + require.NoError(t, rows.Close()) // Delete res = dbt.MustExec("DELETE FROM test WHERE val = 0") @@ -240,7 +239,10 @@ func (cli *testServerClient) runTestPrepareResultFieldType(t *testing.T) { if err != nil { t.Fatal(err) } - defer stmt.Close() + defer func() { + err = stmt.Close() + require.NoError(t, err) + }() row := stmt.QueryRow(param) var result int64 err = row.Scan(&result) @@ -268,6 +270,7 @@ func (cli *testServerClient) runTestSpecialType(t *testing.T) { require.Equal(t, "2012-12-21 12:12:12", outB) require.Equal(t, "04:23:34", outC) require.Equal(t, []byte{8}, outD) + require.NoError(t, rows.Close()) }) } @@ -283,20 +286,21 @@ func (cli *testServerClient) runTestClientWithCollation(t *testing.T) { err := rows.Scan(&name, &collation) require.NoError(t, err) require.Equal(t, "utf8mb4_general_ci", collation) - + require.NoError(t, rows.Close()) // check session variable character_set_client rows = dbt.MustQuery("show variables like 'character_set_client'") require.True(t, rows.Next()) err = rows.Scan(&name, &charset) require.NoError(t, err) require.Equal(t, "utf8mb4", charset) - + require.NoError(t, rows.Close()) // check session variable character_set_results rows = dbt.MustQuery("show variables like 'character_set_results'") require.True(t, rows.Next()) err = rows.Scan(&name, &charset) require.NoError(t, err) require.Equal(t, "utf8mb4", charset) + require.NoError(t, rows.Close()) // check session variable character_set_connection rows = dbt.MustQuery("show variables like 'character_set_connection'") @@ -304,6 +308,7 @@ func (cli *testServerClient) runTestClientWithCollation(t *testing.T) { err = rows.Scan(&name, &charset) require.NoError(t, err) require.Equal(t, "utf8mb4", charset) + require.NoError(t, rows.Close()) }) } @@ -318,6 +323,7 @@ func (cli *testServerClient) runTestPreparedString(t *testing.T) { require.NoError(t, err) require.Equal(t, "abcdeabcde", outA) require.Equal(t, "abcde", outB) + require.NoError(t, rows.Close()) }) } @@ -329,12 +335,11 @@ func (cli *testServerClient) runTestPreparedTimestamp(t *testing.T) { dbt.MustExec("create table test (a timestamp, b time)") dbt.MustExec("set time_zone='+00:00'") insertStmt := dbt.MustPrepare("insert test values (?, ?)") - defer insertStmt.Close() vts := time.Unix(1, 1) vt := time.Unix(-1, 1) dbt.MustExecPrepared(insertStmt, vts, vt) + require.NoError(t, insertStmt.Close()) selectStmt := dbt.MustPrepare("select * from test where a = ? and b = ?") - defer selectStmt.Close() rows := dbt.MustQueryPrepared(selectStmt, vts, vt) require.True(t, rows.Next()) var outA, outB string @@ -342,6 +347,8 @@ func (cli *testServerClient) runTestPreparedTimestamp(t *testing.T) { require.NoError(t, err) require.Equal(t, "1970-01-01 00:00:01", outA) require.Equal(t, "23:59:59", outB) + require.NoError(t, rows.Close()) + require.NoError(t, selectStmt.Close()) }) } @@ -440,13 +447,16 @@ func (cli *testServerClient) runTestLoadDataForSlowLog(t *testing.T, server *Ser rows := dbt.MustQuery("select plan from information_schema.slow_query where query like 'load data local infile % into table t_slow;' order by time desc limit 1") expectedPlan := ".*LoadData.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.* commit_txn.*" checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) // Test for record statements_summary for load data statement. rows = dbt.MustQuery("select plan from information_schema.STATEMENTS_SUMMARY where QUERY_SAMPLE_TEXT like 'load data local infile %' limit 1") checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) // Test log normal statement after executing load date. rows = dbt.MustQuery("select plan from information_schema.slow_query where query = 'insert ignore into t_slow values (1,1);' order by time desc limit 1") expectedPlan = ".*Insert.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.*" checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) }) } @@ -513,11 +523,13 @@ func (cli *testServerClient) runTestLoadDataAutoRandom(t *testing.T) { dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (c2, c3)", path)) rows := dbt.MustQuery("select count(*) from t") cli.checkRows(t, rows, "50000") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select bit_xor(c2), bit_xor(c3) from t") res := strconv.Itoa(cksum1) res = res + " " res = res + strconv.Itoa(cksum2) cli.checkRows(t, rows, res) + require.NoError(t, rows.Close()) }) } @@ -605,8 +617,10 @@ func (cli *testServerClient) runTestLoadDataForListPartition(t *testing.T) { dbt.MustExec("delete from t") cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "1 a", "3 c", "4 e") + require.NoError(t, rows.Close()) // Test load data meet duplicate error. cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) @@ -614,6 +628,7 @@ func (cli *testServerClient) runTestLoadDataForListPartition(t *testing.T) { cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '2' for key 'idx'") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") // Test load data meet no partition warning. @@ -622,8 +637,10 @@ func (cli *testServerClient) runTestLoadDataForListPartition(t *testing.T) { require.NoError(t, err) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1526 Table has no partition for value 100") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } @@ -654,25 +671,31 @@ func (cli *testServerClient) runTestLoadDataForListPartition2(t *testing.T) { dbt.MustExec("delete from t") cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select id,name from t order by id") cli.checkRows(t, rows, "1 a", "3 c", "4 e") // Test load data meet duplicate error. cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") + require.NoError(t, rows.Close()) dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1-2' for key 'idx'", "Warning 1062 Duplicate entry '2-2' for key 'idx'") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select id,name from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + require.NoError(t, rows.Close()) // Test load data meet no partition warning. cli.prepareLoadDataFile(t, path, "5 a", "100 x") _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) require.NoError(t, err) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1526 Table has no partition for value 100") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select id,name from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } @@ -703,8 +726,10 @@ func (cli *testServerClient) runTestLoadDataForListColumnPartition(t *testing.T) dbt.MustExec("delete from t") cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "1 a", "3 c", "4 e") + require.NoError(t, rows.Close()) // Test load data meet duplicate error. cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) @@ -712,16 +737,20 @@ func (cli *testServerClient) runTestLoadDataForListColumnPartition(t *testing.T) cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '2' for key 'idx'") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") // Test load data meet no partition warning. cli.prepareLoadDataFile(t, path, "5 a", "100 x") _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) require.NoError(t, err) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select id,name from t order by id") cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } @@ -751,31 +780,38 @@ func (cli *testServerClient) runTestLoadDataForListColumnPartition2(t *testing.T dbt.MustExec("delete from t") cli.prepareLoadDataFile(t, path, "w 1 1", "e 5 5", "n 9 9") dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "w 1 1", "e 5 5", "n 9 9") // Test load data meet duplicate error. cli.prepareLoadDataFile(t, path, "w 1 2", "w 2 2") _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) require.NoError(t, err) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1062 Duplicate entry 'w-1' for key 'idx'") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "w 1 1", "w 2 2", "e 5 5", "n 9 9") // Test load data meet no partition warning. cli.prepareLoadDataFile(t, path, "w 3 3", "w 5 5", "e 8 8") _, err = dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) require.NoError(t, err) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list") cli.prepareLoadDataFile(t, path, "x 1 1", "w 1 1") _, err = dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) require.NoError(t, err) + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show warnings") cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list", "Warning 1062 Duplicate entry 'w-1' for key 'idx'") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("select * from t order by id") cli.checkRows(t, rows, "w 1 1", "w 2 2", "w 3 3", "e 5 5", "e 8 8", "n 9 9") + require.NoError(t, rows.Close()) }) } @@ -903,7 +939,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, "- ", b) require.Equal(t, 5, cc) require.Falsef(t, rows.Next(), "unexpected data") - rows.Close() + require.NoError(t, rows.Close()) // specify faileds and lines dbt.MustExec("delete from test") @@ -942,7 +978,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, "\trow5_col3", b) require.Equal(t, 9, cc) require.Falsef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) // infile size more than a packet size(16K) dbt.MustExec("delete from test") _, err = fp.WriteString("\n") @@ -962,7 +998,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, int64(799), affectedRows) rows = dbt.MustQuery("select * from test") require.Truef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) // don't support lines terminated is "" dbt.MustExec("set @@tidb_dml_batch_size = 3") _, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test lines terminated by ''") @@ -1020,6 +1056,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, 789, id) require.Falsef(t, rows.Next(), "unexpected data") dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() @@ -1076,6 +1113,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, "", d.String) require.Falsef(t, rows.Next(), "unexpected data") dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() @@ -1124,6 +1162,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, `c"d"e`, b.String) require.Falsef(t, rows.Next(), "unexpected data") dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() @@ -1162,6 +1201,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, "3", c.String) require.Falsef(t, rows.Next(), "unexpected data") dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) // unsupport ClientLocalFiles capability @@ -1217,7 +1257,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, 3, a) require.Equal(t, 4, b) require.Falsef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) // fail error processing test require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/commitOneTaskErr", "return")) _, err1 = dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ','`) @@ -1269,7 +1309,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, 3, a) require.Equal(t, 4, b) require.Falsef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) dbt.MustExec("drop table if exists pn") }) @@ -1316,7 +1356,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Empty(t, b.String) require.Empty(t, c.String) require.Falsef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) dbt.MustExec("drop table if exists pn") }) @@ -1363,7 +1403,7 @@ func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { require.Equal(t, 5, b) require.Equal(t, 600, c) require.Falsef(t, rows.Next(), "unexpected data") - + require.NoError(t, rows.Close()) dbt.MustExec("drop table if exists pn") }) } @@ -1515,10 +1555,9 @@ func (cli *testServerClient) runTestAuth(t *testing.T) { config.Passwd = "456" })) require.NoError(t, err) - _, err = db.Query("USE information_schema;") + _, err = db.Exec("USE information_schema;") require.NotNilf(t, err, "Wrong password should be failed") - err = db.Close() - require.NoError(t, err) + require.NoError(t, db.Close()) // Test for loading active roles. db, err = sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { @@ -1532,6 +1571,7 @@ func (cli *testServerClient) runTestAuth(t *testing.T) { var outA string err = rows.Scan(&outA) require.NoError(t, err) + require.NoError(t, rows.Close()) require.Equal(t, "`authtest_r1`@`%`", outA) err = db.Close() require.NoError(t, err) @@ -1587,16 +1627,10 @@ func (cli *testServerClient) runTestIssue3680(t *testing.T) { func (cli *testServerClient) runTestIssue22646(t *testing.T) { cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { - c1 := make(chan string, 1) - go func() { - dbt.MustExec(``) // empty query. - c1 <- "success" - }() - select { - case res := <-c1: - fmt.Println(res) - case <-time.After(30 * time.Second): - panic("read empty query statement timed out.") + now := time.Now() + dbt.MustExec(``) + if time.Since(now) > 30*time.Second { + t.Fatal("read empty query statement timed out.") } }) } @@ -1894,24 +1928,31 @@ func getStmtCnt(content string) (stmtCnt map[string]int) { const retryTime = 100 -func (cli *testServerClient) waitUntilServerCanConnect() { +func (cli *testServerClient) waitUntilCustomServerCanConnect(overriders ...configOverrider) { // connect server retry := 0 + dsn := cli.getDSN(overriders...) for ; retry < retryTime; retry++ { time.Sleep(time.Millisecond * 10) - db, err := sql.Open("mysql", cli.getDSN()) + db, err := sql.Open("mysql", dsn) if err == nil { - err = db.Close() - if err != nil { - panic(err) + succeed := db.Ping() == nil + if err = db.Close(); err != nil { + log.Error("fail to connect db", zap.String("err", err.Error()), zap.String("DSN", dsn)) + continue + } + if succeed { + break } - break } } if retry == retryTime { - log.Fatal("failed to connect DB in every 10 ms", zap.Int("retryTime", retryTime)) + log.Fatal("failed to connect DB in every 10 ms", zap.String("DSN", dsn), zap.Int("retryTime", retryTime)) } } +func (cli *testServerClient) waitUntilServerCanConnect() { + cli.waitUntilCustomServerCanConnect(nil) +} func (cli *testServerClient) waitUntilServerOnline() { // connect server @@ -1988,9 +2029,9 @@ func (cli *testServerClient) runTestInitConnect(t *testing.T) { db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "init_nonsuper" })) - require.NoErrorf(t, err, "Error connecting") // doesn't fail because of lazy loading - defer db.Close() // may already be closed - _, err = db.Exec("SELECT 1") // fails because of init sql + require.NoError(t, err) // doesn't fail because of lazy loading + defer db.Close() // may already be closed + _, err = db.Exec("SELECT 1") // fails because of init sql require.Error(t, err) } @@ -2033,7 +2074,7 @@ func (cli *testServerClient) runTestInfoschemaClientErrors(t *testing.T) { if rows.Next() { rows.Scan(&errors, &warnings) } - rows.Close() + require.NoError(t, rows.Close()) if test.incrementErrors { errors++ @@ -2049,14 +2090,15 @@ func (cli *testServerClient) runTestInfoschemaClientErrors(t *testing.T) { var fake string rows.Scan(&fake) } - rows.Close() + require.NoError(t, rows.Close()) } + var newErrors, newWarnings int rows = dbt.MustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) if rows.Next() { rows.Scan(&newErrors, &newWarnings) } - rows.Close() + require.NoError(t, rows.Close()) require.Equal(t, errors, newErrors) require.Equalf(t, warnings, newWarnings, "source=information_schema.%s code=%d statement=%s", tbl, test.errCode, test.stmt) } diff --git a/server/statistics_handler_serial_test.go b/server/statistics_handler_serial_test.go index 4f64a9c9b345a..1f4324d3a54f5 100644 --- a/server/statistics_handler_serial_test.go +++ b/server/statistics_handler_serial_test.go @@ -229,4 +229,5 @@ func checkData(t *testing.T, path string, client *testServerClient) { require.Equal(t, "test", tableName) require.Equal(t, int64(3), modifyCount) require.Equal(t, int64(4), count) + require.NoError(t, rows.Close()) } diff --git a/server/tidb_serial_test.go b/server/tidb_serial_test.go index 68b5d634a5a4a..5bbf88ad0e392 100644 --- a/server/tidb_serial_test.go +++ b/server/tidb_serial_test.go @@ -363,6 +363,7 @@ func TestPrepareCount(t *testing.T) { err = qctx.GetStatement(stmt.ID()).Close() require.NoError(t, err) require.Equal(t, prepareCnt, atomic.LoadInt64(&variable.PreparedStmtCount)) + require.NoError(t, qctx.Close()) } func TestDefaultCharacterAndCollation(t *testing.T) { diff --git a/server/tidb_test.go b/server/tidb_test.go index eab37278c5b64..8ea521fda6275 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -120,7 +120,7 @@ func createTidbTestTopSQLSuite(t *testing.T) (*tidbTestTopSQLSuite, func()) { // Initialize global variable for top-sql test. db, err := sql.Open("mysql", ts.getDSN()) - require.NoErrorf(t, err, "Error connecting") + require.NoError(t, err) defer func() { err := db.Close() require.NoError(t, err) @@ -449,15 +449,17 @@ func TestSocket(t *testing.T) { time.Sleep(time.Millisecond * 100) defer server.Close() - // a fake server client, config is override, just used to run tests - cli := newTestServerClient() - cli.runTestRegression(t, func(config *mysql.Config) { + confFunc := func(config *mysql.Config) { config.User = "root" config.Net = "unix" config.Addr = socketFile config.DBName = "test" config.Params = map[string]string{"sql_mode": "STRICT_ALL_TABLES"} - }, "SocketRegression") + } + // a fake server client, config is override, just used to run tests + cli := newTestServerClient() + cli.waitUntilCustomServerCanConnect(confFunc) + cli.runTestRegression(t, confFunc, "SocketRegression") } func TestSocketAndIp(t *testing.T) { @@ -494,9 +496,9 @@ func TestSocketAndIp(t *testing.T) { config.User = "root" }, func(dbt *testkit.DBTestKit) { - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'%'") - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'localhost'") - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'127.0.0.1'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'%'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'localhost'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'127.0.0.1'") }) }() cli.runTests(t, func(config *mysql.Config) { @@ -594,8 +596,8 @@ func TestSocketAndIp(t *testing.T) { cli.checkRows(t, rows, "root@localhost") rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.MustQuery("CREATE USER user1@localhost") - dbt.MustQuery("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") + dbt.MustExec("CREATE USER user1@localhost") + dbt.MustExec("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") }) // Test with Network interface connection with all hosts cli.runTests(t, func(config *mysql.Config) { @@ -606,8 +608,10 @@ func TestSocketAndIp(t *testing.T) { rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) cli.checkRows(t, rows, "user1@127.0.0.1") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'127.0.0.1'\nGRANT SELECT,INSERT ON test.* TO 'user1'@'127.0.0.1'") + require.NoError(t, rows.Close()) }) // Test with unix domain socket file connection with all hosts cli.runTests(t, func(config *mysql.Config) { @@ -619,8 +623,10 @@ func TestSocketAndIp(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + require.NoError(t, rows.Close()) }) } @@ -662,9 +668,9 @@ func TestOnlySocket(t *testing.T) { config.Addr = socketFile }, func(dbt *testkit.DBTestKit) { - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'%'") - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'localhost'") - dbt.MustQuery("DROP USER IF EXISTS 'user1'@'127.0.0.1'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'%'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'localhost'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'127.0.0.1'") }) }() cli.runTests(t, func(config *mysql.Config) { @@ -676,10 +682,12 @@ func TestOnlySocket(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.MustQuery("CREATE USER user1@'%'") - dbt.MustQuery("GRANT SELECT ON test.* TO user1@'%'") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@'%'") + dbt.MustExec("GRANT SELECT ON test.* TO user1@'%'") }) // Test with Network interface connection with all hosts, should fail since server not configured db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { @@ -708,8 +716,10 @@ func TestOnlySocket(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + require.NoError(t, rows.Close()) }) // Setup user1@127.0.0.1 for loop back network interface access @@ -723,10 +733,12 @@ func TestOnlySocket(t *testing.T) { rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.MustQuery("CREATE USER user1@127.0.0.1") - dbt.MustQuery("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@127.0.0.1") + dbt.MustExec("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") }) // Test with unix domain socket file connection with all hosts cli.runTests(t, func(config *mysql.Config) { @@ -738,8 +750,10 @@ func TestOnlySocket(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + require.NoError(t, rows.Close()) }) // Setup user1@localhost for socket (and if MySQL compatible; loop back network interface access) @@ -752,10 +766,12 @@ func TestOnlySocket(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.MustQuery("CREATE USER user1@localhost") - dbt.MustQuery("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@localhost") + dbt.MustExec("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") }) // Test with unix domain socket file connection with all hosts cli.runTests(t, func(config *mysql.Config) { @@ -767,8 +783,10 @@ func TestOnlySocket(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + require.NoError(t, rows.Close()) }) } @@ -1281,7 +1299,7 @@ func TestTopSQLCPUProfile(t *testing.T) { defer cleanup() db, err := sql.Open("mysql", ts.getDSN()) - require.NoErrorf(t, err, "Error connecting") + require.NoError(t, err) defer func() { err := db.Close() require.NoError(t, err) @@ -1339,8 +1357,7 @@ func TestTopSQLCPUProfile(t *testing.T) { dbt := testkit.NewDBTestKit(t, db) if strings.HasPrefix(sqlStr, "select") { rows := dbt.MustQuery(sqlStr) - for rows.Next() { - } + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. db.Exec(sqlStr) @@ -1411,11 +1428,11 @@ func TestTopSQLCPUProfile(t *testing.T) { if strings.HasPrefix(prepare, "select") { rows, err := stmt.Query(args...) require.NoError(t, err) - for rows.Next() { - } + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. - stmt.Exec(args...) + _, err = stmt.Exec(args...) + require.NoError(t, err) } }) } @@ -1472,11 +1489,11 @@ func TestTopSQLCPUProfile(t *testing.T) { if strings.HasPrefix(prepare, "select") { rows, err := db.Query(sqlBuf.String()) require.NoErrorf(t, err, "%v", sqlBuf.String()) - for rows.Next() { - } + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. - db.Exec(sqlBuf.String()) + _, err = db.Exec(sqlBuf.String()) + require.NoError(t, err) } }) } @@ -1579,8 +1596,7 @@ func TestTopSQLAgent(t *testing.T) { go ts.loopExec(ctx, t, func(db *sql.DB) { dbt := testkit.NewDBTestKit(t, db) rows := dbt.MustQuery(query) - for rows.Next() { - } + require.NoError(t, rows.Close()) }) } return cancel @@ -1717,8 +1733,10 @@ func TestLocalhostClientMapping(t *testing.T) { dbt := testkit.NewDBTestKit(t, db) rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + require.NoError(t, rows.Close()) dbt.MustExec("CREATE USER 'localhostuser'@'localhost'") dbt.MustExec("CREATE USER 'localhostuser'@'%'") @@ -1740,8 +1758,10 @@ func TestLocalhostClientMapping(t *testing.T) { rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report localhostuser@localhost also for 127.0.0.1) cli.checkRows(t, rows, "localhostuser@127.0.0.1") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'localhostuser'@'localhost'\nGRANT SELECT,UPDATE ON test.* TO 'localhostuser'@'localhost'") + require.NoError(t, rows.Close()) }) dbt.MustExec("DROP USER IF EXISTS 'localhostuser'@'localhost'") @@ -1757,12 +1777,14 @@ func TestLocalhostClientMapping(t *testing.T) { func(dbt *testkit.DBTestKit) { rows := dbt.MustQuery("select user()") cli.checkRows(t, rows, "localhostuser@localhost") + require.NoError(t, rows.Close()) rows = dbt.MustQuery("show grants") cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'localhostuser'@'%'\nGRANT SELECT ON test.* TO 'localhostuser'@'%'") + require.NoError(t, rows.Close()) }) // Test if only localhost exists - dbt.MustQuery("DROP USER 'localhostuser'@'%'") + dbt.MustExec("DROP USER 'localhostuser'@'%'") dbSocket, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "localhostuser" config.Net = "unix"