diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 12:45:46 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 12:45:46 +0300 |
commit | a7b3560714b4d9cc4ab32dffcd1f74a284b93580 (patch) | |
tree | 7452bd5c3545c2fa67a28aa013835fb4fa071baf /spec/lib/backup | |
parent | ee9173579ae56a3dbfe5afe9f9410c65bb327ca7 (diff) |
Add latest changes from gitlab-org/gitlab@14-8-stable-eev14.8.0-rc42
Diffstat (limited to 'spec/lib/backup')
-rw-r--r-- | spec/lib/backup/database_spec.rb | 9 | ||||
-rw-r--r-- | spec/lib/backup/gitaly_backup_spec.rb | 6 | ||||
-rw-r--r-- | spec/lib/backup/gitaly_rpc_backup_spec.rb | 6 | ||||
-rw-r--r-- | spec/lib/backup/manager_spec.rb | 11 | ||||
-rw-r--r-- | spec/lib/backup/repositories_spec.rb | 72 |
5 files changed, 65 insertions, 39 deletions
diff --git a/spec/lib/backup/database_spec.rb b/spec/lib/backup/database_spec.rb index f57037d5652..4345778ba92 100644 --- a/spec/lib/backup/database_spec.rb +++ b/spec/lib/backup/database_spec.rb @@ -6,6 +6,10 @@ RSpec.describe Backup::Database do let(:progress) { StringIO.new } let(:output) { progress.string } + before do + allow(Gitlab::TaskHelpers).to receive(:ask_to_continue) + end + describe '#restore' do let(:cmd) { %W[#{Gem.ruby} -e $stdout.puts(1)] } let(:data) { Rails.root.join("spec/fixtures/pages_empty.tar.gz").to_s } @@ -20,7 +24,7 @@ RSpec.describe Backup::Database do let(:data) { Rails.root.join("spec/fixtures/pages_empty.tar.gz").to_s } it 'returns successfully' do - expect(subject.restore).to eq([]) + subject.restore expect(output).to include("Restoring PostgreSQL database") expect(output).to include("[DONE]") @@ -42,7 +46,8 @@ RSpec.describe Backup::Database do let(:cmd) { %W[#{Gem.ruby} -e $stderr.write("#{noise}#{visible_error}")] } it 'filters out noise from errors' do - expect(subject.restore).to eq([visible_error]) + subject.restore + expect(output).to include("ERRORS") expect(output).not_to include(noise) expect(output).to include(visible_error) diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb index cd0d984fbdb..6bf4f833c1f 100644 --- a/spec/lib/backup/gitaly_backup_spec.rb +++ b/spec/lib/backup/gitaly_backup_spec.rb @@ -38,7 +38,7 @@ RSpec.describe Backup::GitalyBackup do create(:wiki_page, container: project) create(:design, :with_file, issue: create(:issue, project: project)) project_snippet = create(:project_snippet, :repository, project: project) - personal_snippet = create(:personal_snippet, :repository, author: project.owner) + personal_snippet = create(:personal_snippet, :repository, author: project.first_owner) expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything).and_call_original @@ -122,8 +122,8 @@ RSpec.describe Backup::GitalyBackup do context 'restore' do let_it_be(:project) { create(:project, :repository) } - let_it_be(:personal_snippet) { create(:personal_snippet, author: project.owner) } - let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.owner) } + let_it_be(:personal_snippet) { create(:personal_snippet, author: project.first_owner) } + let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.first_owner) } def copy_bundle_to_backup_path(bundle_name, destination) FileUtils.mkdir_p(File.join(Gitlab.config.backup.path, 'repositories', File.dirname(destination))) diff --git a/spec/lib/backup/gitaly_rpc_backup_spec.rb b/spec/lib/backup/gitaly_rpc_backup_spec.rb index 14f9d27ca6e..4829d51ac9d 100644 --- a/spec/lib/backup/gitaly_rpc_backup_spec.rb +++ b/spec/lib/backup/gitaly_rpc_backup_spec.rb @@ -25,7 +25,7 @@ RSpec.describe Backup::GitalyRpcBackup do create(:wiki_page, container: project) create(:design, :with_file, issue: create(:issue, project: project)) project_snippet = create(:project_snippet, :repository, project: project) - personal_snippet = create(:personal_snippet, :repository, author: project.owner) + personal_snippet = create(:personal_snippet, :repository, author: project.first_owner) subject.start(:create) subject.enqueue(project, Gitlab::GlRepository::PROJECT) @@ -75,8 +75,8 @@ RSpec.describe Backup::GitalyRpcBackup do context 'restore' do let_it_be(:project) { create(:project, :repository) } - let_it_be(:personal_snippet) { create(:personal_snippet, author: project.owner) } - let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.owner) } + let_it_be(:personal_snippet) { create(:personal_snippet, author: project.first_owner) } + let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.first_owner) } def copy_bundle_to_backup_path(bundle_name, destination) FileUtils.mkdir_p(File.join(Gitlab.config.backup.path, 'repositories', File.dirname(destination))) diff --git a/spec/lib/backup/manager_spec.rb b/spec/lib/backup/manager_spec.rb index 31cc3012eb1..ac693ad8b98 100644 --- a/spec/lib/backup/manager_spec.rb +++ b/spec/lib/backup/manager_spec.rb @@ -12,6 +12,11 @@ RSpec.describe Backup::Manager do before do allow(progress).to receive(:puts) allow(progress).to receive(:print) + FileUtils.mkdir_p('tmp/tests/public/uploads') + end + + after do + FileUtils.rm_rf('tmp/tests/public/uploads', secure: true) end describe '#pack' do @@ -409,7 +414,7 @@ RSpec.describe Backup::Manager do # the Fog mock only knows about directories we create explicitly connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys) - connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) + connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang end context 'target path' do @@ -455,7 +460,7 @@ RSpec.describe Backup::Manager do } ) - connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) + connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang end context 'with SSE-S3 without using storage_options' do @@ -521,7 +526,7 @@ RSpec.describe Backup::Manager do ) connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys) - connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) + connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang end it 'does not attempt to set ACL' do diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb index f3830da344b..0b29a25360d 100644 --- a/spec/lib/backup/repositories_spec.rb +++ b/spec/lib/backup/repositories_spec.rb @@ -6,8 +6,17 @@ RSpec.describe Backup::Repositories do let(:progress) { spy(:stdout) } let(:parallel_enqueue) { true } let(:strategy) { spy(:strategy, parallel_enqueue?: parallel_enqueue) } - - subject { described_class.new(progress, strategy: strategy) } + let(:max_concurrency) { 1 } + let(:max_storage_concurrency) { 1 } + + subject do + described_class.new( + progress, + strategy: strategy, + max_concurrency: max_concurrency, + max_storage_concurrency: max_storage_concurrency + ) + end describe '#dump' do let_it_be(:projects) { create_list(:project, 5, :repository) } @@ -15,9 +24,9 @@ RSpec.describe Backup::Repositories do RSpec.shared_examples 'creates repository bundles' do it 'calls enqueue for each repository type', :aggregate_failures do project_snippet = create(:project_snippet, :repository, project: project) - personal_snippet = create(:personal_snippet, :repository, author: project.owner) + personal_snippet = create(:personal_snippet, :repository, author: project.first_owner) - subject.dump(max_concurrency: 1, max_storage_concurrency: 1) + subject.dump expect(strategy).to have_received(:start).with(:create) expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::PROJECT) @@ -51,38 +60,40 @@ RSpec.describe Backup::Repositories do end expect(strategy).to receive(:finish!) - subject.dump(max_concurrency: 1, max_storage_concurrency: 1) + subject.dump end describe 'command failure' do it 'enqueue_project raises an error' do allow(strategy).to receive(:enqueue).with(anything, Gitlab::GlRepository::PROJECT).and_raise(IOError) - expect { subject.dump(max_concurrency: 1, max_storage_concurrency: 1) }.to raise_error(IOError) + expect { subject.dump }.to raise_error(IOError) end it 'project query raises an error' do allow(Project).to receive_message_chain(:includes, :find_each).and_raise(ActiveRecord::StatementTimeout) - expect { subject.dump(max_concurrency: 1, max_storage_concurrency: 1) }.to raise_error(ActiveRecord::StatementTimeout) + expect { subject.dump }.to raise_error(ActiveRecord::StatementTimeout) end end it 'avoids N+1 database queries' do control_count = ActiveRecord::QueryRecorder.new do - subject.dump(max_concurrency: 1, max_storage_concurrency: 1) + subject.dump end.count create_list(:project, 2, :repository) expect do - subject.dump(max_concurrency: 1, max_storage_concurrency: 1) + subject.dump end.not_to exceed_query_limit(control_count) end end context 'concurrency with a strategy without parallel enqueueing support' do let(:parallel_enqueue) { false } + let(:max_concurrency) { 2 } + let(:max_storage_concurrency) { 2 } it 'enqueues all projects sequentially' do expect(Thread).not_to receive(:new) @@ -93,13 +104,14 @@ RSpec.describe Backup::Repositories do end expect(strategy).to receive(:finish!) - subject.dump(max_concurrency: 2, max_storage_concurrency: 2) + subject.dump end end [4, 10].each do |max_storage_concurrency| context "max_storage_concurrency #{max_storage_concurrency}", quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/241701' do let(:storage_keys) { %w[default test_second_storage] } + let(:max_storage_concurrency) { max_storage_concurrency } before do allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(storage_keys) @@ -116,54 +128,58 @@ RSpec.describe Backup::Repositories do end expect(strategy).to receive(:finish!) - subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) + subject.dump end - it 'creates the expected number of threads with extra max concurrency' do - expect(Thread).to receive(:new) - .exactly(storage_keys.length * (max_storage_concurrency + 1)).times - .and_call_original + context 'with extra max concurrency' do + let(:max_concurrency) { 3 } - expect(strategy).to receive(:start).with(:create) - projects.each do |project| - expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT) - end - expect(strategy).to receive(:finish!) + it 'creates the expected number of threads' do + expect(Thread).to receive(:new) + .exactly(storage_keys.length * (max_storage_concurrency + 1)).times + .and_call_original - subject.dump(max_concurrency: 3, max_storage_concurrency: max_storage_concurrency) + expect(strategy).to receive(:start).with(:create) + projects.each do |project| + expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT) + end + expect(strategy).to receive(:finish!) + + subject.dump + end end describe 'command failure' do it 'enqueue_project raises an error' do allow(strategy).to receive(:enqueue).and_raise(IOError) - expect { subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) }.to raise_error(IOError) + expect { subject.dump }.to raise_error(IOError) end it 'project query raises an error' do allow(Project).to receive_message_chain(:for_repository_storage, :includes, :find_each).and_raise(ActiveRecord::StatementTimeout) - expect { subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) }.to raise_error(ActiveRecord::StatementTimeout) + expect { subject.dump }.to raise_error(ActiveRecord::StatementTimeout) end context 'misconfigured storages' do let(:storage_keys) { %w[test_second_storage] } it 'raises an error' do - expect { subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) }.to raise_error(Backup::Error, 'repositories.storages in gitlab.yml is misconfigured') + expect { subject.dump }.to raise_error(Backup::Error, 'repositories.storages in gitlab.yml is misconfigured') end end end it 'avoids N+1 database queries' do control_count = ActiveRecord::QueryRecorder.new do - subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) + subject.dump end.count create_list(:project, 2, :repository) expect do - subject.dump(max_concurrency: 1, max_storage_concurrency: max_storage_concurrency) + subject.dump end.not_to exceed_query_limit(control_count) end end @@ -172,8 +188,8 @@ RSpec.describe Backup::Repositories do describe '#restore' do let_it_be(:project) { create(:project) } - let_it_be(:personal_snippet) { create(:personal_snippet, author: project.owner) } - let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.owner) } + let_it_be(:personal_snippet) { create(:personal_snippet, author: project.first_owner) } + let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.first_owner) } it 'calls enqueue for each repository type', :aggregate_failures do subject.restore |