From eba07867ef180cf094ce81be93d673d32a6df712 Mon Sep 17 00:00:00 2001 From: zeripath Date: Mon, 13 Dec 2021 22:59:39 +0000 Subject: [PATCH] Prevent deadlock in create issue (#17970) --- models/issue.go | 2 +- models/repo/issue.go | 9 +++++++-- models/repo/repo.go | 5 +++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/models/issue.go b/models/issue.go index 595f0c942..d2f06846c 100644 --- a/models/issue.go +++ b/models/issue.go @@ -141,7 +141,7 @@ func (issue *Issue) isTimetrackerEnabled(ctx context.Context) bool { log.Error(fmt.Sprintf("loadRepo: %v", err)) return false } - return issue.Repo.IsTimetrackerEnabled() + return issue.Repo.IsTimetrackerEnabledCtx(ctx) } // GetPullRequest returns the issue pull request diff --git a/models/repo/issue.go b/models/repo/issue.go index 3edcc7b5a..9f0fa3bad 100644 --- a/models/repo/issue.go +++ b/models/repo/issue.go @@ -28,13 +28,18 @@ func (repo *Repository) CanEnableTimetracker() bool { // IsTimetrackerEnabled returns whether or not the timetracker is enabled. It returns the default value from config if an error occurs. func (repo *Repository) IsTimetrackerEnabled() bool { + return repo.IsTimetrackerEnabledCtx(db.DefaultContext) +} + +// IsTimetrackerEnabledCtx returns whether or not the timetracker is enabled. It returns the default value from config if an error occurs. +func (repo *Repository) IsTimetrackerEnabledCtx(ctx context.Context) bool { if !setting.Service.EnableTimetracking { return false } var u *RepoUnit var err error - if u, err = repo.GetUnit(unit.TypeIssues); err != nil { + if u, err = repo.GetUnitCtx(ctx, unit.TypeIssues); err != nil { return setting.Service.DefaultEnableTimetracking } return u.IssuesConfig().EnableTimetracker @@ -59,7 +64,7 @@ func (repo *Repository) IsDependenciesEnabled() bool { func (repo *Repository) IsDependenciesEnabledCtx(ctx context.Context) bool { var u *RepoUnit var err error - if u, err = repo.getUnit(ctx, unit.TypeIssues); err != nil { + if u, err = repo.GetUnitCtx(ctx, unit.TypeIssues); err != nil { log.Trace("%s", err) return setting.Service.DefaultEnableDependencies } diff --git a/models/repo/repo.go b/models/repo/repo.go index 8907691dd..e5943b5a2 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -312,10 +312,11 @@ func (repo *Repository) MustGetUnit(tp unit.Type) *RepoUnit { // GetUnit returns a RepoUnit object func (repo *Repository) GetUnit(tp unit.Type) (*RepoUnit, error) { - return repo.getUnit(db.DefaultContext, tp) + return repo.GetUnitCtx(db.DefaultContext, tp) } -func (repo *Repository) getUnit(ctx context.Context, tp unit.Type) (*RepoUnit, error) { +// GetUnitCtx returns a RepoUnit object +func (repo *Repository) GetUnitCtx(ctx context.Context, tp unit.Type) (*RepoUnit, error) { if err := repo.LoadUnits(ctx); err != nil { return nil, err }