Commit 4ad9f6ca authored by John Cai's avatar John Cai

Prevent ProjectUpdateRepositoryStorageWorker from deleting repo

parent 820ff845
...@@ -3,11 +3,21 @@ ...@@ -3,11 +3,21 @@
class ProjectUpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker class ProjectUpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker include ApplicationWorker
SameFilesystemError = Class.new(StandardError)
feature_category :gitaly feature_category :gitaly
def perform(project_id, new_repository_storage_key) def perform(project_id, new_repository_storage_key)
project = Project.find(project_id) project = Project.find(project_id)
raise SameFilesystemError if same_filesystem?(project.repository.storage, new_repository_storage_key)
::Projects::UpdateRepositoryStorageService.new(project).execute(new_repository_storage_key) ::Projects::UpdateRepositoryStorageService.new(project).execute(new_repository_storage_key)
end end
private
def same_filesystem?(old_storage, new_storage)
Gitlab::GitalyClient.filesystem_id(old_storage) == Gitlab::GitalyClient.filesystem_id(new_storage)
end
end end
---
title: Prevent ProjectUpdateRepositoryStorageWorker from moving to same filesystem
merge_request: 28469
author:
type: fixed
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' require 'spec_helper'
require 'securerandom'
describe ProjectUpdateRepositoryStorageWorker do describe ProjectUpdateRepositoryStorageWorker do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
...@@ -8,6 +9,12 @@ describe ProjectUpdateRepositoryStorageWorker do ...@@ -8,6 +9,12 @@ describe ProjectUpdateRepositoryStorageWorker do
subject { described_class.new } subject { described_class.new }
describe "#perform" do describe "#perform" do
context 'when source and target repositories are on different filesystems' do
before do
allow(Gitlab::GitalyClient).to receive(:filesystem_id).with('default').and_call_original
allow(Gitlab::GitalyClient).to receive(:filesystem_id).with('new_storage').and_return(SecureRandom.uuid)
end
it "calls the update repository storage service" do it "calls the update repository storage service" do
expect_next_instance_of(Projects::UpdateRepositoryStorageService) do |instance| expect_next_instance_of(Projects::UpdateRepositoryStorageService) do |instance|
expect(instance).to receive(:execute).with('new_storage') expect(instance).to receive(:execute).with('new_storage')
...@@ -16,4 +23,19 @@ describe ProjectUpdateRepositoryStorageWorker do ...@@ -16,4 +23,19 @@ describe ProjectUpdateRepositoryStorageWorker do
subject.perform(project.id, 'new_storage') subject.perform(project.id, 'new_storage')
end end
end end
context 'when source and target repositories are on the same filesystems' do
let(:filesystem_id) { SecureRandom.uuid }
before do
allow(Gitlab::GitalyClient).to receive(:filesystem_id).and_return(filesystem_id)
end
it 'raises an error' do
expect_any_instance_of(::Projects::UpdateRepositoryStorageService).not_to receive(:new)
expect { subject.perform(project.id, 'new_storage') }.to raise_error(ProjectUpdateRepositoryStorageWorker::SameFilesystemError)
end
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment