Restore Object Pools when restoring an object pool

Pool repositories are persisted in the database, and when the DB is
restored, the data need to be restored on disk. This is done by
resetting the state machine and rescheduling the object pool creation.

This is not an exact replica of the state like at the time of the
creation of the backup. However, the data is consistent again.

Dumping isn't required as internally GitLab uses git bundles which
bundle all refs and include all objects in the bundle that they require,
reduplicating as more repositories get backed up. This does require more
data to be stored.

Fixes https://gitlab.com/gitlab-org/gitaly/issues/1355
上级 7cb0dd98
...@@ -84,6 +84,10 @@ class PoolRepository < ActiveRecord::Base ...@@ -84,6 +84,10 @@ class PoolRepository < ActiveRecord::Base
source_project.repository.raw) source_project.repository.raw)
end end
def inspect
"#<#{self.class.name} id:#{id} state:#{state} disk_path:#{disk_path} source_project: #{source_project.full_path}>"
end
private private
def correct_disk_path def correct_disk_path
......
---
title: Restore Object Pools when restoring an object pool
merge_request: 23682
author:
type: added
...@@ -657,6 +657,7 @@ Restoring database tables: ...@@ -657,6 +657,7 @@ Restoring database tables:
- Loading fixture wikis...[SKIPPING] - Loading fixture wikis...[SKIPPING]
Restoring repositories: Restoring repositories:
- Restoring repository abcd... [DONE] - Restoring repository abcd... [DONE]
- Object pool 1 ...
Deleting tmp directories...[DONE] Deleting tmp directories...[DONE]
``` ```
......
...@@ -4,6 +4,7 @@ require 'yaml' ...@@ -4,6 +4,7 @@ require 'yaml'
module Backup module Backup
class Repository class Repository
include Gitlab::ShellAdapter
attr_reader :progress attr_reader :progress
def initialize(progress) def initialize(progress)
...@@ -75,7 +76,6 @@ module Backup ...@@ -75,7 +76,6 @@ module Backup
def restore def restore
prepare_directories prepare_directories
gitlab_shell = Gitlab::Shell.new
Project.find_each(batch_size: 1000) do |project| Project.find_each(batch_size: 1000) do |project|
progress.print " * #{project.full_path} ... " progress.print " * #{project.full_path} ... "
...@@ -118,6 +118,8 @@ module Backup ...@@ -118,6 +118,8 @@ module Backup
end end
end end
end end
restore_object_pools
end end
protected protected
...@@ -159,5 +161,17 @@ module Backup ...@@ -159,5 +161,17 @@ module Backup
def display_repo_path(project) def display_repo_path(project)
project.hashed_storage?(:repository) ? "#{project.full_path} (#{project.disk_path})" : project.full_path project.hashed_storage?(:repository) ? "#{project.full_path} (#{project.disk_path})" : project.full_path
end end
def restore_object_pools
PoolRepository.includes(:source_project).find_each do |pool|
progress.puts " - Object pool #{pool.disk_path}..."
pool.source_project ||= pool.member_projects.first.root_of_fork_network
pool.state = 'none'
pool.save
pool.schedule
end
end
end end
end end
...@@ -67,6 +67,19 @@ describe Backup::Repository do ...@@ -67,6 +67,19 @@ describe Backup::Repository do
end end
end end
end end
context 'restoring object pools' do
it 'schedules restoring of the pool' do
pool_repository = create(:pool_repository, :failed)
pool_repository.delete_object_pool
subject.restore
pool_repository.reload
expect(pool_repository).not_to be_failed
expect(pool_repository.object_pool.exists?).to be(true)
end
end
end end
describe '#prepare_directories', :seed_helper do describe '#prepare_directories', :seed_helper do
......
...@@ -74,6 +74,7 @@ describe 'gitlab:app namespace rake task' do ...@@ -74,6 +74,7 @@ describe 'gitlab:app namespace rake task' do
it 'invokes restoration on match' do it 'invokes restoration on match' do
allow(YAML).to receive(:load_file) allow(YAML).to receive(:load_file)
.and_return({ gitlab_version: gitlab_version }) .and_return({ gitlab_version: gitlab_version })
expect(Rake::Task['gitlab:db:drop_tables']).to receive(:invoke) expect(Rake::Task['gitlab:db:drop_tables']).to receive(:invoke)
expect(Rake::Task['gitlab:backup:db:restore']).to receive(:invoke) expect(Rake::Task['gitlab:backup:db:restore']).to receive(:invoke)
expect(Rake::Task['gitlab:backup:repo:restore']).to receive(:invoke) expect(Rake::Task['gitlab:backup:repo:restore']).to receive(:invoke)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册