diff options
Diffstat (limited to 'app/services/projects/update_repository_storage_service.rb')
-rw-r--r-- | app/services/projects/update_repository_storage_service.rb | 69 |
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') |