summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <contact@jacobvosmaer.nl>2016-04-12 17:07:54 +0200
committerJacob Vosmaer <contact@jacobvosmaer.nl>2016-04-12 17:07:54 +0200
commit97f4ffff1e7b5da94e18edc20c009ffb46784187 (patch)
tree5d49026f25bfacb529dafc9142250681f4263cfb
parentb37d3b9423991763ad03fca791a1daf473dafed1 (diff)
downloadgitlab-ce-97f4ffff1e7b5da94e18edc20c009ffb46784187.tar.gz
Add a 'circuit breaker' for repo checks
-rw-r--r--app/views/admin/application_settings/_form.html.haml13
-rw-r--r--app/workers/repository_check_worker.rb8
-rw-r--r--lib/gitlab/current_settings.rb3
-rw-r--r--spec/workers/repository_check_worker_spec.rb8
4 files changed, 31 insertions, 1 deletions
diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml
index de86dacbb12..afd88465a78 100644
--- a/app/views/admin/application_settings/_form.html.haml
+++ b/app/views/admin/application_settings/_form.html.haml
@@ -275,5 +275,18 @@
.col-sm-10
= f.text_field :sentry_dsn, class: 'form-control'
+ %fieldset
+ %legend Repository Checks
+ .form-group
+ .col-sm-offset-2.col-sm-10
+ .checkbox
+ = f.label :repository_checks_enabled do
+ = f.check_box :repository_checks_enabled
+ Enable Repository Checks
+ .help-block
+ GitLab will periodically run
+ %a{ href: 'https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html', target: 'blank' } 'git fsck'
+ in all project and wiki repositories to look for silent disk corruption issues.
+
.form-actions
= f.submit 'Save', class: 'btn btn-save'
diff --git a/app/workers/repository_check_worker.rb b/app/workers/repository_check_worker.rb
index afdc6a4c63a..017f49de08c 100644
--- a/app/workers/repository_check_worker.rb
+++ b/app/workers/repository_check_worker.rb
@@ -15,6 +15,7 @@ class RepositoryCheckWorker
# check, only one (or two) will be checked at a time.
project_ids.each do |project_id|
break if Time.now - start >= RUN_TIME
+ break unless current_settings.repository_checks_enabled
next if !try_obtain_lease(project_id)
@@ -45,4 +46,11 @@ class RepositoryCheckWorker
)
lease.try_obtain
end
+
+ def current_settings
+ # No caching of the settings! If we cache them and an admin disables
+ # this feature, an active RepositoryCheckWorker would keep going for up
+ # to 1 hour after the feature was disabled.
+ ApplicationSetting.current || Gitlab::CurrentSettings.fake_application_settings
+ end
end
diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb
index 1acc22fe5bf..f44d1b3a44e 100644
--- a/lib/gitlab/current_settings.rb
+++ b/lib/gitlab/current_settings.rb
@@ -34,7 +34,8 @@ module Gitlab
max_artifacts_size: Settings.artifacts['max_size'],
require_two_factor_authentication: false,
two_factor_grace_period: 48,
- akismet_enabled: false
+ akismet_enabled: false,
+ repository_checks_enabled: true,
)
end
diff --git a/spec/workers/repository_check_worker_spec.rb b/spec/workers/repository_check_worker_spec.rb
index d1849321f56..13493ad2c6a 100644
--- a/spec/workers/repository_check_worker_spec.rb
+++ b/spec/workers/repository_check_worker_spec.rb
@@ -28,4 +28,12 @@ describe RepositoryCheckWorker do
expect(subject.perform).to eq([projects[1].id])
end
+
+ it 'does nothing when repository checks are disabled' do
+ create(:empty_project)
+ current_settings = double('settings', repository_checks_enabled: false)
+ expect(subject).to receive(:current_settings) { current_settings }
+
+ expect(subject.perform).to eq(nil)
+ end
end