From 6a9851eae9216a67ca1b1334d9245918b705d1da Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Jun 2017 14:46:48 -0300 Subject: [PATCH 1/3] Perform housekeeping only when an import of a fresh project is completed --- app/models/project.rb | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 35d8f9a0154..29eab671acf 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -352,7 +352,16 @@ class Project < ActiveRecord::Base after_transition started: :finished do |project, _| project.reset_cache_and_import_attrs - project.perform_housekeeping + + if Gitlab::ImportSources.importer_names.include?(project.import_type) && project.repo_exists? + project.run_after_commit do + begin + Projects::HousekeepingService.new(project).execute + rescue Projects::HousekeepingService::LeaseTaken => e + Rails.logger.info("Could not perform housekeeping for project #{project.path_with_namespace} (#{project.id}): #{e}") + end + end + end end end @@ -510,22 +519,6 @@ class Project < ActiveRecord::Base ProjectCacheWorker.perform_async(self.id) end - remove_import_data - end - - def perform_housekeeping - return unless repo_exists? - - run_after_commit do - begin - Projects::HousekeepingService.new(self).execute - rescue Projects::HousekeepingService::LeaseTaken => e - Rails.logger.info("Could not perform housekeeping for project #{self.path_with_namespace} (#{self.id}): #{e}") - end - end - end - - def remove_import_data import_data&.destroy end From 4b446bedcc9491b883708bc13a60e9daad34ecb5 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Jun 2017 14:47:14 -0300 Subject: [PATCH 2/3] Add CHANGELOG --- changelogs/unreleased/fix-34417.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/fix-34417.yml diff --git a/changelogs/unreleased/fix-34417.yml b/changelogs/unreleased/fix-34417.yml new file mode 100644 index 00000000000..5f012ad0c81 --- /dev/null +++ b/changelogs/unreleased/fix-34417.yml @@ -0,0 +1,4 @@ +--- +title: Perform housekeeping only when an import of a fresh project is completed +merge_request: +author: From 639639ef8a759c3956502a12df62c138022ee104 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Jun 2017 15:58:26 -0300 Subject: [PATCH 3/3] Add tests for project import state transition: [:started] => [:finished] --- spec/models/project_spec.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index cc22b8a4edc..0d3494d9e58 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1509,6 +1509,40 @@ describe Project, models: true do end end + describe 'project import state transitions' do + context 'state transition: [:started] => [:finished]' do + let(:housekeeping_service) { spy } + + before do + allow(Projects::HousekeepingService).to receive(:new) { housekeeping_service } + end + + it 'performs housekeeping when an import of a fresh project is completed' do + project = create(:project_empty_repo, :import_started, import_type: :github) + + project.import_finish + + expect(housekeeping_service).to have_received(:execute) + end + + it 'does not perform housekeeping when project repository does not exist' do + project = create(:empty_project, :import_started, import_type: :github) + + project.import_finish + + expect(housekeeping_service).not_to have_received(:execute) + end + + it 'does not perform housekeeping when project does not have a valid import type' do + project = create(:empty_project, :import_started, import_type: nil) + + project.import_finish + + expect(housekeeping_service).not_to have_received(:execute) + end + end + end + describe '#latest_successful_builds_for' do def create_pipeline(status = 'success') create(:ci_pipeline, project: project,