summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToon Claes <toon@gitlab.com>2018-05-07 14:21:44 +0200
committerToon Claes <toon@gitlab.com>2018-05-07 14:24:07 +0200
commit049080263684f2763b0abdbe310bb742253eca53 (patch)
tree96cebd04a0b00291e887cf8ae6ee10fe8016a2f0
parentca29aa114b200da81b2805dbe45fdc18a13400f9 (diff)
downloadgitlab-ce-049080263684f2763b0abdbe310bb742253eca53.tar.gz
Use push events again to determine if repo needs checking
-rw-r--r--app/workers/repository_check/batch_worker.rb12
-rw-r--r--app/workers/repository_check/single_repository_worker.rb22
-rw-r--r--spec/workers/repository_check/single_repository_worker_spec.rb34
3 files changed, 38 insertions, 30 deletions
diff --git a/app/workers/repository_check/batch_worker.rb b/app/workers/repository_check/batch_worker.rb
index cfe81a489bf..72f0a9b0619 100644
--- a/app/workers/repository_check/batch_worker.rb
+++ b/app/workers/repository_check/batch_worker.rb
@@ -32,16 +32,8 @@ module RepositoryCheck
# array of ID's. This is OK because we do it only once an hour, because
# getting ID's from Postgres is not terribly slow, and because no user
# has to sit and wait for this query to finish.
- def project_ids(batch_size = BATCH_SIZE)
- project_ids = never_checked_project_ids(batch_size)
-
- remaining_capacity = batch_size - project_ids.count
-
- if remaining_capacity > 0
- project_ids + old_checked_project_ids(remaining_capacity)
- else
- project_ids
- end
+ def project_ids
+ never_checked_project_ids(BATCH_SIZE) + old_checked_project_ids(BATCH_SIZE)
end
def never_checked_project_ids(batch_size)
diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb
index 3dcd4a97497..3cffb8b14e4 100644
--- a/app/workers/repository_check/single_repository_worker.rb
+++ b/app/workers/repository_check/single_repository_worker.rb
@@ -24,18 +24,13 @@ module RepositoryCheck
end
def repo_healthy?(project)
- return true if project.empty_repo?
+ return true unless has_changes?(project)
git_fsck(project.repository)
end
def wiki_repo_healthy?(project)
- return true unless project.wiki_enabled?
-
- # Historically some projects never had their wiki repos initialized;
- # this happens on project creation now. Let's initialize an empty repo
- # if it is not already there.
- project.create_wiki
+ return true unless has_wiki_changes?(project)
git_fsck(project.wiki.repository)
end
@@ -51,8 +46,19 @@ module RepositoryCheck
false
end
- def has_pushes?(project)
+ def has_changes?(project)
Project.with_push.exists?(project.id)
end
+
+ def has_wiki_changes?(project)
+ return false unless project.wiki_enabled?
+
+ # Historically some projects never had their wiki repos initialized;
+ # this happens on project creation now. Let's initialize an empty repo
+ # if it is not already there.
+ return false unless project.create_wiki
+
+ has_changes?(project)
+ end
end
end
diff --git a/spec/workers/repository_check/single_repository_worker_spec.rb b/spec/workers/repository_check/single_repository_worker_spec.rb
index 1c9663bbab5..58227abc2b5 100644
--- a/spec/workers/repository_check/single_repository_worker_spec.rb
+++ b/spec/workers/repository_check/single_repository_worker_spec.rb
@@ -4,8 +4,10 @@ require 'fileutils'
describe RepositoryCheck::SingleRepositoryWorker do
subject(:worker) { described_class.new }
- it 'skips when the project repo is empty' do
- project = create(:project, :wiki_disabled)
+ it 'skips when the project has no push events' do
+ project = create(:project, :repository, :wiki_disabled)
+ project.events.destroy_all
+ break_project(project)
expect(worker).not_to receive(:git_fsck)
@@ -14,8 +16,19 @@ describe RepositoryCheck::SingleRepositoryWorker do
expect(project.reload.last_repository_check_failed).to eq(false)
end
+ it 'fails when the project has push events and a broken repository' do
+ project = create(:project, :repository)
+ create_push_event(project)
+ break_project(project)
+
+ worker.perform(project.id)
+
+ expect(project.reload.last_repository_check_failed).to eq(true)
+ end
+
it 'succeeds when the project repo is valid' do
project = create(:project, :repository, :wiki_disabled)
+ create_push_event(project)
expect(worker).to receive(:git_fsck).and_call_original
@@ -26,18 +39,10 @@ describe RepositoryCheck::SingleRepositoryWorker do
expect(project.reload.last_repository_check_failed).to eq(false)
end
- it 'fails when the project is not empty and a broken repository' do
- project = create(:project, :repository)
- break_project(project)
-
- worker.perform(project.id)
-
- expect(project.reload.last_repository_check_failed).to eq(true)
- end
-
it 'fails if the wiki repository is broken' do
- project = create(:project, :wiki_enabled)
+ project = create(:project, :repository, :wiki_enabled)
project.create_wiki
+ create_push_event(project)
# Test sanity: everything should be fine before the wiki repo is broken
worker.perform(project.id)
@@ -78,6 +83,10 @@ describe RepositoryCheck::SingleRepositoryWorker do
expect(Gitlab::Shell.new.exists?(project.repository_storage, project.wiki.path)).to eq(false)
end
+ def create_push_event(project)
+ project.events.create(action: Event::PUSHED, author_id: create(:user).id)
+ end
+
def break_wiki(project)
break_repo(wiki_path(project))
end
@@ -90,6 +99,7 @@ describe RepositoryCheck::SingleRepositoryWorker do
break_repo(project.repository.path_to_repo)
end
+
def break_repo(repo)
# Create or replace blob ffffffffffffffffffffffffffffffffffffffff with an empty file
# This will make the repo invalid, _and_ 'git init' cannot fix it.