Skip to content

Commit de4f73a

Browse files
authored
planner: fix load stats failure when stats file contains with null (#57818) (#60440)
close #53966
1 parent 600ef33 commit de4f73a

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

pkg/executor/load_stats.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ func (e *LoadStatsInfo) Update(data []byte) error {
8383
if err := json.Unmarshal(data, jsonTbl); err != nil {
8484
return errors.Trace(err)
8585
}
86+
// Check the `jsonTbl` in cases where the stats file with `null`.
87+
if jsonTbl.TableName == "" && jsonTbl.Version == 0 {
88+
return nil
89+
}
8690
do := domain.GetDomain(e.Ctx)
8791
h := do.StatsHandle()
8892
if h == nil {

pkg/server/handler/optimizor/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ go_test(
4343
"statistics_handler_test.go",
4444
],
4545
flaky = True,
46-
shard_count = 7,
46+
shard_count = 8,
4747
deps = [
4848
":optimizor",
4949
"//pkg/config",

pkg/server/handler/optimizor/statistics_handler_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,61 @@ func TestStatsPriorityQueueAPI(t *testing.T) {
346346
require.Empty(t, snapshot.CurrentJobs)
347347
require.Empty(t, snapshot.MustRetryTables)
348348
}
349+
350+
// fix issue 53966
351+
func TestLoadNullStatsFile(t *testing.T) {
352+
// Setting up the mock store
353+
store := testkit.CreateMockStore(t)
354+
355+
// Creating a new TiDB driver and client
356+
driver := server2.NewTiDBDriver(store)
357+
client := testserverclient.NewTestServerClient()
358+
cfg := util.NewTestConfig()
359+
cfg.Port = client.Port
360+
cfg.Status.StatusPort = client.StatusPort
361+
cfg.Status.ReportStatus = true
362+
cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano())
363+
364+
// Creating and running the server
365+
server, err := server2.NewServer(cfg, driver)
366+
require.NoError(t, err)
367+
defer server.Close()
368+
369+
dom, err := session.GetDomain(store)
370+
require.NoError(t, err)
371+
server.SetDomain(dom)
372+
go func() {
373+
err := server.Run(nil)
374+
require.NoError(t, err)
375+
}()
376+
<-server2.RunInGoTestChan
377+
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
378+
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
379+
client.WaitUntilServerOnline()
380+
381+
// Creating the stats file
382+
path := "/tmp/stats.json"
383+
fp, err := os.Create(path)
384+
require.NoError(t, err)
385+
require.NotNil(t, fp)
386+
defer func() {
387+
require.NoError(t, fp.Close())
388+
require.NoError(t, os.Remove(path))
389+
}()
390+
fp.Write([]byte("null"))
391+
require.NoError(t, err)
392+
393+
// Connecting to the database and executing SQL commands
394+
db, err := sql.Open("mysql", client.GetDSN(func(config *mysql.Config) {
395+
config.AllowAllFiles = true
396+
config.Params["sql_mode"] = "''"
397+
}))
398+
require.NoError(t, err, "Error connecting")
399+
tk := testkit.NewDBTestKit(t, db)
400+
defer func() {
401+
err := db.Close()
402+
require.NoError(t, err)
403+
}()
404+
tk.MustExec("use test")
405+
tk.MustExec(fmt.Sprintf("load stats '%s'", path))
406+
}

0 commit comments

Comments
 (0)