Commit 9e396d6e authored by Michael Kozono's avatar Michael Kozono 🔴 Committed by Stan Hu

Fix namespace move callback behavior, especially to fix Geo replication of...

Fix namespace move callback behavior, especially to fix Geo replication of namespace moves during certain exceptions
parent 20e63ba1
......@@ -34,13 +34,12 @@ module Storage
begin
send_update_instructions
write_projects_repository_config
true
rescue
# Returning false does not rollback after_* transaction but gives
# us information about failing some of tasks
false
rescue => e
# Raise if development/test environment, else just notify Sentry
Gitlab::Sentry.track_exception(e, extra: { full_path_was: full_path_was, full_path: full_path, action: 'move_dir' })
end
true # false would cancel later callbacks but not rollback
end
# Hooks
......
---
title: Fix namespace move callback behavior, especially to fix Geo replication of namespace moves during certain exceptions.
merge_request: 19297
author:
type: fixed
......@@ -205,6 +205,34 @@ describe Namespace do
expect(gitlab_shell.exists?(project.repository_storage, "#{namespace.path}/#{project.path}.git")).to be_truthy
end
context 'when #write_projects_repository_config raises an error' do
context 'in test environment' do
it 'raises an exception' do
expect(namespace).to receive(:write_projects_repository_config).and_raise('foo')
expect do
namespace.update(path: namespace.full_path + '_new')
end.to raise_error('foo')
end
end
context 'in production environment' do
it 'does not cancel later callbacks' do
expect(namespace).to receive(:write_projects_repository_config).and_raise('foo')
expect(namespace).to receive(:move_dir).and_wrap_original do |m, *args|
move_dir_result = m.call(*args)
expect(move_dir_result).to be_truthy # Must be truthy, or else later callbacks would be canceled
move_dir_result
end
expect(Gitlab::Sentry).to receive(:should_raise?).and_return(false) # like prod
namespace.update(path: namespace.full_path + '_new')
end
end
end
context 'with subgroups', :nested_groups do
let(:parent) { create(:group, name: 'parent', path: 'parent') }
let(:new_parent) { create(:group, name: 'new_parent', path: 'new_parent') }
......
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