Skip to content

Commit 6afbef5

Browse files
authored
Do DB update after merge in hammer context (#21401) (#21416)
Backport #21401 When merge was changed to run in the background context, the db updates were still running in request context. This means that the merge could be successful but the db not be updated. This PR changes both these to run in the hammer context, this is not complete rollback protection but it's much better. Fix #21332 Signed-off-by: Andrew Thornton <[email protected]>
1 parent d745780 commit 6afbef5

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

services/pull/merge.go

+12-10
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
user_model "code.gitea.io/gitea/models/user"
2929
"code.gitea.io/gitea/modules/cache"
3030
"code.gitea.io/gitea/modules/git"
31+
"code.gitea.io/gitea/modules/graceful"
3132
"code.gitea.io/gitea/modules/log"
3233
"code.gitea.io/gitea/modules/notification"
3334
"code.gitea.io/gitea/modules/references"
@@ -165,9 +166,10 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
165166
go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "")
166167
}()
167168

168-
// TODO: make it able to do this in a database session
169-
mergeCtx := context.Background()
170-
pr.MergedCommitID, err = rawMerge(mergeCtx, pr, doer, mergeStyle, expectedHeadCommitID, message)
169+
// Run the merge in the hammer context to prevent cancellation
170+
hammerCtx := graceful.GetManager().HammerContext()
171+
172+
pr.MergedCommitID, err = rawMerge(hammerCtx, pr, doer, mergeStyle, expectedHeadCommitID, message)
171173
if err != nil {
172174
return err
173175
}
@@ -176,18 +178,18 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
176178
pr.Merger = doer
177179
pr.MergerID = doer.ID
178180

179-
if _, err := pr.SetMerged(ctx); err != nil {
181+
if _, err := pr.SetMerged(hammerCtx); err != nil {
180182
log.Error("setMerged [%d]: %v", pr.ID, err)
181183
}
182184

183-
if err := pr.LoadIssueCtx(ctx); err != nil {
185+
if err := pr.LoadIssueCtx(hammerCtx); err != nil {
184186
log.Error("loadIssue [%d]: %v", pr.ID, err)
185187
}
186188

187-
if err := pr.Issue.LoadRepo(ctx); err != nil {
189+
if err := pr.Issue.LoadRepo(hammerCtx); err != nil {
188190
log.Error("loadRepo for issue [%d]: %v", pr.ID, err)
189191
}
190-
if err := pr.Issue.Repo.GetOwner(ctx); err != nil {
192+
if err := pr.Issue.Repo.GetOwner(hammerCtx); err != nil {
191193
log.Error("GetOwner for issue repo [%d]: %v", pr.ID, err)
192194
}
193195

@@ -197,17 +199,17 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
197199
cache.Remove(pr.Issue.Repo.GetCommitsCountCacheKey(pr.BaseBranch, true))
198200

199201
// Resolve cross references
200-
refs, err := pr.ResolveCrossReferences(ctx)
202+
refs, err := pr.ResolveCrossReferences(hammerCtx)
201203
if err != nil {
202204
log.Error("ResolveCrossReferences: %v", err)
203205
return nil
204206
}
205207

206208
for _, ref := range refs {
207-
if err = ref.LoadIssueCtx(ctx); err != nil {
209+
if err = ref.LoadIssueCtx(hammerCtx); err != nil {
208210
return err
209211
}
210-
if err = ref.Issue.LoadRepo(ctx); err != nil {
212+
if err = ref.Issue.LoadRepo(hammerCtx); err != nil {
211213
return err
212214
}
213215
close := ref.RefAction == references.XRefActionCloses

0 commit comments

Comments
 (0)