From d91c6c0738086f4ff8f99fabb78efd90bed990a0 Mon Sep 17 00:00:00 2001 From: Paco Guzman Date: Tue, 5 Jul 2016 10:03:08 +0200 Subject: [PATCH] Throttle the update of `project.pushes_since_gc` to 1 minute --- CHANGELOG | 1 + app/services/projects/housekeeping_service.rb | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4fac555e12a..573ab21a5e2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,7 @@ v 8.10.0 (unreleased) - API: Todos !3188 (Robert Schilling) - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt) - PipelinesFinder uses git cache data + - Throttle the update of `project.pushes_since_gc` to 1 minute. - Check for conflicts with existing Project's wiki path when creating a new project. - Don't instantiate a git tree on Projects show default view - Remove unused front-end variable -> default_issues_tracker diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb index a47df22f1ba..752c11d7ae6 100644 --- a/app/services/projects/housekeeping_service.rb +++ b/app/services/projects/housekeeping_service.rb @@ -27,7 +27,7 @@ module Projects GitlabShellOneShotWorker.perform_async(:gc, @project.repository_storage_path, @project.path_with_namespace) ensure Gitlab::Metrics.measure(:reset_pushes_since_gc) do - @project.update_column(:pushes_since_gc, 0) + update_pushes_since_gc(0) end end @@ -37,12 +37,18 @@ module Projects def increment! Gitlab::Metrics.measure(:increment_pushes_since_gc) do - @project.increment!(:pushes_since_gc) + update_pushes_since_gc(@project.pushes_since_gc + 1) end end private + def update_pushes_since_gc(new_value) + if Gitlab::ExclusiveLease.new("project_housekeeping:update_pushes_since_gc:#{project.id}", timeout: 60).try_obtain + @project.update_column(:pushes_since_gc, new_value) + end + end + def try_obtain_lease Gitlab::Metrics.measure(:obtain_housekeeping_lease) do lease = ::Gitlab::ExclusiveLease.new("project_housekeeping:#{@project.id}", timeout: LEASE_TIMEOUT)