Throttle updates to Project#last_repository_updated_at.

Closes #35364.
This commit is contained in:
Andreas Brandl 2018-05-28 14:58:23 +02:00
parent 71dea693c6
commit 61ea2f52bd
3 changed files with 20 additions and 0 deletions

View file

@ -40,6 +40,7 @@ class Event < ActiveRecord::Base
).freeze
RESET_PROJECT_ACTIVITY_INTERVAL = 1.hour
REPOSITORY_UPDATED_AT_INTERVAL = 5.minutes
delegate :name, :email, :public_email, :username, to: :author, prefix: true, allow_nil: true
delegate :title, to: :issue, prefix: true, allow_nil: true
@ -391,6 +392,7 @@ class Event < ActiveRecord::Base
def set_last_repository_updated_at
Project.unscoped.where(id: project_id)
.where("last_repository_updated_at < ? OR last_repository_updated_at IS NULL", REPOSITORY_UPDATED_AT_INTERVAL.ago)
.update_all(last_repository_updated_at: created_at)
end

View file

@ -0,0 +1,5 @@
---
title: Throttle updates to Project#last_repository_updated_at.
merge_request: 19183
author:
type: performance

View file

@ -50,6 +50,19 @@ describe Event do
end
end
describe '#set_last_repository_updated_at' do
it 'only updates once every Event::REPOSITORY_UPDATED_AT_INTERVAL minutes' do
last_known_timestamp = (Event::REPOSITORY_UPDATED_AT_INTERVAL - 1.minute).ago
project.update(last_repository_updated_at: last_known_timestamp)
project.reload # a reload removes fractions of seconds
expect do
create_push_event(project, project.owner)
project.reload
end.not_to change { project.last_repository_updated_at }
end
end
describe 'after_create :track_user_interacted_projects' do
let(:event) { build(:push_event, project: project, author: project.owner) }