Skip to content

Commit 9852204

Browse files
King-Dylanti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#57818
Signed-off-by: ti-chi-bot <[email protected]>
1 parent 1f0d8ff commit 9852204

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ go_test(
4343
"statistics_handler_test.go",
4444
],
4545
flaky = True,
46+
<<<<<<< HEAD
4647
shard_count = 6,
48+
=======
49+
shard_count = 8,
50+
>>>>>>> 64dd762fde7 (planner: Fix load stats failure when stats file contains with `null` (#57818))
4751
deps = [
4852
":optimizor",
4953
"//pkg/config",

pkg/server/handler/optimizor/statistics_handler_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,3 +288,119 @@ func checkData(t *testing.T, path string, client *testserverclient.TestServerCli
288288
require.Equal(t, int64(4), count)
289289
require.NoError(t, rows.Close())
290290
}
291+
<<<<<<< HEAD
292+
=======
293+
294+
func TestStatsPriorityQueueAPI(t *testing.T) {
295+
store := testkit.CreateMockStore(t)
296+
driver := server2.NewTiDBDriver(store)
297+
client := testserverclient.NewTestServerClient()
298+
cfg := util.NewTestConfig()
299+
cfg.Port = client.Port
300+
cfg.Status.StatusPort = client.StatusPort
301+
cfg.Status.ReportStatus = true
302+
cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano())
303+
304+
server, err := server2.NewServer(cfg, driver)
305+
require.NoError(t, err)
306+
defer server.Close()
307+
308+
dom, err := session.GetDomain(store)
309+
require.NoError(t, err)
310+
server.SetDomain(dom)
311+
go func() {
312+
err := server.Run(nil)
313+
require.NoError(t, err)
314+
}()
315+
<-server2.RunInGoTestChan
316+
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
317+
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
318+
client.WaitUntilServerOnline()
319+
320+
router := mux.NewRouter()
321+
handler := optimizor.NewStatsPriorityQueueHandler(dom)
322+
router.Handle("/stats/priority-queue", handler)
323+
324+
resp, err := client.FetchStatus("/stats/priority-queue")
325+
require.NoError(t, err)
326+
defer resp.Body.Close()
327+
328+
js, err := io.ReadAll(resp.Body)
329+
require.NoError(t, err)
330+
require.Equal(t, "priority queue not initialized", string(js))
331+
332+
// Init the queue.
333+
handle := dom.StatsHandle()
334+
require.False(t, handle.HandleAutoAnalyze())
335+
336+
resp, err = client.FetchStatus("/stats/priority-queue")
337+
require.NoError(t, err)
338+
defer resp.Body.Close()
339+
340+
js, err = io.ReadAll(resp.Body)
341+
require.NoError(t, err)
342+
var snapshot types.PriorityQueueSnapshot
343+
err = json.Unmarshal(js, &snapshot)
344+
require.NoError(t, err)
345+
require.Empty(t, snapshot.CurrentJobs)
346+
require.Empty(t, snapshot.MustRetryTables)
347+
}
348+
349+
// fix issue 53966
350+
func TestLoadNullStatsFile(t *testing.T) {
351+
// Setting up the mock store
352+
store := testkit.CreateMockStore(t)
353+
354+
// Creating a new TiDB driver and client
355+
driver := server2.NewTiDBDriver(store)
356+
client := testserverclient.NewTestServerClient()
357+
cfg := util.NewTestConfig()
358+
cfg.Port = client.Port
359+
cfg.Status.StatusPort = client.StatusPort
360+
cfg.Status.ReportStatus = true
361+
cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano())
362+
363+
// Creating and running the server
364+
server, err := server2.NewServer(cfg, driver)
365+
require.NoError(t, err)
366+
defer server.Close()
367+
368+
dom, err := session.GetDomain(store)
369+
require.NoError(t, err)
370+
server.SetDomain(dom)
371+
go func() {
372+
err := server.Run(nil)
373+
require.NoError(t, err)
374+
}()
375+
<-server2.RunInGoTestChan
376+
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
377+
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
378+
client.WaitUntilServerOnline()
379+
380+
// Creating the stats file
381+
path := "/tmp/stats.json"
382+
fp, err := os.Create(path)
383+
require.NoError(t, err)
384+
require.NotNil(t, fp)
385+
defer func() {
386+
require.NoError(t, fp.Close())
387+
require.NoError(t, os.Remove(path))
388+
}()
389+
fp.Write([]byte("null"))
390+
require.NoError(t, err)
391+
392+
// Connecting to the database and executing SQL commands
393+
db, err := sql.Open("mysql", client.GetDSN(func(config *mysql.Config) {
394+
config.AllowAllFiles = true
395+
config.Params["sql_mode"] = "''"
396+
}))
397+
require.NoError(t, err, "Error connecting")
398+
tk := testkit.NewDBTestKit(t, db)
399+
defer func() {
400+
err := db.Close()
401+
require.NoError(t, err)
402+
}()
403+
tk.MustExec("use test")
404+
tk.MustExec(fmt.Sprintf("load stats '%s'", path))
405+
}
406+
>>>>>>> 64dd762fde7 (planner: Fix load stats failure when stats file contains with `null` (#57818))

0 commit comments

Comments
 (0)