Skip to content

Commit c34a6b6

Browse files
authored
executor,util: Stat inner/inter zone network traffic for MPP tasks (#58683)
close #58682
1 parent 4e1cf8a commit c34a6b6

File tree

9 files changed

+508
-95
lines changed

9 files changed

+508
-95
lines changed

DEPS.bzl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5906,13 +5906,13 @@ def go_deps():
59065906
name = "com_github_pingcap_tipb",
59075907
build_file_proto_mode = "disable_global",
59085908
importpath = "github.com/pingcap/tipb",
5909-
sha256 = "923efe448355ba420cfbd82e93df2f99b08c3fb36191b1f2cabdd3bf32904852",
5910-
strip_prefix = "github.com/pingcap/[email protected]20241105053214-f91fdb81a69e",
5909+
sha256 = "87ef3f28a30822c9e2a4966bfb573025ae332ac2a045be1026641e121fccb7e6",
5910+
strip_prefix = "github.com/pingcap/[email protected]20241212101007-246f91188357",
59115911
urls = [
5912-
"http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241105053214-f91fdb81a69e.zip",
5913-
"http://ats.apps.svc/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241105053214-f91fdb81a69e.zip",
5914-
"https://cache.hawkingrei.com/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241105053214-f91fdb81a69e.zip",
5915-
"https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241105053214-f91fdb81a69e.zip",
5912+
"http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241212101007-246f91188357.zip",
5913+
"http://ats.apps.svc/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241212101007-246f91188357.zip",
5914+
"https://cache.hawkingrei.com/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241212101007-246f91188357.zip",
5915+
"https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/tipb/com_github_pingcap_tipb-v0.0.0-20241212101007-246f91188357.zip",
59165916
],
59175917
)
59185918
go_repository(

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ require (
9191
github.com/pingcap/log v1.1.1-0.20241212030209-7e3ff8601a2a
9292
github.com/pingcap/sysutil v1.0.1-0.20240311050922-ae81ee01f3a5
9393
github.com/pingcap/tidb/pkg/parser v0.0.0-20211011031125-9b13dc409c5e
94-
github.com/pingcap/tipb v0.0.0-20241105053214-f91fdb81a69e
94+
github.com/pingcap/tipb v0.0.0-20241212101007-246f91188357
9595
github.com/prometheus/client_golang v1.20.5
9696
github.com/prometheus/client_model v0.6.1
9797
github.com/prometheus/common v0.62.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,8 @@ github.com/pingcap/log v1.1.1-0.20241212030209-7e3ff8601a2a h1:WIhmJBlNGmnCWH6TL
684684
github.com/pingcap/log v1.1.1-0.20241212030209-7e3ff8601a2a/go.mod h1:ORfBOFp1eteu2odzsyaxI+b8TzJwgjwyQcGhI+9SfEA=
685685
github.com/pingcap/sysutil v1.0.1-0.20240311050922-ae81ee01f3a5 h1:T4pXRhBflzDeAhmOQHNPRRogMYxP13V7BkYw3ZsoSfE=
686686
github.com/pingcap/sysutil v1.0.1-0.20240311050922-ae81ee01f3a5/go.mod h1:rlimy0GcTvjiJqvD5mXTRr8O2eNZPBrcUgiWVYp9530=
687-
github.com/pingcap/tipb v0.0.0-20241105053214-f91fdb81a69e h1:7DdrYVwWpYr4o1AyKl8T376B4h2RsMEjkmom8MxQuuM=
688-
github.com/pingcap/tipb v0.0.0-20241105053214-f91fdb81a69e/go.mod h1:zrnYy8vReNODg8G0OiYaX9OK+kpq+rK1jHmvd1DnIWw=
687+
github.com/pingcap/tipb v0.0.0-20241212101007-246f91188357 h1:s58UXyaWMNeaoeuVPZdrkm5Uk7NcODHqICGCUQ3A9s4=
688+
github.com/pingcap/tipb v0.0.0-20241212101007-246f91188357/go.mod h1:zrnYy8vReNODg8G0OiYaX9OK+kpq+rK1jHmvd1DnIWw=
689689
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
690690
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
691691
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=

pkg/executor/adapter.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,8 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults boo
14171417
// but we set it again in case we missed some code paths.
14181418
sessVars.StmtCtx.SetPlan(a.Plan)
14191419
}
1420+
1421+
a.updateMPPNetworkTraffic()
14201422
// `LowSlowQuery` and `SummaryStmt` must be called before recording `PrevStmt`.
14211423
a.LogSlowQuery(txnTS, succ, hasMoreResults)
14221424
a.SummaryStmt(succ)
@@ -1799,6 +1801,28 @@ func GetResultRowsCount(stmtCtx *stmtctx.StatementContext, p base.Plan) int64 {
17991801
return runtimeStatsColl.GetPlanActRows(p.ID())
18001802
}
18011803

1804+
func (a *ExecStmt) updateMPPNetworkTraffic() {
1805+
sessVars := a.Ctx.GetSessionVars()
1806+
stmtCtx := sessVars.StmtCtx
1807+
runtimeStatsColl := stmtCtx.RuntimeStatsColl
1808+
if runtimeStatsColl == nil {
1809+
return
1810+
}
1811+
tiflashNetworkStats := runtimeStatsColl.GetStmtCopRuntimeStats().TiflashNetworkStats
1812+
if tiflashNetworkStats == nil {
1813+
return
1814+
}
1815+
var tikvExecDetail *util.ExecDetails
1816+
tikvExecDetailRaw := a.GoCtx.Value(util.ExecDetailsKey)
1817+
if tikvExecDetailRaw == nil {
1818+
tikvExecDetailRaw = &util.ExecDetails{}
1819+
a.GoCtx = context.WithValue(a.GoCtx, util.ExecDetailsKey, tikvExecDetailRaw)
1820+
}
1821+
1822+
tikvExecDetail = tikvExecDetailRaw.(*util.ExecDetails)
1823+
tiflashNetworkStats.UpdateTiKVExecDetails(tikvExecDetail)
1824+
}
1825+
18021826
// getFlatPlan generates a FlatPhysicalPlan from the plan stored in stmtCtx.plan,
18031827
// then stores it in stmtCtx.flatPlan.
18041828
func getFlatPlan(stmtCtx *stmtctx.StatementContext) *plannercore.FlatPhysicalPlan {

pkg/executor/internal/mpp/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ go_library(
1111
visibility = ["//pkg/executor:__subpackages__"],
1212
deps = [
1313
"//pkg/config",
14+
"//pkg/ddl/placement",
1415
"//pkg/distsql",
1516
"//pkg/executor/internal/builder",
1617
"//pkg/executor/internal/util",
@@ -25,6 +26,7 @@ go_library(
2526
"//pkg/store/copr",
2627
"//pkg/store/driver/backoff",
2728
"//pkg/store/driver/error",
29+
"//pkg/store/helper",
2830
"//pkg/util",
2931
"//pkg/util/execdetails",
3032
"//pkg/util/logutil",
@@ -34,6 +36,7 @@ go_library(
3436
"@com_github_pingcap_failpoint//:failpoint",
3537
"@com_github_pingcap_kvproto//pkg/mpp",
3638
"@com_github_pingcap_tipb//go-tipb",
39+
"@com_github_tikv_client_go_v2//tikv",
3740
"@com_github_tikv_client_go_v2//util",
3841
"@org_uber_go_zap//:zap",
3942
],

pkg/executor/internal/mpp/local_mpp_coordinator.go

Lines changed: 147 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/pingcap/failpoint"
2828
"github.com/pingcap/kvproto/pkg/mpp"
2929
"github.com/pingcap/tidb/pkg/config"
30+
"github.com/pingcap/tidb/pkg/ddl/placement"
3031
"github.com/pingcap/tidb/pkg/distsql"
3132
"github.com/pingcap/tidb/pkg/executor/internal/builder"
3233
"github.com/pingcap/tidb/pkg/executor/internal/util"
@@ -40,11 +41,13 @@ import (
4041
"github.com/pingcap/tidb/pkg/store/copr"
4142
"github.com/pingcap/tidb/pkg/store/driver/backoff"
4243
derr "github.com/pingcap/tidb/pkg/store/driver/error"
44+
"github.com/pingcap/tidb/pkg/store/helper"
4345
util2 "github.com/pingcap/tidb/pkg/util"
4446
"github.com/pingcap/tidb/pkg/util/execdetails"
4547
"github.com/pingcap/tidb/pkg/util/logutil"
4648
"github.com/pingcap/tidb/pkg/util/memory"
4749
"github.com/pingcap/tipb/go-tipb"
50+
"github.com/tikv/client-go/v2/tikv"
4851
clientutil "github.com/tikv/client-go/v2/util"
4952
"go.uber.org/zap"
5053
)
@@ -189,7 +192,7 @@ func NewLocalMPPCoordinator(ctx context.Context, sctx sessionctx.Context, is inf
189192
return coord
190193
}
191194

192-
func (c *localMppCoordinator) appendMPPDispatchReq(pf *plannercore.Fragment) error {
195+
func (c *localMppCoordinator) appendMPPDispatchReq(pf *plannercore.Fragment, allTiFlashZoneInfo map[string]string) error {
193196
dagReq, err := builder.ConstructDAGReq(c.sessionCtx, []base.PhysicalPlan{pf.ExchangeSender}, kv.TiFlash)
194197
if err != nil {
195198
return errors.Trace(err)
@@ -202,6 +205,8 @@ func (c *localMppCoordinator) appendMPPDispatchReq(pf *plannercore.Fragment) err
202205
} else {
203206
dagReq.EncodeType = tipb.EncodeType_TypeChunk
204207
}
208+
zoneHelper := taskZoneInfoHelper{}
209+
zoneHelper.init(allTiFlashZoneInfo)
205210
for _, mppTask := range pf.ExchangeSender.Tasks {
206211
if mppTask.PartitionTableIDs != nil {
207212
err = util.UpdateExecutorTableID(context.Background(), dagReq.RootExecutor, true, mppTask.PartitionTableIDs)
@@ -217,6 +222,9 @@ func (c *localMppCoordinator) appendMPPDispatchReq(pf *plannercore.Fragment) err
217222
if err != nil {
218223
return err
219224
}
225+
zoneHelper.isRoot = pf.IsRoot
226+
zoneHelper.currentTaskZone = zoneHelper.allTiFlashZoneInfo[mppTask.Meta.GetAddress()]
227+
zoneHelper.fillSameZoneFlagForExchange(dagReq.RootExecutor)
220228
pbData, err := dagReq.Marshal()
221229
if err != nil {
222230
return errors.Trace(err)
@@ -343,6 +351,127 @@ func (c *localMppCoordinator) fixTaskForCTEStorageAndReader(exec *tipb.Executor,
343351
return nil
344352
}
345353

354+
// taskZoneInfoHelper used to help reset exchange executor's same zone flags
355+
type taskZoneInfoHelper struct {
356+
allTiFlashZoneInfo map[string]string
357+
// exchangeZoneInfo is used to cache one mpp task's zone info:
358+
// key is executor id, value is zone info array
359+
// for ExchangeSender, it's target tiflash nodes' zone info; for ExchangeReceiver, it's source tiflash nodes' zone info
360+
exchangeZoneInfo map[string][]string
361+
tidbZone string
362+
currentTaskZone string
363+
isRoot bool
364+
}
365+
366+
func (h *taskZoneInfoHelper) init(allTiFlashZoneInfo map[string]string) {
367+
h.tidbZone = config.GetGlobalConfig().Labels[placement.DCLabelKey]
368+
h.allTiFlashZoneInfo = allTiFlashZoneInfo
369+
// initial capacity to 2, for one exchange sender and one exchange receiver
370+
h.exchangeZoneInfo = make(map[string][]string, 2)
371+
}
372+
373+
func (h *taskZoneInfoHelper) tryQuickFillWithUncertainZones(exec *tipb.Executor, slots int, sameZoneFlags []bool) (bool, []bool) {
374+
if exec.ExecutorId == nil || len(h.currentTaskZone) == 0 {
375+
for i := 0; i < slots; i++ {
376+
sameZoneFlags = append(sameZoneFlags, true)
377+
}
378+
return true, sameZoneFlags
379+
}
380+
if h.isRoot && exec.Tp == tipb.ExecType_TypeExchangeSender {
381+
sameZoneFlags = append(sameZoneFlags, len(h.tidbZone) == 0 || h.currentTaskZone == h.tidbZone)
382+
return true, sameZoneFlags
383+
}
384+
385+
// For CTE exchange nodes, data is passed locally, set all to true
386+
if (exec.Tp == tipb.ExecType_TypeExchangeSender && len(exec.ExchangeSender.UpstreamCteTaskMeta) != 0) ||
387+
(exec.Tp == tipb.ExecType_TypeExchangeReceiver && len(exec.ExchangeReceiver.OriginalCtePrdocuerTaskMeta) != 0) {
388+
for i := 0; i < slots; i++ {
389+
sameZoneFlags = append(sameZoneFlags, true)
390+
}
391+
return true, sameZoneFlags
392+
}
393+
394+
return false, sameZoneFlags
395+
}
396+
397+
func (h *taskZoneInfoHelper) collectExchangeZoneInfos(encodedTaskMeta [][]byte, slots int) []string {
398+
zoneInfos := make([]string, 0, slots)
399+
for _, taskBytes := range encodedTaskMeta {
400+
taskMeta := &mpp.TaskMeta{}
401+
err := taskMeta.Unmarshal(taskBytes)
402+
if err != nil {
403+
zoneInfos = append(zoneInfos, "")
404+
continue
405+
}
406+
zoneInfos = append(zoneInfos, h.allTiFlashZoneInfo[taskMeta.GetAddress()])
407+
}
408+
return zoneInfos
409+
}
410+
411+
func (h *taskZoneInfoHelper) inferSameZoneFlag(exec *tipb.Executor, encodedTaskMeta [][]byte) []bool {
412+
slots := len(encodedTaskMeta)
413+
sameZoneFlags := make([]bool, 0, slots)
414+
filled := false
415+
if filled, sameZoneFlags = h.tryQuickFillWithUncertainZones(exec, slots, sameZoneFlags); filled {
416+
return sameZoneFlags
417+
}
418+
zoneInfos, exist := h.exchangeZoneInfo[*exec.ExecutorId]
419+
if !exist {
420+
zoneInfos = h.collectExchangeZoneInfos(encodedTaskMeta, slots)
421+
h.exchangeZoneInfo[*exec.ExecutorId] = zoneInfos
422+
}
423+
424+
if len(zoneInfos) != slots {
425+
// This branch is for safety purpose, not expected
426+
for i := 0; i < slots; i++ {
427+
sameZoneFlags = append(sameZoneFlags, true)
428+
}
429+
return sameZoneFlags
430+
}
431+
432+
for i := 0; i < slots; i++ {
433+
sameZoneFlags = append(sameZoneFlags, len(zoneInfos[i]) == 0 || h.currentTaskZone == zoneInfos[i])
434+
}
435+
return sameZoneFlags
436+
}
437+
438+
func (h *taskZoneInfoHelper) fillSameZoneFlagForExchange(exec *tipb.Executor) {
439+
children := make([]*tipb.Executor, 0, 2)
440+
switch exec.Tp {
441+
case tipb.ExecType_TypeTableScan, tipb.ExecType_TypePartitionTableScan, tipb.ExecType_TypeIndexScan:
442+
case tipb.ExecType_TypeSelection:
443+
children = append(children, exec.Selection.Child)
444+
case tipb.ExecType_TypeAggregation, tipb.ExecType_TypeStreamAgg:
445+
children = append(children, exec.Aggregation.Child)
446+
case tipb.ExecType_TypeTopN:
447+
children = append(children, exec.TopN.Child)
448+
case tipb.ExecType_TypeLimit:
449+
children = append(children, exec.Limit.Child)
450+
case tipb.ExecType_TypeExchangeSender:
451+
children = append(children, exec.ExchangeSender.Child)
452+
exec.ExchangeSender.SameZoneFlag = h.inferSameZoneFlag(exec, exec.ExchangeSender.EncodedTaskMeta)
453+
case tipb.ExecType_TypeExchangeReceiver:
454+
exec.ExchangeReceiver.SameZoneFlag = h.inferSameZoneFlag(exec, exec.ExchangeReceiver.EncodedTaskMeta)
455+
case tipb.ExecType_TypeJoin:
456+
children = append(children, exec.Join.Children...)
457+
case tipb.ExecType_TypeProjection:
458+
children = append(children, exec.Projection.Child)
459+
case tipb.ExecType_TypeWindow:
460+
children = append(children, exec.Window.Child)
461+
case tipb.ExecType_TypeSort:
462+
children = append(children, exec.Sort.Child)
463+
case tipb.ExecType_TypeExpand:
464+
children = append(children, exec.Expand.Child)
465+
case tipb.ExecType_TypeExpand2:
466+
children = append(children, exec.Expand2.Child)
467+
default:
468+
logutil.BgLogger().Warn(fmt.Sprintf("unknown new tipb protocol %d", exec.Tp))
469+
}
470+
for _, child := range children {
471+
h.fillSameZoneFlagForExchange(child)
472+
}
473+
}
474+
346475
func getActualPhysicalPlan(plan base.Plan) base.PhysicalPlan {
347476
if plan == nil {
348477
return nil
@@ -788,8 +917,24 @@ func (c *localMppCoordinator) Execute(ctx context.Context) (kv.Response, []kv.Ke
788917
}
789918
c.nodeCnt = len(nodeInfo)
790919

920+
var allTiFlashZoneInfo map[string]string
921+
if c.sessionCtx.GetStore() == nil {
922+
allTiFlashZoneInfo = make(map[string]string)
923+
} else if tikvStore, ok := c.sessionCtx.GetStore().(helper.Storage); ok {
924+
cache := tikvStore.GetRegionCache()
925+
allTiFlashStores := cache.GetTiFlashStores(tikv.LabelFilterNoTiFlashWriteNode)
926+
allTiFlashZoneInfo = make(map[string]string, len(allTiFlashStores))
927+
for _, tiflashStore := range allTiFlashStores {
928+
tiflashStoreAddr := tiflashStore.GetAddr()
929+
if tiflashZone, isSet := tiflashStore.GetLabelValue(placement.DCLabelKey); isSet {
930+
allTiFlashZoneInfo[tiflashStoreAddr] = tiflashZone
931+
}
932+
}
933+
} else {
934+
allTiFlashZoneInfo = make(map[string]string)
935+
}
791936
for _, frag := range frags {
792-
err = c.appendMPPDispatchReq(frag)
937+
err = c.appendMPPDispatchReq(frag, allTiFlashZoneInfo)
793938
if err != nil {
794939
return nil, nil, errors.Trace(err)
795940
}

pkg/executor/internal/mpp/local_mpp_coordinator_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,84 @@ func TestNeedReportExecutionSummary(t *testing.T) {
5353
limitTIDB2.SetChildren(join)
5454
require.True(t, needReportExecutionSummary(limitTIDB2, 10, false))
5555
}
56+
57+
func mockTaskZoneInfoHelper(isRoot bool, taskZone string, tidbZone string, storeZoneMpp map[string]string, exchangeZoneInfo map[string][]string) taskZoneInfoHelper {
58+
helper := taskZoneInfoHelper{
59+
tidbZone: tidbZone,
60+
currentTaskZone: taskZone,
61+
isRoot: isRoot,
62+
allTiFlashZoneInfo: storeZoneMpp,
63+
exchangeZoneInfo: exchangeZoneInfo,
64+
}
65+
return helper
66+
}
67+
68+
func TestZoneHelperTryQuickFill(t *testing.T) {
69+
slots := 3
70+
allTiflashZoneInfo := make(map[string]string, slots)
71+
exchangeZoneInfo := make(map[string][]string, 2)
72+
helper := mockTaskZoneInfoHelper(false, "", "east", allTiflashZoneInfo, exchangeZoneInfo)
73+
exchangeSenderID := "ExchangeSender_1"
74+
sender := &tipb.Executor{
75+
ExecutorId: &exchangeSenderID,
76+
Tp: tipb.ExecType_TypeExchangeSender,
77+
ExchangeSender: &tipb.ExchangeSender{
78+
UpstreamCteTaskMeta: nil,
79+
},
80+
}
81+
sameZoneFlags := make([]bool, 0, slots)
82+
quickFill := false
83+
// When task zone is empty, then the function returns true, and all sameZoneFlags are true
84+
quickFill, sameZoneFlags = helper.tryQuickFillWithUncertainZones(sender, slots, sameZoneFlags)
85+
require.True(t, quickFill)
86+
require.Equal(t, slots, len(sameZoneFlags))
87+
for i := 0; i < slots; i++ {
88+
require.True(t, sameZoneFlags[i])
89+
}
90+
91+
// When task is root task, and executor is exchangeSender then the function compares tidbZone with currentTaskZone
92+
helper.isRoot = true
93+
helper.currentTaskZone = "west"
94+
slots = 1
95+
sameZoneFlags = make([]bool, 0, slots)
96+
quickFill, sameZoneFlags = helper.tryQuickFillWithUncertainZones(sender, slots, sameZoneFlags)
97+
require.True(t, quickFill)
98+
require.Equal(t, slots, len(sameZoneFlags))
99+
for i := 0; i < slots; i++ {
100+
require.False(t, sameZoneFlags[i])
101+
}
102+
103+
helper.currentTaskZone = "east"
104+
sameZoneFlags = make([]bool, 0, slots)
105+
quickFill, sameZoneFlags = helper.tryQuickFillWithUncertainZones(sender, slots, sameZoneFlags)
106+
require.True(t, quickFill)
107+
require.Equal(t, slots, len(sameZoneFlags))
108+
for i := 0; i < slots; i++ {
109+
require.True(t, sameZoneFlags[i])
110+
}
111+
112+
// When task is neither root exchange sender nor current task zone is empty, return false, and empty sameZoneFlags
113+
helper.isRoot = false
114+
helper.currentTaskZone = "west"
115+
slots = 3
116+
sameZoneFlags = make([]bool, 0, slots)
117+
quickFill, sameZoneFlags = helper.tryQuickFillWithUncertainZones(sender, slots, sameZoneFlags)
118+
require.False(t, quickFill)
119+
require.Equal(t, 0, len(sameZoneFlags))
120+
121+
helper.isRoot = true
122+
helper.currentTaskZone = "west"
123+
slots = 3
124+
sameZoneFlags = make([]bool, 0, slots)
125+
exchangeReceiverID := "ExchangeReceiver_2"
126+
receiver := &tipb.Executor{
127+
ExecutorId: &exchangeReceiverID,
128+
Tp: tipb.ExecType_TypeExchangeReceiver,
129+
ExchangeReceiver: &tipb.ExchangeReceiver{
130+
OriginalCtePrdocuerTaskMeta: nil,
131+
},
132+
}
133+
quickFill, sameZoneFlags = helper.tryQuickFillWithUncertainZones(receiver, slots, sameZoneFlags)
134+
require.False(t, quickFill)
135+
require.Equal(t, 0, len(sameZoneFlags))
136+
}

0 commit comments

Comments
 (0)