From eba07867ef180cf094ce81be93d673d32a6df712 Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
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 595f0c9422..d2f06846c2 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 3edcc7b5a0..9f0fa3bad9 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 8907691dde..e5943b5a2d 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
 	}