summaryrefslogtreecommitdiff
path: root/app/services/projects/housekeeping_service.rb
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2016-03-15 23:24:06 +0100
committerDouwe Maan <douwe@selenight.nl>2016-03-15 23:24:06 +0100
commitecfa6cd75bc0f1e003928f07f30446003a0f9875 (patch)
tree6e4212708c362c0d4e086068fe6de9ead695bf80 /app/services/projects/housekeeping_service.rb
parent7ae573c75ac51413c04249f77ed8ca4e144b7549 (diff)
parenta80b49ba1ac8ab54fd130ed889ecfbd0dccf81af (diff)
downloadgitlab-ce-ecfa6cd75bc0f1e003928f07f30446003a0f9875.tar.gz
Merge branch 'master' into git-2-7-3
Diffstat (limited to 'app/services/projects/housekeeping_service.rb')
-rw-r--r--app/services/projects/housekeeping_service.rb27
1 files changed, 27 insertions, 0 deletions
diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb
index 0db85ac2142..bccd67d3dbf 100644
--- a/app/services/projects/housekeeping_service.rb
+++ b/app/services/projects/housekeeping_service.rb
@@ -9,12 +9,39 @@ module Projects
class HousekeepingService < BaseService
include Gitlab::ShellAdapter
+ LEASE_TIMEOUT = 3600
+
+ class LeaseTaken < StandardError
+ def to_s
+ "Somebody already triggered housekeeping for this project in the past #{LEASE_TIMEOUT / 60} minutes"
+ end
+ end
+
def initialize(project)
@project = project
end
def execute
+ raise LeaseTaken if !try_obtain_lease
+
GitlabShellWorker.perform_async(:gc, @project.path_with_namespace)
+ ensure
+ @project.update_column(:pushes_since_gc, 0)
+ end
+
+ def needed?
+ @project.pushes_since_gc >= 10
+ end
+
+ def increment!
+ @project.increment!(:pushes_since_gc)
+ end
+
+ private
+
+ def try_obtain_lease
+ lease = ::Gitlab::ExclusiveLease.new("project_housekeeping:#{@project.id}", timeout: LEASE_TIMEOUT)
+ lease.try_obtain
end
end
end