Merge branch 'fix-stuck-forked-project-import' into 'master'
Fix bug where projects would appear to be stuck in the forked import state A race condition existed between when Rails committed the `import_status` to `started` and when the Sidekiq worker forked a project. If this fork were quick, it's possible that the worker would attempt to move into the `finished` state before the `started` state took effect. As mentioned in https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#cannot-find-modelname-with-id12345, we can either delay the worker to ensure the DB has a chance to update, or use the nice `after_commit_queue` gem to schedule the task after the state machine commit. See: * https://github.com/pluginaweek/state_machine/issues/191 * https://github.com/shellycloud/after_commit_queue Closes #2736 See merge request !1434
This commit is contained in:
commit
f68acbacd9
4 changed files with 13 additions and 2 deletions
|
@ -1,6 +1,7 @@
|
|||
Please view this file on the master branch, on stable branches it's out of date.
|
||||
|
||||
v 8.1.0 (unreleased)
|
||||
- Fix bug where projects would appear to be stuck in the forked import state (Stan Hu)
|
||||
- Show CI status on all pages where commits list is rendered
|
||||
- Automatically enable CI when push .gitlab-ci.yml file to repository
|
||||
- Move CI charts to project graphs area
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -121,6 +121,8 @@ end
|
|||
|
||||
# State machine
|
||||
gem "state_machine", '~> 1.2.0'
|
||||
# Run events after state machine commits
|
||||
gem 'after_commit_queue'
|
||||
|
||||
# Issue tags
|
||||
gem 'acts-as-taggable-on', '~> 3.4'
|
||||
|
|
|
@ -42,6 +42,8 @@ GEM
|
|||
acts-as-taggable-on (3.5.0)
|
||||
activerecord (>= 3.2, < 5)
|
||||
addressable (2.3.8)
|
||||
after_commit_queue (1.1.0)
|
||||
rails (>= 3.0)
|
||||
annotate (2.6.10)
|
||||
activerecord (>= 3.2, <= 4.3)
|
||||
rake (~> 10.4)
|
||||
|
@ -787,6 +789,7 @@ DEPENDENCIES
|
|||
activerecord-session_store (~> 0.1.0)
|
||||
acts-as-taggable-on (~> 3.4)
|
||||
addressable (~> 2.3.8)
|
||||
after_commit_queue
|
||||
annotate (~> 2.6.0)
|
||||
asana (~> 0.0.6)
|
||||
asciidoctor (~> 1.5.2)
|
||||
|
|
|
@ -39,6 +39,7 @@ class Project < ActiveRecord::Base
|
|||
include Gitlab::VisibilityLevel
|
||||
include Referable
|
||||
include Sortable
|
||||
include AfterCommitQueue
|
||||
|
||||
extend Gitlab::ConfigHelper
|
||||
extend Enumerize
|
||||
|
@ -191,7 +192,7 @@ class Project < ActiveRecord::Base
|
|||
state :finished
|
||||
state :failed
|
||||
|
||||
after_transition any => :started, do: :add_import_job
|
||||
after_transition any => :started, do: :schedule_add_import_job
|
||||
after_transition any => :finished, do: :clear_import_data
|
||||
end
|
||||
|
||||
|
@ -275,13 +276,17 @@ class Project < ActiveRecord::Base
|
|||
id && persisted?
|
||||
end
|
||||
|
||||
def schedule_add_import_job
|
||||
run_after_commit(:add_import_job)
|
||||
end
|
||||
|
||||
def add_import_job
|
||||
if forked?
|
||||
unless RepositoryForkWorker.perform_async(id, forked_from_project.path_with_namespace, self.namespace.path)
|
||||
import_fail
|
||||
end
|
||||
else
|
||||
RepositoryImportWorker.perform_in(2.seconds, id)
|
||||
RepositoryImportWorker.perform_async(id)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue