bindInfo: fix datarace on bindings (#40846)

close pingcap/tidb#40843
This commit is contained in:
Song Gao
2023-01-30 19:59:55 +08:00
committed by GitHub
parent 11839ac39e
commit 86a6694de0
3 changed files with 15 additions and 3 deletions

View File

@ -115,6 +115,17 @@ type BindRecord struct {
Bindings []Binding
}
// Copy get the copy of bindRecord
func (br *BindRecord) Copy() *BindRecord {
nbr := &BindRecord{
OriginalSQL: br.OriginalSQL,
Db: br.Db,
}
nbr.Bindings = make([]Binding, len(br.Bindings))
copy(nbr.Bindings, br.Bindings)
return nbr
}
// HasEnabledBinding checks if there are any enabled bindings in bind record.
func (br *BindRecord) HasEnabledBinding() bool {
for _, binding := range br.Bindings {

View File

@ -192,7 +192,6 @@ go_library(
"//util/servermemorylimit",
"//util/set",
"//util/size",
"//util/slice",
"//util/sqlexec",
"//util/stmtsummary",
"//util/stringutil",

View File

@ -69,7 +69,6 @@ import (
"github.com/pingcap/tidb/util/memory"
"github.com/pingcap/tidb/util/sem"
"github.com/pingcap/tidb/util/set"
"github.com/pingcap/tidb/util/slice"
"github.com/pingcap/tidb/util/sqlexec"
"github.com/pingcap/tidb/util/stringutil"
"golang.org/x/exp/slices"
@ -317,7 +316,10 @@ func (e *ShowExec) fetchShowBind() error {
} else {
tmp = domain.GetDomain(e.ctx).BindHandle().GetAllBindRecord()
}
bindRecords := slice.Copy(tmp)
bindRecords := make([]*bindinfo.BindRecord, 0)
for _, bindRecord := range tmp {
bindRecords = append(bindRecords, bindRecord.Copy())
}
// Remove the invalid bindRecord.
ind := 0
for _, bindData := range bindRecords {