Commit f68acbac authored by Dmytro Zaporozhets (DZ)'s avatar Dmytro Zaporozhets (DZ) 🌴
Browse files

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
parents d0e74984 bd2991b4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
@@ -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'
+3 −0
Original line number Diff line number Diff line
@@ -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)
+7 −2
Original line number Diff line number Diff line
@@ -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 @@ def set_last_activity_at
    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 @@ def saved?
    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