Commit 95002b2a authored by Nick Thomas's avatar Nick Thomas

Merge branch...

Merge branch '6077-geo-repository-verification-gets-stuck-when-all-projects-have-been-verified-at-least-once' into 'master'

Resolve "Geo: Repository verification gets stuck when all projects have been verified at least once"

Closes #6077

See merge request gitlab-org/gitlab-ee!5772
parents 4d1fd196 4336b2d3
...@@ -18,14 +18,4 @@ class ProjectRepositoryState < ActiveRecord::Base ...@@ -18,14 +18,4 @@ class ProjectRepositoryState < ActiveRecord::Base
scope :verification_failed_wikis, -> { where.not(last_wiki_verification_failure: nil) } scope :verification_failed_wikis, -> { where.not(last_wiki_verification_failure: nil) }
scope :verified_repos, -> { where.not(repository_verification_checksum: nil).where(last_repository_verification_failure: nil) } scope :verified_repos, -> { where.not(repository_verification_checksum: nil).where(last_repository_verification_failure: nil) }
scope :verified_wikis, -> { where.not(wiki_verification_checksum: nil).where(last_wiki_verification_failure: nil) } scope :verified_wikis, -> { where.not(wiki_verification_checksum: nil).where(last_wiki_verification_failure: nil) }
def repository_checksum_outdated?
repository_verification_checksum.nil?
end
def wiki_checksum_outdated?
return false unless project.wiki_enabled?
wiki_verification_checksum.nil?
end
end end
...@@ -18,8 +18,8 @@ module Geo ...@@ -18,8 +18,8 @@ module Geo
return if project.nil? || project.pending_delete? return if project.nil? || project.pending_delete?
try_obtain_lease do try_obtain_lease do
calculate_repository_checksum if repository_state.repository_checksum_outdated? calculate_repository_checksum if repository_state.repository_verification_checksum.nil?
calculate_wiki_checksum if repository_state.wiki_checksum_outdated? calculate_wiki_checksum if repository_state.wiki_verification_checksum.nil?
end end
end end
......
---
title: Geo - Calculate the wiki checksum even when wiki is disabled
merge_request: 5772
author:
type: fixed
...@@ -16,42 +16,4 @@ describe ProjectRepositoryState do ...@@ -16,42 +16,4 @@ describe ProjectRepositoryState do
it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_presence_of(:project) }
it { is_expected.to validate_uniqueness_of(:project) } it { is_expected.to validate_uniqueness_of(:project) }
end end
describe '#repository_checksum_outdated?' do
it 'returns true when repository_verification_checksum is nil' do
repository_state.repository_verification_checksum = nil
expect(repository_state.repository_checksum_outdated?).to eq true
end
it 'returns false when repository_verification_checksum is not nil' do
repository_state.repository_verification_checksum = '123'
expect(repository_state.repository_checksum_outdated?).to eq false
end
end
describe '#wiki_checksum_outdated?' do
context 'wiki enabled' do
it 'returns true when wiki_verification_checksum is nil' do
repository_state.wiki_verification_checksum = nil
expect(repository_state.wiki_checksum_outdated?).to eq true
end
it 'returns false when wiki_verification_checksum is not nil' do
repository_state.wiki_verification_checksum = '123'
expect(repository_state.wiki_checksum_outdated?).to eq false
end
end
context 'wiki disabled' do
it 'returns false' do
project.update!(wiki_enabled: false)
expect(repository_state.wiki_checksum_outdated?).to eq false
end
end
end
end end
...@@ -3,11 +3,11 @@ require 'spec_helper' ...@@ -3,11 +3,11 @@ require 'spec_helper'
describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean_gitlab_redis_cache do describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean_gitlab_redis_cache do
include ::EE::GeoHelpers include ::EE::GeoHelpers
set(:project) { create(:project, :repository, :wiki_repo) } set(:project) { create(:project) }
set(:project_empty_repo) { create(:project) }
let!(:primary) { create(:geo_node, :primary) } let!(:primary) { create(:geo_node, :primary) }
let(:repository) { double } let(:repository) { double(checksum: 'f123') }
let(:wiki) { double(checksum: 'e321') }
before do before do
stub_current_geo_node(primary) stub_current_geo_node(primary)
...@@ -19,17 +19,25 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean ...@@ -19,17 +19,25 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean
end end
it 'does not calculate the checksum when not running on a primary' do it 'does not calculate the checksum when not running on a primary' do
stub_project_repository(project, repository)
stub_wiki_repository(project.wiki, wiki)
allow(Gitlab::Geo).to receive(:primary?) { false } allow(Gitlab::Geo).to receive(:primary?) { false }
expect(project_empty_repo.repository).not_to receive(:checksum) expect(repository).not_to receive(:checksum)
expect(wiki).not_to receive(:checksum)
subject.perform(project_empty_repo.id) subject.perform(project.id)
end end
it 'does not calculate the checksum when project is pending deletion' do it 'does not calculate the checksum when project is pending deletion' do
stub_project_repository(project, repository)
stub_wiki_repository(project.wiki, wiki)
project.update!(pending_delete: true) project.update!(pending_delete: true)
expect(project.repository).not_to receive(:checksum) expect(repository).not_to receive(:checksum)
expect(wiki).not_to receive(:checksum)
subject.perform(project.id) subject.perform(project.id)
end end
...@@ -39,17 +47,23 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean ...@@ -39,17 +47,23 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean
end end
it 'calculates the checksum for unverified projects' do it 'calculates the checksum for unverified projects' do
stub_project_repository(project, repository)
stub_wiki_repository(project.wiki, wiki)
subject.perform(project.id) subject.perform(project.id)
expect(project.repository_state).to have_attributes( expect(project.repository_state).to have_attributes(
repository_verification_checksum: instance_of(String), repository_verification_checksum: 'f123',
last_repository_verification_failure: nil, last_repository_verification_failure: nil,
wiki_verification_checksum: instance_of(String), wiki_verification_checksum: 'e321',
last_wiki_verification_failure: nil last_wiki_verification_failure: nil
) )
end end
it 'calculates the checksum for outdated projects' do it 'calculates the checksum for outdated projects' do
stub_project_repository(project, repository)
stub_wiki_repository(project.wiki, wiki)
repository_state = repository_state =
create(:repository_state, create(:repository_state,
project: project, project: project,
...@@ -58,74 +72,87 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean ...@@ -58,74 +72,87 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean
subject.perform(project.id) subject.perform(project.id)
repository_state.reload expect(repository_state.reload).to have_attributes(
repository_verification_checksum: 'f123',
expect(repository_state.repository_verification_checksum).not_to be_nil last_repository_verification_failure: nil,
expect(repository_state.wiki_verification_checksum).not_to be_nil wiki_verification_checksum: 'e321',
last_wiki_verification_failure: nil
)
end end
it 'calculates the checksum for outdated repositories' do it 'calculates the checksum for outdated repositories' do
stub_project_repository(project, repository)
repository_state = repository_state =
create(:repository_state, create(:repository_state,
project: project, project: project,
repository_verification_checksum: nil, repository_verification_checksum: nil,
wiki_verification_checksum: 'e123') wiki_verification_checksum: 'e079a831cab27bcda7d81cd9b48296d0c3dd92ef')
subject.perform(project.id) subject.perform(project.id)
repository_state.reload expect(repository_state.reload).to have_attributes(
repository_verification_checksum: 'f123',
expect(repository_state.repository_verification_checksum).not_to be_nil last_repository_verification_failure: nil,
expect(repository_state.wiki_verification_checksum).to eq 'e123' wiki_verification_checksum: 'e079a831cab27bcda7d81cd9b48296d0c3dd92ef',
last_wiki_verification_failure: nil
)
end end
it 'calculates the checksum for outdated wikis' do it 'calculates the checksum for outdated wikis' do
stub_wiki_repository(project.wiki, wiki)
repository_state = repository_state =
create(:repository_state, create(:repository_state,
project: project, project: project,
repository_verification_checksum: 'f123', repository_verification_checksum: 'f079a831cab27bcda7d81cd9b48296d0c3dd92ee',
wiki_verification_checksum: nil) wiki_verification_checksum: nil)
subject.perform(project.id) subject.perform(project.id)
repository_state.reload expect(repository_state.reload).to have_attributes(
repository_verification_checksum: 'f079a831cab27bcda7d81cd9b48296d0c3dd92ee',
expect(repository_state.repository_verification_checksum).to eq 'f123' last_repository_verification_failure: nil,
expect(repository_state.wiki_verification_checksum).not_to be_nil wiki_verification_checksum: 'e321',
last_wiki_verification_failure: nil
)
end end
it 'does not recalculate the checksum for projects up to date' do it 'does not recalculate the checksum for projects up to date' do
repository_state = stub_project_repository(project, repository)
create(:repository_state, stub_wiki_repository(project.wiki, wiki)
project: project,
repository_verification_checksum: 'f123',
wiki_verification_checksum: 'e123')
subject.perform(project.id) create(:repository_state,
project: project,
repository_verification_checksum: 'f079a831cab27bcda7d81cd9b48296d0c3dd92ee',
wiki_verification_checksum: 'e079a831cab27bcda7d81cd9b48296d0c3dd92ef')
expect(repository_state.reload).to have_attributes( expect(repository).not_to receive(:checksum)
repository_verification_checksum: 'f123', expect(wiki).not_to receive(:checksum)
wiki_verification_checksum: 'e123'
) subject.perform(project.id)
end end
it 'does not calculate the wiki checksum when wiki is not enabled for project' do it 'calculates the wiki checksum even when wiki is not enabled for project' do
stub_project_repository(project, repository)
stub_wiki_repository(project.wiki, wiki)
project.update!(wiki_enabled: false) project.update!(wiki_enabled: false)
subject.perform(project.id) subject.perform(project.id)
expect(project.repository_state).to have_attributes( expect(project.repository_state).to have_attributes(
repository_verification_checksum: instance_of(String), repository_verification_checksum: 'f123',
last_repository_verification_failure: nil, last_repository_verification_failure: nil,
wiki_verification_checksum: nil, wiki_verification_checksum: 'e321',
last_wiki_verification_failure: nil last_wiki_verification_failure: nil
) )
end end
it 'does not mark the calculating as failed when there is no repo' do it 'does not mark the calculating as failed when there is no repo' do
subject.perform(project_empty_repo.id) subject.perform(project.id)
expect(project_empty_repo.repository_state).to have_attributes( expect(project.repository_state).to have_attributes(
repository_verification_checksum: '0000000000000000000000000000000000000000', repository_verification_checksum: '0000000000000000000000000000000000000000',
last_repository_verification_failure: nil, last_repository_verification_failure: nil,
wiki_verification_checksum: '0000000000000000000000000000000000000000', wiki_verification_checksum: '0000000000000000000000000000000000000000',
...@@ -147,29 +174,37 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean ...@@ -147,29 +174,37 @@ describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean
end end
it 'keeps track of failures when calculating the repository checksum' do it 'keeps track of failures when calculating the repository checksum' do
allow(Repository).to receive(:new).with( stub_project_repository(project, repository)
project.full_path, stub_wiki_repository(project.wiki, wiki)
project,
disk_path: project.disk_path
).and_return(repository)
allow(Repository).to receive(:new).with( allow(repository).to receive(:checksum).and_raise('Something went wrong with repository')
project.wiki.full_path, allow(wiki).to receive(:checksum).twice.and_raise('Something went wrong with wiki')
project,
disk_path: project.wiki.disk_path,
is_wiki: true
).and_return(repository)
allow(repository).to receive(:checksum).twice.and_raise('Something went wrong')
subject.perform(project.id) subject.perform(project.id)
expect(project.repository_state).to have_attributes( expect(project.repository_state).to have_attributes(
repository_verification_checksum: nil, repository_verification_checksum: nil,
last_repository_verification_failure: 'Something went wrong', last_repository_verification_failure: 'Something went wrong with repository',
wiki_verification_checksum: nil, wiki_verification_checksum: nil,
last_wiki_verification_failure: 'Something went wrong' last_wiki_verification_failure: 'Something went wrong with wiki'
) )
end end
end end
def stub_project_repository(project, repository)
allow(Repository).to receive(:new).with(
project.full_path,
project,
disk_path: project.disk_path
).and_return(repository)
end
def stub_wiki_repository(wiki, repository)
allow(Repository).to receive(:new).with(
project.wiki.full_path,
project,
disk_path: project.wiki.disk_path,
is_wiki: true
).and_return(repository)
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment