Refactor Hashed Storage migration to add additional migration steps
This commit is contained in:
parent
6369db0196
commit
0a4d55a1c9
|
@ -4,7 +4,6 @@ module Storage
|
|||
delegate :gitlab_shell, :repository_storage_path, to: :project
|
||||
|
||||
ROOT_PATH_PREFIX = '@hashed'.freeze
|
||||
STORAGE_VERSION = 1
|
||||
|
||||
def initialize(project)
|
||||
@project = project
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
module Projects
|
||||
module HashedStorage
|
||||
class MigrateRepositoryService < BaseService
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
attr_reader :old_disk_path, :new_disk_path, :old_wiki_disk_path, :old_storage_version, :logger
|
||||
|
||||
def initialize(project, logger = nil)
|
||||
@project = project
|
||||
@logger = logger || Rails.logger
|
||||
end
|
||||
|
||||
def execute
|
||||
@old_disk_path = project.disk_path
|
||||
has_wiki = project.wiki.repository_exists?
|
||||
|
||||
@old_storage_version = project.storage_version
|
||||
project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
|
||||
project.ensure_storage_path_exists
|
||||
|
||||
@new_disk_path = project.disk_path
|
||||
|
||||
result = move_repository(@old_disk_path, @new_disk_path)
|
||||
|
||||
if has_wiki
|
||||
@old_wiki_disk_path = "#{@old_disk_path}.wiki"
|
||||
result &&= move_repository("#{@old_wiki_disk_path}", "#{@new_disk_path}.wiki")
|
||||
end
|
||||
|
||||
unless result
|
||||
rollback_folder_move
|
||||
return result
|
||||
end
|
||||
|
||||
project.repository_read_only = false
|
||||
project.save!
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def move_repository(from_name, to_name)
|
||||
from_exists = gitlab_shell.exists?(project.repository_storage_path, "#{from_name}.git")
|
||||
to_exists = gitlab_shell.exists?(project.repository_storage_path, "#{to_name}.git")
|
||||
|
||||
# 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}) ..."
|
||||
return false
|
||||
elsif !from_exists
|
||||
# Repository have been moved already.
|
||||
return true
|
||||
end
|
||||
|
||||
gitlab_shell.mv_repository(project.repository_storage_path, from_name, to_name)
|
||||
end
|
||||
|
||||
def rollback_folder_move
|
||||
move_repository(@new_disk_path, @old_disk_path)
|
||||
move_repository("#{@new_disk_path}.wiki", "#{@old_disk_path}.wiki")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,68 +1,17 @@
|
|||
module Projects
|
||||
class HashedStorageMigrationService < BaseService
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
attr_reader :old_disk_path, :new_disk_path
|
||||
|
||||
attr_reader :logger
|
||||
|
||||
def initialize(project, logger = nil)
|
||||
@project = project
|
||||
@logger ||= Rails.logger
|
||||
@logger = logger || Rails.logger
|
||||
end
|
||||
|
||||
def execute
|
||||
return if project.hashed_storage?(:repository)
|
||||
|
||||
@old_disk_path = project.disk_path
|
||||
has_wiki = project.wiki.repository_exists?
|
||||
|
||||
project.storage_version = Storage::HashedProject::STORAGE_VERSION
|
||||
project.ensure_storage_path_exists
|
||||
|
||||
@new_disk_path = project.disk_path
|
||||
|
||||
result = move_repository(@old_disk_path, @new_disk_path)
|
||||
|
||||
if has_wiki
|
||||
result &&= move_repository("#{@old_disk_path}.wiki", "#{@new_disk_path}.wiki")
|
||||
# Migrate repository from Legacy to Hashed Storage
|
||||
unless project.hashed_storage?(:repository)
|
||||
return unless HashedStorage::MigrateRepositoryService.new(project, logger).execute
|
||||
end
|
||||
|
||||
unless result
|
||||
rollback_folder_move
|
||||
return
|
||||
end
|
||||
|
||||
project.repository_read_only = false
|
||||
project.save!
|
||||
|
||||
block_given? ? yield : result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def move_repository(from_name, to_name)
|
||||
from_exists = gitlab_shell.exists?(project.repository_storage_path, "#{from_name}.git")
|
||||
to_exists = gitlab_shell.exists?(project.repository_storage_path, "#{to_name}.git")
|
||||
|
||||
# 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}) ..."
|
||||
return false
|
||||
elsif !from_exists
|
||||
# Repository have been moved already.
|
||||
return true
|
||||
end
|
||||
|
||||
gitlab_shell.mv_repository(project.repository_storage_path, from_name, to_name)
|
||||
end
|
||||
|
||||
def rollback_folder_move
|
||||
move_repository(@new_disk_path, @old_disk_path)
|
||||
move_repository("#{@new_disk_path}.wiki", "#{@old_disk_path}.wiki")
|
||||
end
|
||||
|
||||
def logger
|
||||
@logger
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Projects::HashedStorageMigrationService do
|
||||
describe Projects::HashedStorage::MigrateRepositoryService do
|
||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||
let(:project) { create(:project, :empty_repo, :wiki_repo) }
|
||||
let(:service) { described_class.new(project) }
|
Loading…
Reference in New Issue