diff options
author | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2016-04-26 09:34:51 +0000 |
---|---|---|
committer | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2016-04-26 09:34:51 +0000 |
commit | f127edd012bd8b6f76ac67d69aadbd7d4837258f (patch) | |
tree | fa33fe4ddd72a8ad3f0e2f617b0a163a63f901fc | |
parent | 6ff740ff9484691750f3eadf12125fd362efe61c (diff) | |
parent | 533cd8c2ee45cc0a34aca08f48f9ee0cf7d3c3fb (diff) | |
download | gitlab-ce-f127edd012bd8b6f76ac67d69aadbd7d4837258f.tar.gz |
Merge branch '15094-throttle-update-of-last_activity_at' into 'master'
Throttle the update of `project.last_activity_at` to 1 minute
This implement [the solution](https://gitlab.com/gitlab-org/gitlab-ce/issues/15094#note_4769387) proposed by @jacobvosmaer.
See merge request !3848
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | app/models/event.rb | 2 | ||||
-rw-r--r-- | spec/models/event_spec.rb | 65 |
3 files changed, 45 insertions, 23 deletions
diff --git a/CHANGELOG b/CHANGELOG index a4794485476..b40a8d6cc0f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ v 8.8.0 (unreleased) - Add 'l' shortcut to open Label dropdown on issuables and 'i' to create new issue on a project v 8.7.1 (unreleased) + - Throttle the update of `project.last_activity_at` to 1 minute. !3848 - Fix .gitlab-ci.yml parsing issue when hidde job is a template without script definition. !3849 - Fix license detection to detect all license files, not only known licenses. !3878 - Use the `can?` helper instead of `current_user.can?`. !3882 diff --git a/app/models/event.rb b/app/models/event.rb index 12183524b79..897518aadc7 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -345,7 +345,7 @@ class Event < ActiveRecord::Base end def reset_project_activity - if project + if project && Gitlab::ExclusiveLease.new("project:update_last_activity_at:#{project.id}", timeout: 60).try_obtain project.update_column(:last_activity_at, self.created_at) end end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 89909c2bcd7..0c3cd13f399 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -30,32 +30,29 @@ describe Event, models: true do it { is_expected.to respond_to(:commits) } end + describe 'Callbacks' do + describe 'after_create :reset_project_activity' do + let(:project) { create(:project) } + + context "project's last activity was less than 5 minutes ago" do + it 'does not update project.last_activity_at if it has been touched less than 5 minutes ago' do + create_event(project, project.owner) + project.update_column(:last_activity_at, 5.minutes.ago) + project_last_activity_at = project.last_activity_at + + create_event(project, project.owner) + + expect(project.last_activity_at).to eq(project_last_activity_at) + end + end + end + end + describe "Push event" do before do project = create(:project) @user = project.owner - - data = { - before: Gitlab::Git::BLANK_SHA, - after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e", - ref: "refs/heads/master", - user_id: @user.id, - user_name: @user.name, - repository: { - name: project.name, - url: "localhost/rubinius", - description: "", - homepage: "localhost/rubinius", - private: true - } - } - - @event = Event.create( - project: project, - action: Event::PUSHED, - data: data, - author_id: @user.id - ) + @event = create_event(project, @user) end it { expect(@event.push?).to be_truthy } @@ -143,4 +140,28 @@ describe Event, models: true do it { is_expected.to eq([event2]) } end end + + def create_event(project, user, attrs = {}) + data = { + before: Gitlab::Git::BLANK_SHA, + after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e", + ref: "refs/heads/master", + user_id: user.id, + user_name: user.name, + repository: { + name: project.name, + url: "localhost/rubinius", + description: "", + homepage: "localhost/rubinius", + private: true + } + } + + Event.create({ + project: project, + action: Event::PUSHED, + data: data, + author_id: user.id + }.merge(attrs)) + end end |