From b7797db46cec37ad28944c2f6dfdee726d6b93ff Mon Sep 17 00:00:00 2001 From: Song Gao Date: Thu, 18 Aug 2022 14:18:53 +0800 Subject: [PATCH] executor: let analyze isolevel controlled by tidb_enable_analyze_snapshot (#37193) ref pingcap/tidb#36983 --- distsql/distsql_test.go | 2 +- distsql/request_builder.go | 4 ++-- distsql/request_builder_test.go | 4 ++-- executor/analyze_col.go | 5 ++++- executor/analyze_idx.go | 5 ++++- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index d8523b4e83..50e21f6b66 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -157,7 +157,7 @@ func TestAnalyze(t *testing.T) { sctx := newMockSessionContext() sctx.GetSessionVars().EnableChunkRPC = false request, err := (&RequestBuilder{}).SetKeyRanges(nil). - SetAnalyzeRequest(&tipb.AnalyzeReq{}). + SetAnalyzeRequest(&tipb.AnalyzeReq{}, kv.RC). SetKeepOrder(true). Build() require.NoError(t, err) diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 5cc2059ece..aae83a0dd0 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -158,12 +158,12 @@ func (builder *RequestBuilder) SetDAGRequest(dag *tipb.DAGRequest) *RequestBuild } // SetAnalyzeRequest sets the request type to "ReqTypeAnalyze" and construct request data. -func (builder *RequestBuilder) SetAnalyzeRequest(ana *tipb.AnalyzeReq) *RequestBuilder { +func (builder *RequestBuilder) SetAnalyzeRequest(ana *tipb.AnalyzeReq, isoLevel kv.IsoLevel) *RequestBuilder { if builder.err == nil { builder.Request.Tp = kv.ReqTypeAnalyze builder.Request.Data, builder.err = ana.Marshal() builder.Request.NotFillCache = true - builder.Request.IsolationLevel = kv.SI + builder.Request.IsolationLevel = isoLevel builder.Request.Priority = kv.PriorityLow } diff --git a/distsql/request_builder_test.go b/distsql/request_builder_test.go index 946899a66b..53ea7ff4a3 100644 --- a/distsql/request_builder_test.go +++ b/distsql/request_builder_test.go @@ -481,7 +481,7 @@ func TestRequestBuilder5(t *testing.T) { } actual, err := (&RequestBuilder{}).SetKeyRanges(keyRanges). - SetAnalyzeRequest(&tipb.AnalyzeReq{}). + SetAnalyzeRequest(&tipb.AnalyzeReq{}, kv.RC). SetKeepOrder(true). SetConcurrency(15). Build() @@ -494,7 +494,7 @@ func TestRequestBuilder5(t *testing.T) { KeepOrder: true, Desc: false, Concurrency: 15, - IsolationLevel: kv.SI, + IsolationLevel: kv.RC, Priority: 1, NotFillCache: true, ReadReplicaScope: kv.GlobalReplicaScope, diff --git a/executor/analyze_col.go b/executor/analyze_col.go index f27e6c5221..a846816b18 100644 --- a/executor/analyze_col.go +++ b/executor/analyze_col.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -109,13 +110,15 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe reqBuilder := builder.SetHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.TableID.GetStatisticsID()}, e.handleCols != nil && !e.handleCols.IsInt(), ranges, nil) builder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTagger()) startTS := uint64(math.MaxUint64) + isoLevel := kv.RC if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { startTS = e.snapshot + isoLevel = kv.SI } // Always set KeepOrder of the request to be true, in order to compute // correct `correlation` of columns. kvReq, err := reqBuilder. - SetAnalyzeRequest(e.analyzePB). + SetAnalyzeRequest(e.analyzePB, isoLevel). SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency). diff --git a/executor/analyze_idx.go b/executor/analyze_idx.go index 5726f0846f..2ac3bce77c 100644 --- a/executor/analyze_idx.go +++ b/executor/analyze_idx.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -144,11 +145,13 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang } kvReqBuilder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTagger()) startTS := uint64(math.MaxUint64) + isoLevel := kv.RC if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { startTS = e.snapshot + isoLevel = kv.SI } kvReq, err := kvReqBuilder. - SetAnalyzeRequest(e.analyzePB). + SetAnalyzeRequest(e.analyzePB, isoLevel). SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency).