diff options
author | Gabriel Mazetto <brodock@gmail.com> | 2017-10-27 21:27:17 +0200 |
---|---|---|
committer | Gabriel Mazetto <brodock@gmail.com> | 2017-10-27 21:27:17 +0200 |
commit | b19076948de9d637ab5a74ea59249cdb680c8495 (patch) | |
tree | 47b7b321c1075d72ebd18e67c25f23eb36b31e89 | |
parent | dfd6c3f824ada5558546b809fd32468325788b94 (diff) | |
download | gitlab-ce-b19076948de9d637ab5a74ea59249cdb680c8495.tar.gz |
Moved renaming operations to storage layer abstraction
When project storage_version is `2` means attachments are using
hashed storage.
-rw-r--r-- | app/models/project.rb | 14 | ||||
-rw-r--r-- | app/models/storage/hashed_project.rb | 13 | ||||
-rw-r--r-- | app/models/storage/legacy_project.rb | 7 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 55 |
4 files changed, 76 insertions, 13 deletions
diff --git a/app/models/project.rb b/app/models/project.rb index 7185b4d44fc..d9bd6362e70 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -26,7 +26,10 @@ class Project < ActiveRecord::Base NUMBER_OF_PERMITTED_BOARDS = 1 UNKNOWN_IMPORT_URL = 'http://unknown.git'.freeze - LATEST_STORAGE_VERSION = 1 + # Hashed Storage versions handle rolling out new storage to project and dependents models + # 1: repository + # 2: attachments + LATEST_STORAGE_VERSION = 2 cache_markdown_field :description, pipeline: :description @@ -1384,7 +1387,7 @@ class Project < ActiveRecord::Base if storage.rename_repo Gitlab::AppLogger.info "Project was renamed: #{full_path_was} -> #{new_full_path}" rename_repo_notify! - after_rename_repo + storage.after_rename_repo else Rails.logger.error "Repository could not be renamed: #{full_path_was} -> #{new_full_path}" @@ -1404,13 +1407,6 @@ class Project < ActiveRecord::Base reload_repository! end - def after_rename_repo - path_before_change = previous_changes['path'].first - - Gitlab::UploadsTransfer.new.rename_project(path_before_change, self.path, namespace.full_path) - Gitlab::PagesTransfer.new.rename_project(path_before_change, self.path, namespace.full_path) - end - def running_or_pending_build_count(force: false) Rails.cache.fetch(['projects', id, 'running_or_pending_build_count'], force: force) do builds.running_or_pending.count(:all) diff --git a/app/models/storage/hashed_project.rb b/app/models/storage/hashed_project.rb index f025f40994e..6be365166c4 100644 --- a/app/models/storage/hashed_project.rb +++ b/app/models/storage/hashed_project.rb @@ -32,6 +32,19 @@ module Storage true end + def after_rename_repo + path_before_change = project.previous_changes['path'].first + + # We need to check if project had been rolled out to move resource to hashed storage or not and decide + # if we need execute any take action or no-op. + + unless project.storage_version >= 2 + Gitlab::UploadsTransfer.new.rename_project(path_before_change, project.path, project.namespace.full_path) + end + + Gitlab::PagesTransfer.new.rename_project(path_before_change, project.path, project.namespace.full_path) + end + private # Generates the hash for the project path and name on disk diff --git a/app/models/storage/legacy_project.rb b/app/models/storage/legacy_project.rb index 9d9e5e1d352..6e7dce8d25a 100644 --- a/app/models/storage/legacy_project.rb +++ b/app/models/storage/legacy_project.rb @@ -47,5 +47,12 @@ module Storage false end + + def after_rename_repo + path_before_change = project.previous_changes['path'].first + + Gitlab::UploadsTransfer.new.rename_project(path_before_change, project.path, project.namespace.full_path) + Gitlab::PagesTransfer.new.rename_project(path_before_change, project.path, project.namespace.full_path) + end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 74eba7e33f6..d80af378140 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2452,6 +2452,7 @@ describe Project do context 'legacy storage' do let(:project) { create(:project, :repository) } let(:gitlab_shell) { Gitlab::Shell.new } + let(:project_storage) { project.send(:storage) } before do allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) @@ -2546,6 +2547,30 @@ describe Project do it { expect { subject }.to raise_error(StandardError) } end + + context 'gitlab pages' do + before do + expect(project_storage).to receive(:rename_repo) { true } + end + + it 'moves pages folder to new location' do + expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project) + + project.rename_repo + end + end + + context 'attachments' do + before do + expect(project_storage).to receive(:rename_repo) { true } + end + + it 'moves uploads folder to new location' do + expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project) + + project.rename_repo + end + end end describe '#pages_path' do @@ -2649,10 +2674,6 @@ describe Project do .to receive(:execute_hooks_for) .with(project, :rename) - expect_any_instance_of(Gitlab::UploadsTransfer) - .to receive(:rename_project) - .with('foo', project.path, project.namespace.full_path) - expect(project).to receive(:expire_caches_before_rename) expect(project).to receive(:expires_full_path_cache) @@ -2673,6 +2694,32 @@ describe Project do it { expect { subject }.to raise_error(StandardError) } end + + context 'gitlab pages' do + it 'moves pages folder to new location' do + expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project) + + project.rename_repo + end + end + + context 'attachments' do + it 'keeps uploads folder location unchanged' do + expect_any_instance_of(Gitlab::UploadsTransfer).not_to receive(:rename_project) + + project.rename_repo + end + + context 'when not rolled out' do + let(:project) { create(:project, :repository, storage_version: 1) } + + it 'moves pages folder to new location' do + expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project) + + project.rename_repo + end + end + end end describe '#pages_path' do |