Skip to content

Commit

Permalink
This is an automated cherry-pick of pingcap#57818
Browse files Browse the repository at this point in the history
Signed-off-by: ti-chi-bot <[email protected]>
  • Loading branch information
King-Dylan authored and ti-chi-bot committed Jan 24, 2025
1 parent 5e39597 commit 185c7dd
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 0 deletions.
4 changes: 4 additions & 0 deletions executor/load_stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ 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
}
do := domain.GetDomain(e.Ctx)
h := do.StatsHandle()
if h == nil {
Expand Down
76 changes: 76 additions & 0 deletions pkg/server/handler/optimizor/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")

go_library(
name = "optimizor",
srcs = [
"optimize_trace.go",
"plan_replayer.go",
"statistics_handler.go",
],
importpath = "github.com/pingcap/tidb/pkg/server/handler/optimizor",
visibility = ["//visibility:public"],
deps = [
"//pkg/domain",
"//pkg/domain/infosync",
"//pkg/infoschema",
"//pkg/meta/model",
"//pkg/parser/model",
"//pkg/parser/mysql",
"//pkg/server/handler",
"//pkg/sessionctx/variable",
"//pkg/statistics/handle",
"//pkg/statistics/util",
"//pkg/table",
"//pkg/types",
"//pkg/util",
"//pkg/util/logutil",
"//pkg/util/replayer",
"@com_github_burntsushi_toml//:toml",
"@com_github_gorilla_mux//:mux",
"@com_github_pingcap_errors//:errors",
"@com_github_tikv_client_go_v2//oracle",
"@org_uber_go_zap//:zap",
],
)

go_test(
name = "optimizor_test",
timeout = "short",
srcs = [
"main_test.go",
"optimize_trace_test.go",
"plan_replayer_test.go",
"statistics_handler_test.go",
],
flaky = True,
shard_count = 8,
deps = [
":optimizor",
"//pkg/config",
"//pkg/domain",
"//pkg/kv",
"//pkg/metrics",
"//pkg/parser/model",
"//pkg/server",
"//pkg/server/internal/testserverclient",
"//pkg/server/internal/testutil",
"//pkg/server/internal/util",
"//pkg/session",
"//pkg/statistics/handle/ddl/testutil",
"//pkg/statistics/handle/types",
"//pkg/statistics/util",
"//pkg/store/mockstore/unistore",
"//pkg/testkit",
"//pkg/testkit/testsetup",
"//pkg/util/replayer",
"//pkg/util/topsql/state",
"@com_github_burntsushi_toml//:toml",
"@com_github_go_sql_driver_mysql//:mysql",
"@com_github_gorilla_mux//:mux",
"@com_github_pingcap_failpoint//:failpoint",
"@com_github_stretchr_testify//require",
"@com_github_tikv_client_go_v2//oracle",
"@com_github_tikv_client_go_v2//tikv",
"@org_uber_go_goleak//:goleak",
],
)
116 changes: 116 additions & 0 deletions server/statistics_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,3 +275,119 @@ func checkData(t *testing.T, path string, client *testServerClient) {
require.Equal(t, int64(4), count)
require.NoError(t, rows.Close())
}
<<<<<<< HEAD:server/statistics_handler_test.go
=======

func TestStatsPriorityQueueAPI(t *testing.T) {
store := testkit.CreateMockStore(t)
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())

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()

router := mux.NewRouter()
handler := optimizor.NewStatsPriorityQueueHandler(dom)
router.Handle("/stats/priority-queue", handler)

resp, err := client.FetchStatus("/stats/priority-queue")
require.NoError(t, err)
defer resp.Body.Close()

js, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.Equal(t, "priority queue not initialized", string(js))

// Init the queue.
handle := dom.StatsHandle()
require.False(t, handle.HandleAutoAnalyze())

resp, err = client.FetchStatus("/stats/priority-queue")
require.NoError(t, err)
defer resp.Body.Close()

js, err = io.ReadAll(resp.Body)
require.NoError(t, err)
var snapshot types.PriorityQueueSnapshot
err = json.Unmarshal(js, &snapshot)
require.NoError(t, err)
require.Empty(t, snapshot.CurrentJobs)
require.Empty(t, snapshot.MustRetryTables)
}

// fix issue 53966
func TestLoadNullStatsFile(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))
}
>>>>>>> 64dd762fde7 (planner: Fix load stats failure when stats file contains with `null` (#57818)):pkg/server/handler/optimizor/statistics_handler_test.go

0 comments on commit 185c7dd

Please sign in to comment.