Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/projects/update_repository_storage_service.rb')
-rw-r--r--app/services/projects/update_repository_storage_service.rb69
1 files changed, 45 insertions, 24 deletions
diff --git a/app/services/projects/update_repository_storage_service.rb b/app/services/projects/update_repository_storage_service.rb
index 2e5de9411d1..0632df6f6d7 100644
--- a/app/services/projects/update_repository_storage_service.rb
+++ b/app/services/projects/update_repository_storage_service.rb
@@ -1,37 +1,49 @@
# frozen_string_literal: true
module Projects
- class UpdateRepositoryStorageService < BaseService
- include Gitlab::ShellAdapter
-
+ class UpdateRepositoryStorageService
Error = Class.new(StandardError)
SameFilesystemError = Class.new(Error)
- def initialize(project)
- @project = project
+ attr_reader :repository_storage_move
+ delegate :project, :destination_storage_name, to: :repository_storage_move
+ delegate :repository, to: :project
+
+ def initialize(repository_storage_move)
+ @repository_storage_move = repository_storage_move
end
- def execute(new_repository_storage_key)
- raise SameFilesystemError if same_filesystem?(project.repository.storage, new_repository_storage_key)
+ def execute
+ repository_storage_move.start!
- mirror_repositories(new_repository_storage_key)
+ raise SameFilesystemError if same_filesystem?(repository.storage, destination_storage_name)
- mark_old_paths_for_archive
+ mirror_repositories
- project.update(repository_storage: new_repository_storage_key, repository_read_only: false)
- project.leave_pool_repository
- project.track_project_repository
+ project.transaction do
+ mark_old_paths_for_archive
+
+ repository_storage_move.finish!
+ project.update!(repository_storage: destination_storage_name, repository_read_only: false)
+ project.leave_pool_repository
+ project.track_project_repository
+ end
enqueue_housekeeping
- success
+ ServiceResponse.success
- rescue Error, ArgumentError, Gitlab::Git::BaseError => e
- project.update(repository_read_only: false)
+ rescue StandardError => e
+ project.transaction do
+ repository_storage_move.do_fail!
+ project.update!(repository_read_only: false)
+ end
Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path)
- error(s_("UpdateRepositoryStorage|Error moving repository storage for %{project_full_path} - %{message}") % { project_full_path: project.full_path, message: e.message })
+ ServiceResponse.error(
+ message: s_("UpdateRepositoryStorage|Error moving repository storage for %{project_full_path} - %{message}") % { project_full_path: project.full_path, message: e.message }
+ )
end
private
@@ -40,15 +52,19 @@ module Projects
Gitlab::GitalyClient.filesystem_id(old_storage) == Gitlab::GitalyClient.filesystem_id(new_storage)
end
- def mirror_repositories(new_repository_storage_key)
- mirror_repository(new_repository_storage_key)
+ def mirror_repositories
+ mirror_repository
if project.wiki.repository_exists?
- mirror_repository(new_repository_storage_key, type: Gitlab::GlRepository::WIKI)
+ mirror_repository(type: Gitlab::GlRepository::WIKI)
+ end
+
+ if project.design_repository.exists?
+ mirror_repository(type: ::Gitlab::GlRepository::DESIGN)
end
end
- def mirror_repository(new_storage_key, type: Gitlab::GlRepository::PROJECT)
+ def mirror_repository(type: Gitlab::GlRepository::PROJECT)
unless wait_for_pushes(type)
raise Error, s_('UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes') % { type: type.name }
end
@@ -60,7 +76,7 @@ module Projects
# Initialize a git repository on the target path
new_repository = Gitlab::Git::Repository.new(
- new_storage_key,
+ destination_storage_name,
raw_repository.relative_path,
raw_repository.gl_repository,
full_path
@@ -94,11 +110,18 @@ module Projects
wiki.disk_path,
"#{new_project_path}.wiki")
end
+
+ if design_repository.exists?
+ GitlabShellWorker.perform_async(:mv_repository,
+ old_repository_storage,
+ design_repository.disk_path,
+ "#{new_project_path}.design")
+ end
end
end
def moved_path(path)
- "#{path}+#{project.id}+moved+#{Time.now.to_i}"
+ "#{path}+#{project.id}+moved+#{Time.current.to_i}"
end
# The underlying FetchInternalRemote call uses a `git fetch` to move data
@@ -128,5 +151,3 @@ module Projects
end
end
end
-
-Projects::UpdateRepositoryStorageService.prepend_if_ee('EE::Projects::UpdateRepositoryStorageService')