diff --git a/services/pull/merge.go b/services/pull/merge.go index a69a1d3e63..f15132a37c 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -170,13 +170,6 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U return fmt.Errorf("unable to load head repo: %w", err) } - ctx, releaser, err := globallock.Lock(ctx, getPullWorkingLockKey(pr.ID)) - if err != nil { - log.Error("lock.Lock(): %v", err) - return fmt.Errorf("lock.Lock: %w", err) - } - defer releaser() - prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests) if err != nil { log.Error("pr.BaseRepo.GetUnit(unit.TypePullRequests): %v", err) @@ -189,11 +182,18 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: mergeStyle} } + lockCtx, releaser, err := globallock.Lock(ctx, getPullWorkingLockKey(pr.ID)) + if err != nil { + log.Error("lock.Lock(): %v", err) + return fmt.Errorf("lock.Lock: %w", err) + } + defer func() { go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "") }() - _, err = doMergeAndPush(ctx, pr, doer, mergeStyle, expectedHeadCommitID, message, repo_module.PushTriggerPRMergeToBase) + _, err = doMergeAndPush(lockCtx, pr, doer, mergeStyle, expectedHeadCommitID, message, repo_module.PushTriggerPRMergeToBase) + releaser() if err != nil { return err } @@ -492,14 +492,13 @@ func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullReques // MergedManually mark pr as merged manually func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, commitID string) error { - ctx, releaser, err := globallock.Lock(ctx, getPullWorkingLockKey(pr.ID)) + lockCtx, releaser, err := globallock.Lock(ctx, getPullWorkingLockKey(pr.ID)) if err != nil { log.Error("lock.Lock(): %v", err) return fmt.Errorf("lock.Lock: %w", err) } - defer releaser() - if err := db.WithTx(ctx, func(ctx context.Context) error { + err = db.WithTx(lockCtx, func(ctx context.Context) error { if err := pr.LoadBaseRepo(ctx); err != nil { return err } @@ -549,7 +548,9 @@ func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *use return fmt.Errorf("SetMerged failed") } return nil - }); err != nil { + }) + releaser() + if err != nil { return err } diff --git a/services/repository/transfer.go b/services/repository/transfer.go index ec644f3f3a..aff900bda0 100644 --- a/services/repository/transfer.go +++ b/services/repository/transfer.go @@ -42,13 +42,13 @@ func TransferOwnership(ctx context.Context, doer, newOwner *user_model.User, rep oldOwner := repo.Owner - ctx, releaser, err := globallock.Lock(ctx, getRepoWorkingLockKey(repo.ID)) + lockCtx, releaser, err := globallock.Lock(ctx, getRepoWorkingLockKey(repo.ID)) if err != nil { log.Error("lock.Lock(): %v", err) return fmt.Errorf("lock.Lock: %w", err) } - if err := transferOwnership(ctx, doer, newOwner.Name, repo); err != nil { + if err := transferOwnership(lockCtx, doer, newOwner.Name, repo); err != nil { releaser() return err } @@ -368,13 +368,13 @@ func ChangeRepositoryName(ctx context.Context, doer *user_model.User, repo *repo // repo so that we can automatically rename the repo path and updates the // local copy's origin accordingly. - ctx, releaser, err := globallock.Lock(ctx, getRepoWorkingLockKey(repo.ID)) + lockCtx, releaser, err := globallock.Lock(ctx, getRepoWorkingLockKey(repo.ID)) if err != nil { log.Error("lock.Lock(): %v", err) return fmt.Errorf("lock.Lock: %w", err) } - if err := changeRepositoryName(ctx, repo, newRepoName); err != nil { + if err := changeRepositoryName(lockCtx, repo, newRepoName); err != nil { releaser() return err }