Commit caeb4597 authored by Stan Hu's avatar Stan Hu

Merge branch 'mk/fix-callback-canceling-in-namespace-move-dir' into 'master'

Fix namespace move callback behavior, especially to fix Geo replication of namespace moves during certain exceptions

Closes gitlab-ee#6252

See merge request gitlab-org/gitlab-ce!19297
parents 20e63ba1 9e396d6e
...@@ -34,13 +34,12 @@ module Storage ...@@ -34,13 +34,12 @@ module Storage
begin begin
send_update_instructions send_update_instructions
write_projects_repository_config write_projects_repository_config
rescue => e
true # Raise if development/test environment, else just notify Sentry
rescue Gitlab::Sentry.track_exception(e, extra: { full_path_was: full_path_was, full_path: full_path, action: 'move_dir' })
# Returning false does not rollback after_* transaction but gives
# us information about failing some of tasks
false
end end
true # false would cancel later callbacks but not rollback
end end
# Hooks # 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 ...@@ -205,6 +205,34 @@ describe Namespace do
expect(gitlab_shell.exists?(project.repository_storage, "#{namespace.path}/#{project.path}.git")).to be_truthy expect(gitlab_shell.exists?(project.repository_storage, "#{namespace.path}/#{project.path}.git")).to be_truthy
end 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 context 'with subgroups', :nested_groups do
let(:parent) { create(:group, name: 'parent', path: 'parent') } let(:parent) { create(:group, name: 'parent', path: 'parent') }
let(:new_parent) { create(:group, name: 'new_parent', path: 'new_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