From a0e97b1c6a786462733a73b681cff60b103d729c Mon Sep 17 00:00:00 2001 From: Imre Farkas Date: Thu, 7 Feb 2019 15:36:50 +0100 Subject: [PATCH] Optimize Redis usage in User::ActivityService Avoid checking Redis when User#last_activity_on is already up to date. --- app/services/users/activity_service.rb | 7 +++++-- .../24642-activity_service_optimization.yml | 5 +++++ spec/services/users/activity_service_spec.rb | 12 ++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/24642-activity_service_optimization.yml diff --git a/app/services/users/activity_service.rb b/app/services/users/activity_service.rb index db03ba8756f..e50840a9158 100644 --- a/app/services/users/activity_service.rb +++ b/app/services/users/activity_service.rb @@ -26,12 +26,15 @@ module Users def record_activity return if Gitlab::Database.read_only? + today = Date.today + + return if @user.last_activity_on == today + lease = Gitlab::ExclusiveLease.new("acitvity_service:#{@user.id}", timeout: LEASE_TIMEOUT) return unless lease.try_obtain - @user.update_attribute(:last_activity_on, Date.today) - Rails.logger.debug("Recorded activity: #{@activity} for User ID: #{@user.id} (username: #{@user.username})") + @user.update_attribute(:last_activity_on, today) end end end diff --git a/changelogs/unreleased/24642-activity_service_optimization.yml b/changelogs/unreleased/24642-activity_service_optimization.yml new file mode 100644 index 00000000000..bdfa769959e --- /dev/null +++ b/changelogs/unreleased/24642-activity_service_optimization.yml @@ -0,0 +1,5 @@ +--- +title: Optimize Redis usage in User::ActivityService +merge_request: 25005 +author: +type: performance diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb index 719b4adf212..3c0a4ac8e18 100644 --- a/spec/services/users/activity_service_spec.rb +++ b/spec/services/users/activity_service_spec.rb @@ -26,6 +26,12 @@ describe Users::ActivityService do .from(last_activity_on) .to(Date.today) end + + it 'tries to obtain ExclusiveLease' do + expect(Gitlab::ExclusiveLease).to receive(:new).and_call_original + + subject.execute + end end context 'when a bad object is passed' do @@ -46,6 +52,12 @@ describe Users::ActivityService do it 'does not update last_activity_on' do expect { subject.execute }.not_to change(user, :last_activity_on) end + + it 'does not try to obtain ExclusiveLease' do + expect(Gitlab::ExclusiveLease).not_to receive(:new) + + subject.execute + end end context 'when in GitLab read-only instance' do