summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-09-25 11:15:03 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-09-25 11:15:03 +0000
commitf68acbacd9f7635abc3c4f8f4b3ebd1c011c76e3 (patch)
tree44ca89f4e6dadbb94e77ff6b9744538783ea00eb /app
parentd0e74984631ece8579fe26262ad94c17a934ee26 (diff)
parentbd2991b4618528a719b03c46ceb7befb230f0dd9 (diff)
downloadgitlab-ce-f68acbacd9f7635abc3c4f8f4b3ebd1c011c76e3.tar.gz
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
Diffstat (limited to 'app')
-rw-r--r--app/models/project.rb9
1 files changed, 7 insertions, 2 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index a7ea1236b86..e912c48467d 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -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