Skip to content

Commit

Permalink
executor: make projection executor unparallel for insert/update/delete (
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-srebot authored Feb 8, 2022
1 parent 8b35d00 commit 51208d0
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ type executorBuilder struct {
// ExplicitStaleness means whether the 'SELECT' clause are using 'AS OF TIMESTAMP' to perform stale read explicitly.
explicitStaleness bool
txnScope string
inUpdateStmt bool
inDeleteStmt bool
inInsertStmt bool
}

// CTEStorages stores resTbl and iterInTbl for CTEExec.
Expand Down Expand Up @@ -781,6 +784,7 @@ func (b *executorBuilder) buildSetConfig(v *plannercore.SetConfig) Executor {
}

func (b *executorBuilder) buildInsert(v *plannercore.Insert) Executor {
b.inInsertStmt = true
if v.SelectPlan != nil {
// Try to update the forUpdateTS for insert/replace into select statements.
// Set the selectPlan parameter to nil to make it always update the forUpdateTS.
Expand Down Expand Up @@ -1387,6 +1391,12 @@ func (b *executorBuilder) buildProjection(v *plannercore.PhysicalProjection) Exe
if int64(v.StatsCount()) < int64(b.ctx.GetSessionVars().MaxChunkSize) {
e.numWorkers = 0
}

// Use un-parallel projection for query that write on memdb to avoid data race.
// See also https://github.com/pingcap/tidb/issues/26832
if b.inUpdateStmt || b.inDeleteStmt || b.inInsertStmt || b.hasLock {
e.numWorkers = 0
}
return e
}

Expand Down Expand Up @@ -1860,6 +1870,7 @@ func (b *executorBuilder) buildSplitRegion(v *plannercore.SplitRegion) Executor
}

func (b *executorBuilder) buildUpdate(v *plannercore.Update) Executor {
b.inUpdateStmt = true
tblID2table := make(map[int64]table.Table, len(v.TblColPosInfos))
multiUpdateOnSameTable := make(map[int64]bool)
for _, info := range v.TblColPosInfos {
Expand Down Expand Up @@ -1931,6 +1942,7 @@ func getAssignFlag(ctx sessionctx.Context, v *plannercore.Update, schemaLen int)
}

func (b *executorBuilder) buildDelete(v *plannercore.Delete) Executor {
b.inDeleteStmt = true
tblID2table := make(map[int64]table.Table, len(v.TblColPosInfos))
for _, info := range v.TblColPosInfos {
tblID2table[info.TblID], _ = b.is.TableByID(info.TblID)
Expand Down

0 comments on commit 51208d0

Please sign in to comment.