Skip to content

Commit 616b8f4

Browse files
lunnytechknowlogick
authored andcommitted
Fix deadlock when sqlite (#5118)
* fix deadlock when sqlite * fix clonelink deadlock on sqlite
1 parent 47e4efe commit 616b8f4

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

models/repo.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ func (repo *Repository) APIURL() string {
251251

252252
// APIFormat converts a Repository to api.Repository
253253
func (repo *Repository) APIFormat(mode AccessMode) *api.Repository {
254-
return repo.innerAPIFormat(mode, false)
254+
return repo.innerAPIFormat(x, mode, false)
255255
}
256256

257257
// GetCommitsCountCacheKey returns cache key used for commits count caching.
@@ -265,22 +265,22 @@ func (repo *Repository) GetCommitsCountCacheKey(contextName string, isRef bool)
265265
return fmt.Sprintf("commits-count-%d-%s-%s", repo.ID, prefix, contextName)
266266
}
267267

268-
func (repo *Repository) innerAPIFormat(mode AccessMode, isParent bool) *api.Repository {
268+
func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) *api.Repository {
269269
var parent *api.Repository
270270

271-
cloneLink := repo.CloneLink()
271+
cloneLink := repo.cloneLink(e, false)
272272
permission := &api.Permission{
273273
Admin: mode >= AccessModeAdmin,
274274
Push: mode >= AccessModeWrite,
275275
Pull: mode >= AccessModeRead,
276276
}
277277
if !isParent {
278-
err := repo.GetBaseRepo()
278+
err := repo.getBaseRepo(e)
279279
if err != nil {
280280
log.Error(4, "APIFormat: %v", err)
281281
}
282282
if repo.BaseRepo != nil {
283-
parent = repo.BaseRepo.innerAPIFormat(mode, true)
283+
parent = repo.BaseRepo.innerAPIFormat(e, mode, true)
284284
}
285285
}
286286
return &api.Repository{
@@ -617,11 +617,15 @@ func (repo *Repository) GetMirror() (err error) {
617617
// returns an error on failure (NOTE: no error is returned for
618618
// non-fork repositories, and BaseRepo will be left untouched)
619619
func (repo *Repository) GetBaseRepo() (err error) {
620+
return repo.getBaseRepo(x)
621+
}
622+
623+
func (repo *Repository) getBaseRepo(e Engine) (err error) {
620624
if !repo.IsFork {
621625
return nil
622626
}
623627

624-
repo.BaseRepo, err = GetRepositoryByID(repo.ForkID)
628+
repo.BaseRepo, err = getRepositoryByID(e, repo.ForkID)
625629
return err
626630
}
627631

@@ -889,7 +893,7 @@ func ComposeHTTPSCloneURL(owner, repo string) string {
889893
return fmt.Sprintf("%s%s/%s.git", setting.AppURL, owner, repo)
890894
}
891895

892-
func (repo *Repository) cloneLink(isUncyclo bool) *CloneLink {
896+
func (repo *Repository) cloneLink(e Engine, isUncyclo bool) *CloneLink {
893897
repoName := repo.Name
894898
if isUncyclo {
895899
repoName += ".wiki"
@@ -900,7 +904,7 @@ func (repo *Repository) cloneLink(isUncyclo bool) *CloneLink {
900904
sshUser = setting.SSH.BuiltinServerUser
901905
}
902906

903-
repo.Owner = repo.MustOwner()
907+
repo.Owner = repo.mustOwner(e)
904908
cl := new(CloneLink)
905909
if setting.SSH.Port != 22 {
906910
cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", sshUser, setting.SSH.Domain, setting.SSH.Port, repo.Owner.Name, repoName)
@@ -915,7 +919,7 @@ func (repo *Repository) cloneLink(isUncyclo bool) *CloneLink {
915919

916920
// CloneLink returns clone URLs of repository.
917921
func (repo *Repository) CloneLink() (cl *CloneLink) {
918-
return repo.cloneLink(false)
922+
return repo.cloneLink(x, false)
919923
}
920924

921925
// MigrateRepoOptions contains the repository migrate options
@@ -1192,7 +1196,7 @@ func getRepoInitFile(tp, name string) ([]byte, error) {
11921196
}
11931197
}
11941198

1195-
func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
1199+
func prepareRepoCommit(e Engine, repo *Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
11961200
// Clone to temporary path and do the init commit.
11971201
_, stderr, err := process.GetManager().Exec(
11981202
fmt.Sprintf("initRepository(git clone): %s", repoPath),
@@ -1208,7 +1212,7 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
12081212
return fmt.Errorf("getRepoInitFile[%s]: %v", opts.Readme, err)
12091213
}
12101214

1211-
cloneLink := repo.CloneLink()
1215+
cloneLink := repo.cloneLink(e, false)
12121216
match := map[string]string{
12131217
"Name": repo.Name,
12141218
"Description": repo.Description,
@@ -1281,7 +1285,7 @@ func initRepository(e Engine, repoPath string, u *User, repo *Repository, opts C
12811285

12821286
defer os.RemoveAll(tmpDir)
12831287

1284-
if err = prepareRepoCommit(repo, tmpDir, repoPath, opts); err != nil {
1288+
if err = prepareRepoCommit(e, repo, tmpDir, repoPath, opts); err != nil {
12851289
return fmt.Errorf("prepareRepoCommit: %v", err)
12861290
}
12871291

@@ -1386,7 +1390,7 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
13861390
return fmt.Errorf("addRepository: %v", err)
13871391
} else if err = prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{
13881392
Action: api.HookRepoCreated,
1389-
Repository: repo.APIFormat(AccessModeOwner),
1393+
Repository: repo.innerAPIFormat(e, AccessModeOwner, false),
13901394
Organization: u.APIFormat(),
13911395
Sender: doer.APIFormat(),
13921396
}); err != nil {

models/wiki.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func UncycloFilenameToName(filename string) (string, error) {
5757

5858
// UncycloCloneLink returns clone URLs of repository wiki.
5959
func (repo *Repository) UncycloCloneLink() *CloneLink {
60-
return repo.cloneLink(true)
60+
return repo.cloneLink(x, true)
6161
}
6262

6363
// UncycloPath returns wiki data path by given user and repository name.

0 commit comments

Comments
 (0)