Commit 1e43d30e authored by Heinrich Lee Yu's avatar Heinrich Lee Yu

Do not trigger rebalance when we have DB timeouts

Statement timeouts can be transient and a rebalance is disruptive
because it blocks positioning for the duration of the rebalance.

This changes the code so that we only trigger a rebalance when there is
no space left.
parent 19f76cb5
...@@ -135,21 +135,21 @@ module RelativePositioning ...@@ -135,21 +135,21 @@ module RelativePositioning
before, after = [before, after].sort_by(&:relative_position) if before && after before, after = [before, after].sort_by(&:relative_position) if before && after
RelativePositioning.mover.move(self, before, after) RelativePositioning.mover.move(self, before, after)
rescue ActiveRecord::QueryCanceled, NoSpaceLeft => e rescue NoSpaceLeft => e
could_not_move(e) could_not_move(e)
raise e raise e
end end
def move_after(before = self) def move_after(before = self)
RelativePositioning.mover.move(self, before, nil) RelativePositioning.mover.move(self, before, nil)
rescue ActiveRecord::QueryCanceled, NoSpaceLeft => e rescue NoSpaceLeft => e
could_not_move(e) could_not_move(e)
raise e raise e
end end
def move_before(after = self) def move_before(after = self)
RelativePositioning.mover.move(self, nil, after) RelativePositioning.mover.move(self, nil, after)
rescue ActiveRecord::QueryCanceled, NoSpaceLeft => e rescue NoSpaceLeft => e
could_not_move(e) could_not_move(e)
raise e raise e
end end
...@@ -159,9 +159,6 @@ module RelativePositioning ...@@ -159,9 +159,6 @@ module RelativePositioning
rescue NoSpaceLeft => e rescue NoSpaceLeft => e
could_not_move(e) could_not_move(e)
self.relative_position = MAX_POSITION self.relative_position = MAX_POSITION
rescue ActiveRecord::QueryCanceled => e
could_not_move(e)
raise e
end end
def move_to_start def move_to_start
...@@ -169,9 +166,6 @@ module RelativePositioning ...@@ -169,9 +166,6 @@ module RelativePositioning
rescue NoSpaceLeft => e rescue NoSpaceLeft => e
could_not_move(e) could_not_move(e)
self.relative_position = MIN_POSITION self.relative_position = MIN_POSITION
rescue ActiveRecord::QueryCanceled => e
could_not_move(e)
raise e
end end
# This method is used during rebalancing - override it to customise the update # This method is used during rebalancing - override it to customise the update
......
...@@ -1435,19 +1435,19 @@ RSpec.describe Issue do ...@@ -1435,19 +1435,19 @@ RSpec.describe Issue do
describe 'scheduling rebalancing' do describe 'scheduling rebalancing' do
before do before do
allow_next_instance_of(RelativePositioning::Mover) do |mover| allow_next_instance_of(RelativePositioning::Mover) do |mover|
allow(mover).to receive(:move) { raise ActiveRecord::QueryCanceled } allow(mover).to receive(:move) { raise RelativePositioning::NoSpaceLeft }
end end
end end
shared_examples 'schedules issues rebalancing' do shared_examples 'schedules issues rebalancing' do
let(:issue) { build_stubbed(:issue, relative_position: 100, project: project) } let(:issue) { build_stubbed(:issue, relative_position: 100, project: project) }
it 'schedules rebalancing if we time-out when moving' do it 'schedules rebalancing if there is no space left' do
lhs = build_stubbed(:issue, relative_position: 99, project: project) lhs = build_stubbed(:issue, relative_position: 99, project: project)
to_move = build(:issue, project: project) to_move = build(:issue, project: project)
expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, project_id, namespace_id) expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, project_id, namespace_id)
expect { to_move.move_between(lhs, issue) }.to raise_error(ActiveRecord::QueryCanceled) expect { to_move.move_between(lhs, issue) }.to raise_error(RelativePositioning::NoSpaceLeft)
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