Skip to content

Commit

Permalink
session: fix deadlock when init domain failed (#40409) (#40413)
Browse files Browse the repository at this point in the history
close #40408
  • Loading branch information
ti-chi-bot authored Jan 9, 2023
1 parent 7c4ec4c commit 1d0122a
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 9 deletions.
8 changes: 6 additions & 2 deletions domain/domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,7 @@ func (do *Domain) Close() {
const resourceIdleTimeout = 3 * time.Minute // resources in the ResourcePool will be recycled after idleTimeout

// NewDomain creates a new domain. Should not create multiple domains for the same store.
func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duration, idxUsageSyncLease time.Duration, dumpFileGcLease time.Duration, factory pools.Factory, onClose func()) *Domain {
func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duration, idxUsageSyncLease time.Duration, dumpFileGcLease time.Duration, factory pools.Factory) *Domain {
capacity := 200 // capacity of the sysSessionPool size
do := &Domain{
store: store,
Expand All @@ -735,7 +735,6 @@ func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duratio
slowQuery: newTopNSlowQueries(30, time.Hour*24*7, 500),
indexUsageSyncLease: idxUsageSyncLease,
dumpFileGcChecker: &dumpFileGcChecker{gcLease: dumpFileGcLease, paths: []string{GetPlanReplayerDirName(), GetOptimizerTraceDirName()}},
onClose: onClose,
expiredTimeStamp4PC: types.NewTime(types.ZeroCoreTime, mysql.TypeTimestamp, types.DefaultFsp),
}

Expand Down Expand Up @@ -883,6 +882,11 @@ func (do *Domain) Init(ddlLease time.Duration, sysExecutorFactory func(*Domain)
return nil
}

// SetOnClose used to set do.onClose func.
func (do *Domain) SetOnClose(onClose func()) {
do.onClose = onClose
}

type sessionPool struct {
resources chan pools.Resource
factory pools.Factory
Expand Down
4 changes: 2 additions & 2 deletions domain/domain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func TestInfo(t *testing.T) {
Storage: s,
pdAddrs: []string{cluster.Members[0].GRPCURL()}}
ddlLease := 80 * time.Millisecond
dom := NewDomain(mockStore, ddlLease, 0, 0, 0, mockFactory, nil)
dom := NewDomain(mockStore, ddlLease, 0, 0, 0, mockFactory)
defer func() {
dom.Close()
err := s.Close()
Expand Down Expand Up @@ -154,7 +154,7 @@ func TestStatWorkRecoverFromPanic(t *testing.T) {
require.NoError(t, err)

ddlLease := 80 * time.Millisecond
dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory, nil)
dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory)

metrics.PanicCounter.Reset()
// Since the stats lease is 0 now, so create a new ticker will panic.
Expand Down
9 changes: 4 additions & 5 deletions session/tidb.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,7 @@ func (dm *domainMap) Get(store kv.Storage) (d *domain.Domain, err error) {
zap.Stringer("index usage sync lease", idxUsageSyncLease))
factory := createSessionFunc(store)
sysFactory := createSessionWithDomainFunc(store)
onClose := func() {
dm.Delete(store)
}
d = domain.NewDomain(store, ddlLease, statisticLease, idxUsageSyncLease, planReplayerGCLease, factory, onClose)
d = domain.NewDomain(store, ddlLease, statisticLease, idxUsageSyncLease, planReplayerGCLease, factory)
err1 = d.Init(ddlLease, sysFactory)
if err1 != nil {
// If we don't clean it, there are some dirty data when retrying the function of Init.
Expand All @@ -95,8 +92,10 @@ func (dm *domainMap) Get(store kv.Storage) (d *domain.Domain, err error) {
if err != nil {
return nil, err
}

dm.domains[key] = d
d.SetOnClose(func() {
dm.Delete(store)
})

return
}
Expand Down

0 comments on commit 1d0122a

Please sign in to comment.