summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-03-15 10:51:38 +0000
committerDouwe Maan <douwe@gitlab.com>2016-03-15 10:51:38 +0000
commitea7d062fa60e3e622288237fc66a815348bbcf36 (patch)
tree69957b37821b4593ed9e75c330a5c650150cd3c3 /app
parentbe3a9440af7cedcf60dc1bb64c63f1786dc565bc (diff)
parent30b36c92c386e93b432166fb6f9dd973882a6d82 (diff)
downloadgitlab-ce-ea7d062fa60e3e622288237fc66a815348bbcf36.tar.gz
Merge branch 'auto-gc' into 'master' revert-01160fc0
Run 'git gc' every 10 pushes Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/14250 Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/12620 Fixes https://gitlab.com/gitlab-org/gitlab-ee/issues/254 Associated gitlab-shell MR: https://gitlab.com/gitlab-org/gitlab-shell/merge_requests/44 See merge request !3206
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects_controller.rb13
-rw-r--r--app/services/git_push_service.rb9
-rw-r--r--app/services/projects/housekeeping_service.rb27
3 files changed, 45 insertions, 4 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index c70add86a20..36f37221c58 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -172,10 +172,15 @@ class ProjectsController < ApplicationController
def housekeeping
::Projects::HousekeepingService.new(@project).execute
- respond_to do |format|
- flash[:notice] = "Housekeeping successfully started."
- format.html { redirect_to project_path(@project) }
- end
+ redirect_to(
+ project_path(@project),
+ notice: "Housekeeping successfully started"
+ )
+ rescue ::Projects::HousekeepingService::LeaseTaken => ex
+ redirect_to(
+ edit_project_path(@project),
+ alert: ex.to_s
+ )
end
def toggle_star
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index bd31a617747..4313de0ccab 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -49,6 +49,8 @@ class GitPushService < BaseService
# Update merge requests that may be affected by this push. A new branch
# could cause the last commit of a merge request to change.
update_merge_requests
+
+ perform_housekeeping
end
def update_main_language
@@ -73,6 +75,13 @@ class GitPushService < BaseService
ProjectCacheWorker.perform_async(@project.id)
end
+ def perform_housekeeping
+ housekeeping = Projects::HousekeepingService.new(@project)
+ housekeeping.increment!
+ housekeeping.execute if housekeeping.needed?
+ rescue Projects::HousekeepingService::LeaseTaken
+ end
+
def process_default_branch
@push_commits = project.repository.commits(params[:newrev])
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