Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2016-10-10 16:39:51 +0300
committerKamil Trzciński <ayufan@ayufan.eu>2016-10-10 16:39:51 +0300
commit359b4f9a0303e3b55004c7d4d6cacc1ef8e6e25f (patch)
tree65768e15d53f001467c23c25831ee2aea67cc335 /app/models/commit_status.rb
parentf5576b16baa7e6717a380566049235ee6ce40b05 (diff)
parent904de2d64b1b63a82cfba92e02b6c25ff94b725b (diff)
Merge branch 'fix/async-pipeline-processing-stale-data' into 'master'
Fix ci pipeline processing with async jobs ## What does this MR do? This MR fixes CI pipeline processing with asynchronous jobs called from `around_transition` provided by state machine. For details see https://github.com/pluginaweek/state_machine/issues/191 and commit f68acba. ## Why was this MR needed? Recently merged https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6650 introduced problem with asynchronous job being deployed when `around_transition` still held transaction, which caused race condition that prevented pipeline status to change in a proper way. ## What are the relevant issue numbers? Closes #23111 See merge request !6736
Diffstat (limited to 'app/models/commit_status.rb')
-rw-r--r--app/models/commit_status.rb32
1 files changed, 21 insertions, 11 deletions
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 9fa8d17e74e..5d6d534cd31 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -1,6 +1,7 @@
class CommitStatus < ActiveRecord::Base
include HasStatus
include Importable
+ include AfterCommitQueue
self.table_name = 'ci_builds'
@@ -85,25 +86,34 @@ class CommitStatus < ActiveRecord::Base
end
after_transition do |commit_status, transition|
- commit_status.pipeline.try do |pipeline|
- break if transition.loopback?
-
- if commit_status.complete?
- ProcessPipelineWorker.perform_async(pipeline.id)
+ return if transition.loopback?
+
+ commit_status.run_after_commit do
+ pipeline.try do |pipeline|
+ if complete?
+ ProcessPipelineWorker.perform_async(pipeline.id)
+ else
+ UpdatePipelineWorker.perform_async(pipeline.id)
+ end
end
-
- UpdatePipelineWorker.perform_async(pipeline.id)
end
-
- true
end
after_transition [:created, :pending, :running] => :success do |commit_status|
- MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.pipeline.project, nil).trigger(commit_status)
+ commit_status.run_after_commit do
+ # TODO, temporary fix for race condition
+ UpdatePipelineWorker.new.perform(pipeline.id)
+
+ MergeRequests::MergeWhenBuildSucceedsService
+ .new(pipeline.project, nil).trigger(self)
+ end
end
after_transition any => :failed do |commit_status|
- MergeRequests::AddTodoWhenBuildFailsService.new(commit_status.pipeline.project, nil).execute(commit_status)
+ commit_status.run_after_commit do
+ MergeRequests::AddTodoWhenBuildFailsService
+ .new(pipeline.project, nil).execute(self)
+ end
end
end