Commit cedf4654 authored by Toon Claes's avatar Toon Claes

Make Geo::PruneEventLogWorker delete rows more gently

Instead of attempting to delete all rows in a single SQL query, do it
in batches.

Closes gitlab-org/gitlab-ee#6140.
parent cd352364
module Geo
class EventLog < ActiveRecord::Base
include Geo::Model
include ::EachBatch
belongs_to :repository_created_event,
class_name: 'Geo::RepositoryCreatedEvent',
......
......@@ -16,8 +16,8 @@ module Geo
try_obtain_lease do
if Gitlab::Geo.secondary_nodes.empty?
log_info('No secondary nodes, delete all Geo Event Log entries')
Geo::EventLog.delete_all
log_info('No secondary nodes, truncate the Geo Event Log table')
ActiveRecord::Base.connection.truncate(Geo::EventLog.table_name)
break
end
......@@ -31,7 +31,8 @@ module Geo
end
log_info('Delete Geo Event Log entries up to id', geo_event_log_id: cursor_last_event_ids.min)
Geo::EventLog.where('id < ?', cursor_last_event_ids.min).delete_all
Geo::EventLog.where('id <= ?', cursor_last_event_ids.min)
.each_batch { |batch| batch.delete_all }
end
end
end
......
---
title: Make Geo::PruneEventLogWorker delete rows more gently
merge_request: 5835
author:
type: performance
......@@ -45,7 +45,8 @@ describe Geo::PruneEventLogWorker, :geo do
it 'deletes everything from the Geo event log' do
create_list(:geo_event_log, 2)
expect(worker).to receive(:log_info).with('No secondary nodes, delete all Geo Event Log entries')
expect(worker).to receive(:log_info).with('No secondary nodes, truncate the Geo Event Log table')
expect(ActiveRecord::Base.connection).to receive(:truncate).with('geo_event_log').and_call_original
expect { worker.perform }.to change { Geo::EventLog.count }.by(-2)
end
......@@ -79,13 +80,13 @@ describe Geo::PruneEventLogWorker, :geo do
end
it 'takes the integer-minimum value of all cursor_last_event_ids' do
events = create_list(:geo_event_log, 12)
events = create_list(:geo_event_log, 5)
create(:geo_node_status, :healthy, cursor_last_event_id: events[3].id, geo_node_id: secondary.id)
create(:geo_node_status, :healthy, cursor_last_event_id: events.last.id, geo_node_id: secondary2.id)
expect(worker).to receive(:log_info).with('Delete Geo Event Log entries up to id', geo_event_log_id: events[3].id)
expect { worker.perform }.to change { Geo::EventLog.count }.by(-3)
expect { worker.perform }.to change { Geo::EventLog.count }.by(-4)
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