summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/post_merge_service.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-04-01 06:07:50 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-04-01 06:07:50 +0000
commite50050a8756a20b6aa118edbad3369674e4c63ba (patch)
tree0f9ae83c168b01707753e066294f7b55aa0968a5 /app/services/merge_requests/post_merge_service.rb
parent1dffba3bd853076efc1107b2dd63e221e75a210c (diff)
downloadgitlab-ce-e50050a8756a20b6aa118edbad3369674e4c63ba.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/merge_requests/post_merge_service.rb')
-rw-r--r--app/services/merge_requests/post_merge_service.rb23
1 files changed, 17 insertions, 6 deletions
diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb
index 0364c0dd479..a3d7f623546 100644
--- a/app/services/merge_requests/post_merge_service.rb
+++ b/app/services/merge_requests/post_merge_service.rb
@@ -8,17 +8,28 @@ module MergeRequests
#
class PostMergeService < MergeRequests::BaseService
def execute(merge_request)
- merge_request.mark_as_merged
- close_issues(merge_request)
- todo_service.merge_merge_request(merge_request, current_user)
- create_event(merge_request)
- create_note(merge_request)
+ # These operations need to happen transactionally
+ ActiveRecord::Base.transaction(requires_new: true) do
+ merge_request.mark_as_merged
+
+ # These options do not call external services and should be
+ # relatively quick enough to put in a Transaction
+ create_event(merge_request)
+ todo_service.merge_merge_request(merge_request, current_user)
+ end
+
+ # These operations are idempotent so can be safely run multiple times
notification_service.merge_mr(merge_request, current_user)
- execute_hooks(merge_request, 'merge')
+ create_note(merge_request)
+ close_issues(merge_request)
invalidate_cache_counts(merge_request, users: merge_request.assignees)
merge_request.update_project_counter_caches
delete_non_latest_diffs(merge_request)
cleanup_environments(merge_request)
+
+ # Anything after this point will be executed at-most-once. Less important activity only
+ # TODO: make all the work in here a separate sidekiq job so it can go in the transaction
+ execute_hooks(merge_request, 'merge')
end
private