Skip to content

Commit

Permalink
statistics: rightly deal with timout when to send sync load (#57712) (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-chi-bot authored Dec 11, 2024
1 parent 0b7ed62 commit 53f3236
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 5 deletions.
1 change: 1 addition & 0 deletions .bazelversion
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7.4.1
2 changes: 1 addition & 1 deletion pkg/statistics/handle/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ go_test(
embed = [":handle"],
flaky = True,
race = "on",
shard_count = 9,
shard_count = 10,
deps = [
"//pkg/config",
"//pkg/parser/model",
Expand Down
12 changes: 8 additions & 4 deletions pkg/statistics/handle/handle_hist.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import (
)

// RetryCount is the max retry count for a sync load task.
const RetryCount = 3
const RetryCount = 2

var globalStatsSyncLoadSingleFlight singleflight.Group

Expand Down Expand Up @@ -98,9 +98,13 @@ func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededHistItems
}
select {
case h.StatsLoad.NeededItemsCh <- task:
result, ok := <-task.ResultCh
intest.Assert(ok, "task.ResultCh cannot be closed")
return result, nil
select {
case <-timer.C:
return nil, errors.New("sync load took too long to return")
case result, ok := <-task.ResultCh:
intest.Assert(ok, "task.ResultCh cannot be closed")
return result, nil
}
case <-timer.C:
return nil, errors.New("sync load stats channel is full and timeout sending task to channel")
}
Expand Down
44 changes: 44 additions & 0 deletions pkg/statistics/handle/handle_hist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,3 +343,47 @@ func TestRetry(t *testing.T) {
}
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/statistics/handle/mockReadStatsForOneFail"))
}

func TestSendLoadRequestsWaitTooLong(t *testing.T) {
originConfig := config.GetGlobalConfig()
newConfig := config.NewConfig()
newConfig.Performance.StatsLoadConcurrency = 0 // no worker to consume channel
newConfig.Performance.StatsLoadQueueSize = 10000
config.StoreGlobalConfig(newConfig)
defer config.StoreGlobalConfig(originConfig)
store, dom := testkit.CreateMockStoreAndDomain(t)

tk := testkit.NewTestKit(t, store)
tk.MustExec("use test")
tk.MustExec("create table t(a int, b int, c int, primary key(a), key idx(b,c))")
tk.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3)")

oriLease := dom.StatsHandle().Lease()
dom.StatsHandle().SetLease(1)
defer func() {
dom.StatsHandle().SetLease(oriLease)
}()
tk.MustExec("analyze table t all columns")
h := dom.StatsHandle()
is := dom.InfoSchema()
tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t"))
require.NoError(t, err)
tableInfo := tbl.Meta()
neededColumns := make([]model.TableItemID, 0, len(tableInfo.Columns))
for _, col := range tableInfo.Columns {
neededColumns = append(neededColumns, model.TableItemID{TableID: tableInfo.ID, ID: col.ID, IsIndex: false})
}
stmtCtx := stmtctx.NewStmtCtx()
timeout := time.Nanosecond * 100
require.NoError(t, h.SendLoadRequests(stmtCtx, neededColumns, timeout))
for _, resultCh := range stmtCtx.StatsLoad.ResultCh {
rs1 := <-resultCh
require.Error(t, rs1.Err)
}
stmtCtx1 := stmtctx.NewStmtCtx()
require.NoError(t, h.SendLoadRequests(stmtCtx1, neededColumns, timeout))
for _, resultCh := range stmtCtx1.StatsLoad.ResultCh {
rs1 := <-resultCh
require.Error(t, rs1.Err)
}
}

0 comments on commit 53f3236

Please sign in to comment.