From 72751ed72c5113eaf23162b4a00fdc0248582cd5 Mon Sep 17 00:00:00 2001 From: King-Dylan <702299521@qq.com> Date: Thu, 28 Nov 2024 19:26:09 -0800 Subject: [PATCH 1/3] fix error when stats file with string --- pkg/executor/load_stats.go | 3 + .../optimizor/statistics_handler_test.go | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/pkg/executor/load_stats.go b/pkg/executor/load_stats.go index 3ef7ae5782f78..f8c248ff98f5c 100644 --- a/pkg/executor/load_stats.go +++ b/pkg/executor/load_stats.go @@ -83,6 +83,9 @@ func (e *LoadStatsInfo) Update(data []byte) error { if err := json.Unmarshal(data, jsonTbl); err != nil { return errors.Trace(err) } + if jsonTbl.TableName == "" && jsonTbl.Version == 0 { + return nil + } do := domain.GetDomain(e.Ctx) h := do.StatsHandle() if h == nil { diff --git a/pkg/server/handler/optimizor/statistics_handler_test.go b/pkg/server/handler/optimizor/statistics_handler_test.go index 01c322e54f592..4a00f62589ff2 100644 --- a/pkg/server/handler/optimizor/statistics_handler_test.go +++ b/pkg/server/handler/optimizor/statistics_handler_test.go @@ -346,3 +346,61 @@ func TestStatsPriorityQueueAPI(t *testing.T) { require.Empty(t, snapshot.CurrentJobs) require.Empty(t, snapshot.MustRetryTables) } + +// fix issue 53966 +func TestLoadNullStatsFile1(t *testing.T) { + // Setting up the mock store + store := testkit.CreateMockStore(t) + + // Creating a new TiDB driver and client + driver := server2.NewTiDBDriver(store) + client := testserverclient.NewTestServerClient() + cfg := util.NewTestConfig() + cfg.Port = client.Port + cfg.Status.StatusPort = client.StatusPort + cfg.Status.ReportStatus = true + cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano()) + + // Creating and running the server + server, err := server2.NewServer(cfg, driver) + require.NoError(t, err) + defer server.Close() + + dom, err := session.GetDomain(store) + require.NoError(t, err) + server.SetDomain(dom) + go func() { + err := server.Run(nil) + require.NoError(t, err) + }() + <-server2.RunInGoTestChan + client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr()) + client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr()) + client.WaitUntilServerOnline() + + // Creating the stats file + path := "/tmp/stats.json" + fp, err := os.Create(path) + require.NoError(t, err) + require.NotNil(t, fp) + defer func() { + require.NoError(t, fp.Close()) + require.NoError(t, os.Remove(path)) + }() + fp.Write([]byte("null")) + require.NoError(t, err) + + // Connecting to the database and executing SQL commands + db, err := sql.Open("mysql", client.GetDSN(func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + })) + require.NoError(t, err, "Error connecting") + tk := testkit.NewDBTestKit(t, db) + defer func() { + err := db.Close() + require.NoError(t, err) + }() + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("load stats '%s'", path)) +} From 70fcc6219a967523531282ba6c877b2e15a6e71e Mon Sep 17 00:00:00 2001 From: King-Dylan <702299521@qq.com> Date: Fri, 29 Nov 2024 00:51:54 -0800 Subject: [PATCH 2/3] fix test --- pkg/server/handler/optimizor/BUILD.bazel | 2 +- pkg/server/handler/optimizor/statistics_handler_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/server/handler/optimizor/BUILD.bazel b/pkg/server/handler/optimizor/BUILD.bazel index 96be1444d3c98..3045808ef3260 100644 --- a/pkg/server/handler/optimizor/BUILD.bazel +++ b/pkg/server/handler/optimizor/BUILD.bazel @@ -43,7 +43,7 @@ go_test( "statistics_handler_test.go", ], flaky = True, - shard_count = 7, + shard_count = 8, deps = [ ":optimizor", "//pkg/config", diff --git a/pkg/server/handler/optimizor/statistics_handler_test.go b/pkg/server/handler/optimizor/statistics_handler_test.go index 4a00f62589ff2..1afe8cb89effc 100644 --- a/pkg/server/handler/optimizor/statistics_handler_test.go +++ b/pkg/server/handler/optimizor/statistics_handler_test.go @@ -348,7 +348,7 @@ func TestStatsPriorityQueueAPI(t *testing.T) { } // fix issue 53966 -func TestLoadNullStatsFile1(t *testing.T) { +func TestLoadNullStatsFile(t *testing.T) { // Setting up the mock store store := testkit.CreateMockStore(t) From f423352d510778a21bee7768e9976f14be40f012 Mon Sep 17 00:00:00 2001 From: Jinlong Liu <50897894+King-Dylan@users.noreply.github.com> Date: Thu, 5 Dec 2024 06:40:12 -0800 Subject: [PATCH 3/3] Add comment --- pkg/executor/load_stats.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/executor/load_stats.go b/pkg/executor/load_stats.go index f8c248ff98f5c..11d72e43ea17a 100644 --- a/pkg/executor/load_stats.go +++ b/pkg/executor/load_stats.go @@ -83,6 +83,7 @@ func (e *LoadStatsInfo) Update(data []byte) error { if err := json.Unmarshal(data, jsonTbl); err != nil { return errors.Trace(err) } + // Check the `jsonTbl` in cases where the stats file with `null`. if jsonTbl.TableName == "" && jsonTbl.Version == 0 { return nil }