Skip to content

Commit 3261fee

Browse files
aidendouti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#45802
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
1 parent 42f5e38 commit 3261fee

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

domain/BUILD.bazel

+3
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,16 @@ go_test(
128128
"//parser/ast",
129129
"//parser/auth",
130130
"//parser/model",
131+
"//parser/mysql",
131132
"//parser/terror",
132133
"//server",
133134
"//session",
135+
"//sessionctx/stmtctx",
134136
"//sessionctx/variable",
135137
"//store/mockstore",
136138
"//testkit",
137139
"//testkit/testsetup",
140+
"//types",
138141
"//util",
139142
"//util/mock",
140143
"//util/replayer",

domain/domain.go

+30-7
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ type Domain struct {
146146
memoryUsageAlarmHandle *memoryusagealarm.Handle
147147
serverMemoryLimitHandle *servermemorylimit.Handle
148148
// TODO: use Run for each process in future pr
149+
<<<<<<< HEAD
149150
wg *util.WaitGroupEnhancedWrapper
150151
statsUpdating atomicutil.Int32
151152
cancel context.CancelFunc
@@ -157,6 +158,28 @@ type Domain struct {
157158
logBackupAdvancer *daemon.OwnerDaemon
158159
historicalStatsWorker *HistoricalStatsWorker
159160
ttlJobManager atomic.Pointer[ttlworker.JobManager]
161+
=======
162+
wg *util.WaitGroupEnhancedWrapper
163+
statsUpdating atomicutil.Int32
164+
cancel context.CancelFunc
165+
indexUsageSyncLease time.Duration
166+
dumpFileGcChecker *dumpFileGcChecker
167+
planReplayerHandle *planReplayerHandle
168+
extractTaskHandle *ExtractHandle
169+
expiredTimeStamp4PC struct {
170+
// let `expiredTimeStamp4PC` use its own lock to avoid any block across domain.Reload()
171+
// and compiler.Compile(), see issue https://github.com/pingcap/tidb/issues/45400
172+
sync.RWMutex
173+
expiredTimeStamp types.Time
174+
}
175+
176+
logBackupAdvancer *daemon.OwnerDaemon
177+
historicalStatsWorker *HistoricalStatsWorker
178+
ttlJobManager atomic.Pointer[ttlworker.JobManager]
179+
runawayManager *resourcegroup.RunawayManager
180+
runawaySyncer *runawaySyncer
181+
resourceGroupsController *rmclient.ResourceGroupsController
182+
>>>>>>> 29727caacb8 (domain: use dedicated lock for expiredTimeStamp4PC (#45802))
160183

161184
serverID uint64
162185
serverIDSession *concurrency.Session
@@ -472,18 +495,18 @@ func (do *Domain) GetSnapshotMeta(startTS uint64) (*meta.Meta, error) {
472495

473496
// ExpiredTimeStamp4PC gets expiredTimeStamp4PC from domain.
474497
func (do *Domain) ExpiredTimeStamp4PC() types.Time {
475-
do.m.Lock()
476-
defer do.m.Unlock()
498+
do.expiredTimeStamp4PC.RLock()
499+
defer do.expiredTimeStamp4PC.RUnlock()
477500

478-
return do.expiredTimeStamp4PC
501+
return do.expiredTimeStamp4PC.expiredTimeStamp
479502
}
480503

481504
// SetExpiredTimeStamp4PC sets the expiredTimeStamp4PC from domain.
482505
func (do *Domain) SetExpiredTimeStamp4PC(time types.Time) {
483-
do.m.Lock()
484-
defer do.m.Unlock()
506+
do.expiredTimeStamp4PC.Lock()
507+
defer do.expiredTimeStamp4PC.Unlock()
485508

486-
do.expiredTimeStamp4PC = time
509+
do.expiredTimeStamp4PC.expiredTimeStamp = time
487510
}
488511

489512
// DDL gets DDL from domain.
@@ -1021,7 +1044,6 @@ func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duratio
10211044
slowQuery: newTopNSlowQueries(30, time.Hour*24*7, 500),
10221045
indexUsageSyncLease: idxUsageSyncLease,
10231046
dumpFileGcChecker: &dumpFileGcChecker{gcLease: dumpFileGcLease, paths: []string{replayer.GetPlanReplayerDirName(), GetOptimizerTraceDirName(), GetExtractTaskDirName()}},
1024-
expiredTimeStamp4PC: types.NewTime(types.ZeroCoreTime, mysql.TypeTimestamp, types.DefaultFsp),
10251047
mdlCheckTableInfo: &mdlCheckTableInfo{
10261048
mu: sync.Mutex{},
10271049
jobsVerMap: make(map[int64]int64),
@@ -1037,6 +1059,7 @@ func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duratio
10371059
do.serverMemoryLimitHandle = servermemorylimit.NewServerMemoryLimitHandle(do.exit)
10381060
do.sysProcesses = SysProcesses{mu: &sync.RWMutex{}, procMap: make(map[uint64]sessionctx.Context)}
10391061
do.initDomainSysVars()
1062+
do.expiredTimeStamp4PC.expiredTimeStamp = types.NewTime(types.ZeroCoreTime, mysql.TypeTimestamp, types.DefaultFsp)
10401063
return do
10411064
}
10421065

domain/domain_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ import (
3434
"github.com/pingcap/tidb/metrics"
3535
"github.com/pingcap/tidb/parser/ast"
3636
"github.com/pingcap/tidb/parser/model"
37+
"github.com/pingcap/tidb/parser/mysql"
38+
"github.com/pingcap/tidb/sessionctx/stmtctx"
3739
"github.com/pingcap/tidb/sessionctx/variable"
3840
"github.com/pingcap/tidb/store/mockstore"
41+
"github.com/pingcap/tidb/types"
3942
"github.com/pingcap/tidb/util/mock"
4043
dto "github.com/prometheus/client_model/go"
4144
"github.com/stretchr/testify/require"
@@ -187,6 +190,17 @@ func TestStatWorkRecoverFromPanic(t *testing.T) {
187190
scope := dom.GetScope("status")
188191
require.Equal(t, variable.DefaultStatusVarScopeFlag, scope)
189192

193+
// default expiredTimeStamp4PC = "0000-00-00 00:00:00"
194+
ts := types.NewTime(types.ZeroCoreTime, mysql.TypeTimestamp, types.DefaultFsp)
195+
expiredTimeStamp := dom.ExpiredTimeStamp4PC()
196+
require.Equal(t, expiredTimeStamp, ts)
197+
198+
// set expiredTimeStamp4PC to "2023-08-02 12:15:00"
199+
ts, _ = types.ParseTimestamp(&stmtctx.StatementContext{TimeZone: time.UTC}, "2023-08-02 12:15:00")
200+
dom.SetExpiredTimeStamp4PC(ts)
201+
expiredTimeStamp = dom.ExpiredTimeStamp4PC()
202+
require.Equal(t, expiredTimeStamp, ts)
203+
190204
err = store.Close()
191205
require.NoError(t, err)
192206

0 commit comments

Comments
 (0)