summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Mazetto <brodock@gmail.com>2017-10-27 21:27:17 +0200
committerGabriel Mazetto <brodock@gmail.com>2017-10-27 21:27:17 +0200
commitb19076948de9d637ab5a74ea59249cdb680c8495 (patch)
tree47b7b321c1075d72ebd18e67c25f23eb36b31e89
parentdfd6c3f824ada5558546b809fd32468325788b94 (diff)
downloadgitlab-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.rb14
-rw-r--r--app/models/storage/hashed_project.rb13
-rw-r--r--app/models/storage/legacy_project.rb7
-rw-r--r--spec/models/project_spec.rb55
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