summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <contact@jacobvosmaer.nl>2016-03-14 15:18:52 +0100
committerJacob Vosmaer <contact@jacobvosmaer.nl>2016-03-14 15:55:45 +0100
commita02fe251df7ea7316f51850fe603e7e5ac4431e2 (patch)
treeea6f7078130c17d29e864914408e70497e2238ad
parent37ba5a12b515172b76d28e112ab9899823163717 (diff)
downloadgitlab-ce-a02fe251df7ea7316f51850fe603e7e5ac4431e2.tar.gz
Allow project housekeeping only once an hour
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/services/projects/housekeeping_service.rb14
-rw-r--r--spec/services/projects/housekeeping_service_spec.rb40
3 files changed, 56 insertions, 2 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index c70add86a20..2a3dc5c79f7 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -170,10 +170,10 @@ class ProjectsController < ApplicationController
end
def housekeeping
- ::Projects::HousekeepingService.new(@project).execute
+ message = ::Projects::HousekeepingService.new(@project).execute
respond_to do |format|
- flash[:notice] = "Housekeeping successfully started."
+ flash[:notice] = message
format.html { redirect_to project_path(@project) }
end
end
diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb
index 0db85ac2142..11be5b1badf 100644
--- a/app/services/projects/housekeeping_service.rb
+++ b/app/services/projects/housekeeping_service.rb
@@ -9,12 +9,26 @@ module Projects
class HousekeepingService < BaseService
include Gitlab::ShellAdapter
+ LEASE_TIMEOUT = 3600
+
def initialize(project)
@project = project
end
def execute
+ if !try_obtain_lease
+ return "Housekeeping was already triggered in the past #{LEASE_TIMEOUT / 60} minutes"
+ end
+
GitlabShellWorker.perform_async(:gc, @project.path_with_namespace)
+ return "Housekeeping successfully started"
+ end
+
+ private
+
+ def try_obtain_lease
+ lease = ::Gitlab::ExclusiveLease.new("project_housekeeping:#{@project.id}", timeout: LEASE_TIMEOUT)
+ lease.try_obtain
end
end
end
diff --git a/spec/services/projects/housekeeping_service_spec.rb b/spec/services/projects/housekeeping_service_spec.rb
new file mode 100644
index 00000000000..7cddeb5c354
--- /dev/null
+++ b/spec/services/projects/housekeeping_service_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe Projects::HousekeepingService do
+ subject { Projects::HousekeepingService.new(project) }
+ let(:project) { create :project }
+
+ describe :execute do
+ before do
+ project.pushes_since_gc = 3
+ project.save!
+ end
+
+ it 'enqueues a sidekiq job' do
+ expect(subject).to receive(:try_obtain_lease).and_return(true)
+ expect(GitlabShellWorker).to receive(:perform_async).with(:gc, project.path_with_namespace)
+
+ expect(subject.execute).to include('successfully started')
+ expect(project.pushes_since_gc).to eq(0)
+ end
+
+ it 'does not enqueue a job when no lease can be obtained' do
+ expect(subject).to receive(:try_obtain_lease).and_return(false)
+ expect(GitlabShellWorker).not_to receive(:perform_async)
+
+ expect(subject.execute).to include('already triggered')
+ expect(project.pushes_since_gc).to eq(3)
+ end
+ end
+
+ describe :needed? do
+ it 'when the count is low enough' do
+ expect(subject.needed?).to eq(false)
+ end
+
+ it 'when the count is high enough' do
+ allow(project).to receive(:pushes_since_gc).and_return(10)
+ expect(subject.needed?).to eq(true)
+ end
+ end
+end \ No newline at end of file