summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Edwards-Jones <jedwardsjones@gitlab.com>2017-10-03 10:11:12 +0100
committerJames Edwards-Jones <jedwardsjones@gitlab.com>2017-11-06 17:51:50 +0000
commit17d6efee29e6548e09407d747988a5651d067e0e (patch)
treed2a6fa65760d47f2752f65997dacced47ad625f8
parenta412c6321e2a3e75fa853ad0b3dd62bd810839fd (diff)
downloadgitlab-ce-17d6efee29e6548e09407d747988a5651d067e0e.tar.gz
LFS pruning can be scheduled in background
-rw-r--r--app/workers/lfs_cleanup_worker.rb14
-rw-r--r--app/workers/lfs_project_cleanup_worker.rb9
-rw-r--r--config/initializers/1_settings.rb4
-rw-r--r--spec/workers/lfs_cleanup_worker_spec.rb33
-rw-r--r--spec/workers/lfs_project_cleanup_worker_spec.rb12
5 files changed, 72 insertions, 0 deletions
diff --git a/app/workers/lfs_cleanup_worker.rb b/app/workers/lfs_cleanup_worker.rb
new file mode 100644
index 00000000000..c1d5d771c53
--- /dev/null
+++ b/app/workers/lfs_cleanup_worker.rb
@@ -0,0 +1,14 @@
+class LfsCleanupWorker
+ include Sidekiq::Worker
+ include CronjobQueue
+
+ def perform
+ projects = Project.joins(:lfs_pointers)
+ .joins(:lfs_objects)
+ .uniq
+
+ projects.select(:id).find_each do |project|
+ LfsProjectCleanupWorker.perform_async(project.id)
+ end
+ end
+end
diff --git a/app/workers/lfs_project_cleanup_worker.rb b/app/workers/lfs_project_cleanup_worker.rb
new file mode 100644
index 00000000000..982c0cae841
--- /dev/null
+++ b/app/workers/lfs_project_cleanup_worker.rb
@@ -0,0 +1,9 @@
+class LfsProjectCleanupWorker
+ include Sidekiq::Worker
+
+ def perform(project_id)
+ project = Project.find(project_id)
+
+ LfsCleanupService.new(project).remove_unreferenced
+ end
+end
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 12694f8016f..ef7c7c0d169 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -415,6 +415,10 @@ Settings.cron_jobs['stuck_merge_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_merge_jobs_worker']['cron'] ||= '0 */2 * * *'
Settings.cron_jobs['stuck_merge_jobs_worker']['job_class'] = 'StuckMergeJobsWorker'
+Settings.cron_jobs['lfs_cleanup_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['lfs_cleanup_worker']['cron'] ||= '0 0 * * 0'
+Settings.cron_jobs['lfs_cleanup_worker']['job_class'] = 'LfsCleanupWorker'
+
#
# GitLab Shell
#
diff --git a/spec/workers/lfs_cleanup_worker_spec.rb b/spec/workers/lfs_cleanup_worker_spec.rb
new file mode 100644
index 00000000000..ee91fa3ab2a
--- /dev/null
+++ b/spec/workers/lfs_cleanup_worker_spec.rb
@@ -0,0 +1,33 @@
+require 'spec_helper'
+
+describe LfsCleanupWorker do
+ subject(:worker) { described_class.new }
+
+ describe '#perform' do
+ let!(:project) { create(:project) }
+ let!(:lfs_pointer) { create(:lfs_pointer, project: project) }
+ let!(:lfs_objects_project) { create(:lfs_objects_project, project: project) }
+
+ it 'schedules cleanup for individual projects' do
+ expect(LfsProjectCleanupWorker).to receive(:perform_async).with(project.id)
+
+ subject.perform
+ end
+
+ it 'ignores projects without LfsPointer records' do
+ project.lfs_pointers.destroy_all
+
+ expect(LfsProjectCleanupWorker).not_to receive(:perform_async)
+
+ subject.perform
+ end
+
+ it 'ignores projects without LfsObject records' do
+ project.lfs_pointers.destroy_all
+
+ expect(LfsProjectCleanupWorker).not_to receive(:perform_async)
+
+ subject.perform
+ end
+ end
+end
diff --git a/spec/workers/lfs_project_cleanup_worker_spec.rb b/spec/workers/lfs_project_cleanup_worker_spec.rb
new file mode 100644
index 00000000000..327fa8acd14
--- /dev/null
+++ b/spec/workers/lfs_project_cleanup_worker_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe LfsProjectCleanupWorker do
+ let(:project) { create(:project) }
+ subject(:worker) { described_class.new }
+
+ it 'calls service to cleanup unreferenced LFS pointers' do
+ expect_any_instance_of(LfsCleanupService).to receive(:remove_unreferenced)
+
+ subject.perform(project.id)
+ end
+end