debian-mirror-gitlab/app/services/projects/hashed_storage/base_repository_service.rb

116 lines
3.9 KiB
Ruby
Raw Normal View History

2019-03-02 22:35:43 +05:30
# frozen_string_literal: true
module Projects
module HashedStorage
2019-07-07 11:18:12 +05:30
# Returned when repository can't be made read-only because there is already a git transfer in progress
RepositoryInUseError = Class.new(StandardError)
2019-03-02 22:35:43 +05:30
class BaseRepositoryService < BaseService
include Gitlab::ShellAdapter
2020-05-24 23:13:21 +05:30
attr_reader :old_disk_path, :new_disk_path, :old_storage_version,
:logger, :move_wiki, :move_design
2019-03-02 22:35:43 +05:30
2019-12-26 22:10:19 +05:30
def initialize(project:, old_disk_path:, logger: nil)
2019-03-02 22:35:43 +05:30
@project = project
@logger = logger || Gitlab::AppLogger
@old_disk_path = old_disk_path
@move_wiki = has_wiki?
2020-05-24 23:13:21 +05:30
@move_design = has_design?
2019-03-02 22:35:43 +05:30
end
protected
def has_wiki?
2019-12-21 20:55:43 +05:30
gitlab_shell.repository_exists?(project.repository_storage, "#{old_wiki_disk_path}.git")
2019-03-02 22:35:43 +05:30
end
2020-05-24 23:13:21 +05:30
def has_design?
gitlab_shell.repository_exists?(project.repository_storage, "#{old_design_disk_path}.git")
end
2019-03-02 22:35:43 +05:30
def move_repository(from_name, to_name)
2019-12-21 20:55:43 +05:30
from_exists = gitlab_shell.repository_exists?(project.repository_storage, "#{from_name}.git")
to_exists = gitlab_shell.repository_exists?(project.repository_storage, "#{to_name}.git")
2019-03-02 22:35:43 +05:30
# If we don't find the repository on either original or target we should log that as it could be an issue if the
# project was not originally empty.
if !from_exists && !to_exists
logger.warn "Can't find a repository on either source or target paths for #{project.full_path} (ID=#{project.id}) ..."
2019-07-07 11:18:12 +05:30
# We return true so we still reflect the change in the database.
# Next time the repository is (re)created it will be under the new storage layout
return true
2019-03-02 22:35:43 +05:30
elsif !from_exists
# Repository have been moved already.
return true
end
2020-04-22 19:07:51 +05:30
gitlab_shell.mv_repository(project.repository_storage, from_name, to_name).tap do |moved|
if moved
logger.info("Repository moved from '#{from_name}' to '#{to_name}' (PROJECT_ID=#{project.id})")
else
logger.error("Repository cannot be moved from '#{from_name}' to '#{to_name}' (PROJECT_ID=#{project.id})")
end
end
2019-03-02 22:35:43 +05:30
end
2020-01-01 13:55:28 +05:30
def move_repositories
result = move_repository(old_disk_path, new_disk_path)
project.reload_repository!
if move_wiki
result &&= move_repository(old_wiki_disk_path, new_wiki_disk_path)
project.clear_memoization(:wiki)
end
2020-05-24 23:13:21 +05:30
if move_design
result &&= move_repository(old_design_disk_path, new_design_disk_path)
project.clear_memoization(:design_repository)
end
2020-01-01 13:55:28 +05:30
result
end
2019-03-02 22:35:43 +05:30
def rollback_folder_move
move_repository(new_disk_path, old_disk_path)
2020-01-01 13:55:28 +05:30
move_repository(new_wiki_disk_path, old_wiki_disk_path)
2020-05-24 23:13:21 +05:30
move_repository(new_design_disk_path, old_design_disk_path) if move_design
2019-03-02 22:35:43 +05:30
end
2019-07-07 11:18:12 +05:30
def try_to_set_repository_read_only!
2021-01-29 00:20:46 +05:30
project.set_repository_read_only!
rescue Project::RepositoryReadOnlyError => err
migration_error = "Target repository '#{old_disk_path}' cannot be made read-only: #{err.message}"
logger.error migration_error
2019-07-07 11:18:12 +05:30
2021-01-29 00:20:46 +05:30
raise RepositoryInUseError, migration_error
2019-07-07 11:18:12 +05:30
end
2020-01-01 13:55:28 +05:30
def wiki_path_suffix
@wiki_path_suffix ||= Gitlab::GlRepository::WIKI.path_suffix
end
def old_wiki_disk_path
@old_wiki_disk_path ||= "#{old_disk_path}#{wiki_path_suffix}"
end
def new_wiki_disk_path
@new_wiki_disk_path ||= "#{new_disk_path}#{wiki_path_suffix}"
end
2020-05-24 23:13:21 +05:30
def design_path_suffix
@design_path_suffix ||= ::Gitlab::GlRepository::DESIGN.path_suffix
end
def old_design_disk_path
@old_design_disk_path ||= "#{old_disk_path}#{design_path_suffix}"
end
def new_design_disk_path
@new_design_disk_path ||= "#{new_disk_path}#{design_path_suffix}"
end
2019-03-02 22:35:43 +05:30
end
end
end