diff --git a/ee/app/finders/geo/project_registry_finder.rb b/ee/app/finders/geo/project_registry_finder.rb index 6e2391fded4b423a4bc27ccbbaac55e7b76a0d6c..018d8ac4f5a5fd978bbd18db3b1cea4d4a98300b 100644 --- a/ee/app/finders/geo/project_registry_finder.rb +++ b/ee/app/finders/geo/project_registry_finder.rb @@ -181,12 +181,10 @@ def fdw_find_projects_updated_recently # @return [ActiveRecord::Relation] list of registries that need verification def fdw_find_registries_to_verify(batch_size:) repo_condition = - local_registry_table[:repository_verification_checksum_sha].eq(nil) - .and(local_registry_table[:last_repository_verification_failure].eq(nil)) + local_repo_condition .and(fdw_repository_state_table[:repository_verification_checksum].not_eq(nil)) wiki_condition = - local_registry_table[:wiki_verification_checksum_sha].eq(nil) - .and(local_registry_table[:last_wiki_verification_failure].eq(nil)) + local_wiki_condition .and(fdw_repository_state_table[:wiki_verification_checksum].not_eq(nil)) Geo::ProjectRegistry @@ -316,12 +314,8 @@ def legacy_find_filtered_verification_failed_projects(type = nil) # @return [ActiveRecord::Relation] list of registries that need verification def legacy_find_registries_to_verify(batch_size:) - repo_condition = - local_registry_table[:repository_verification_checksum_sha].eq(nil) - .and(local_registry_table[:last_repository_verification_failure].eq(nil)) - wiki_condition = - local_registry_table[:wiki_verification_checksum_sha].eq(nil) - .and(local_registry_table[:last_wiki_verification_failure].eq(nil)) + repo_condition = local_repo_condition + wiki_condition = local_wiki_condition registries = Geo::ProjectRegistry .where(repo_condition.or(wiki_condition)) @@ -355,10 +349,6 @@ def legacy_find_registries_to_verify(batch_size:) Geo::ProjectRegistry.where(project_id: project_ids) end - def local_registry_table - Geo::ProjectRegistry.arel_table - end - def legacy_repository_state_table ::ProjectRepositoryState.arel_table end @@ -370,5 +360,21 @@ def fdw_project_table def fdw_repository_state_table Geo::Fdw::ProjectRepositoryState.arel_table end + + def local_registry_table + Geo::ProjectRegistry.arel_table + end + + def local_repo_condition + local_registry_table[:repository_verification_checksum_sha].eq(nil) + .and(local_registry_table[:last_repository_verification_failure].eq(nil)) + .and(local_registry_table[:resync_repository].eq(false)) + end + + def local_wiki_condition + local_registry_table[:wiki_verification_checksum_sha].eq(nil) + .and(local_registry_table[:last_wiki_verification_failure].eq(nil)) + .and(local_registry_table[:resync_wiki].eq(false)) + end end end diff --git a/ee/changelogs/unreleased/bw-verification-resync-fix.yml b/ee/changelogs/unreleased/bw-verification-resync-fix.yml new file mode 100644 index 0000000000000000000000000000000000000000..cc91ace25d64b0b359e59ed479cc3016b65fa785 --- /dev/null +++ b/ee/changelogs/unreleased/bw-verification-resync-fix.yml @@ -0,0 +1,5 @@ +--- +title: During repository verification, ignore repositories/wikis that need to be resynced +merge_request: 5568 +author: +type: fixed diff --git a/ee/spec/finders/geo/project_registry_finder_spec.rb b/ee/spec/finders/geo/project_registry_finder_spec.rb index 2ecb64df029321fef6351e7446bfb9c27b508ad0..8dda19092f73ac0b6a208bf45eafd34ee6946e74 100644 --- a/ee/spec/finders/geo/project_registry_finder_spec.rb +++ b/ee/spec/finders/geo/project_registry_finder_spec.rb @@ -509,10 +509,10 @@ repository_outdated_secondary = create(:repository_state, :repository_verified, :wiki_verified).project wiki_outdated_secondary = create(:repository_state, :repository_verified, :wiki_verified).project - registry_unverified_secondary = create(:geo_project_registry, project: project_unverified_secondary) - registry_outdated_secondary = create(:geo_project_registry, :repository_verification_outdated, :wiki_verification_outdated, project: project_outdated_secondary) - registry_repository_outdated_secondary = create(:geo_project_registry, :repository_verification_outdated, :wiki_verified, project: repository_outdated_secondary) - registry_wiki_outdated_secondary = create(:geo_project_registry, :repository_verified, :wiki_verification_outdated, project: wiki_outdated_secondary) + registry_unverified_secondary = create(:geo_project_registry, :synced, project: project_unverified_secondary) + registry_outdated_secondary = create(:geo_project_registry, :synced, :repository_verification_outdated, :wiki_verification_outdated, project: project_outdated_secondary) + registry_repository_outdated_secondary = create(:geo_project_registry, :synced, :repository_verification_outdated, :wiki_verified, project: repository_outdated_secondary) + registry_wiki_outdated_secondary = create(:geo_project_registry, :synced, :repository_verified, :wiki_verification_outdated, project: wiki_outdated_secondary) expect(subject.find_registries_to_verify(batch_size: 100)) .to match_array([ @@ -536,9 +536,9 @@ repository_failed_primary = create(:repository_state, :repository_failed, :wiki_verified).project wiki_failed_primary = create(:repository_state, :repository_verified, :wiki_failed).project - create(:geo_project_registry, project: verification_failed_primary) - registry_repository_failed_primary = create(:geo_project_registry, project: repository_failed_primary) - registry_wiki_failed_primary = create(:geo_project_registry, project: wiki_failed_primary) + create(:geo_project_registry, :synced, project: verification_failed_primary) + registry_repository_failed_primary = create(:geo_project_registry, :synced, project: repository_failed_primary) + registry_wiki_failed_primary = create(:geo_project_registry, :synced, project: wiki_failed_primary) expect(subject.find_registries_to_verify(batch_size: 100)) .to match_array([ @@ -559,6 +559,20 @@ expect(subject.find_registries_to_verify(batch_size: 100)).to be_empty end + + it 'does not return registries when the repo needs to be resynced' do + project_verified = create(:repository_state, :repository_verified).project + create(:geo_project_registry, :repository_sync_failed, project: project_verified) + + expect(subject.find_registries_to_verify(batch_size: 100)).to be_empty + end + + it 'does not return registries when the wiki needs to be resynced' do + project_verified = create(:repository_state, :wiki_verified).project + create(:geo_project_registry, :wiki_sync_failed, project: project_verified) + + expect(subject.find_registries_to_verify(batch_size: 100)).to be_empty + end end end diff --git a/ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb b/ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb index 75f2261f0f3d43825fe9eafe6625a6f708b68554..533a9ad96ddb59963950ccb224602e8c68c2cb6b 100644 --- a/ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb +++ b/ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb @@ -26,8 +26,8 @@ other_project = create(:project) create(:repository_state, :repository_verified, project: project) create(:repository_state, :repository_verified, project: other_project) - create(:geo_project_registry, :repository_verification_outdated, project: project) - create(:geo_project_registry, :repository_verification_outdated, project: other_project) + create(:geo_project_registry, :synced, :repository_verification_outdated, project: project) + create(:geo_project_registry, :synced, :repository_verification_outdated, project: other_project) expect(secondary_singleworker).to receive(:perform_async).twice @@ -36,7 +36,7 @@ it 'schedules job for projects missing repository verification' do create(:repository_state, :repository_verified, :wiki_verified, project: project) - missing_repository_verification = create(:geo_project_registry, :wiki_verified, project: project) + missing_repository_verification = create(:geo_project_registry, :synced, :wiki_verified, project: project) expect(secondary_singleworker).to receive(:perform_async).with(missing_repository_verification.id) @@ -45,7 +45,7 @@ it 'schedules job for projects missing wiki verification' do create(:repository_state, :repository_verified, :wiki_verified, project: project) - missing_wiki_verification = create(:geo_project_registry, :repository_verified, project: project) + missing_wiki_verification = create(:geo_project_registry, :synced, :repository_verified, project: project) expect(secondary_singleworker).to receive(:perform_async).with(missing_wiki_verification.id) @@ -67,8 +67,8 @@ let(:project6_both_verified) { create(:repository_state, :repository_verified, :wiki_verified).project } it 'handles multiple batches of projects needing verification' do - reg1 = create(:geo_project_registry, :repository_verification_outdated, project: project1_repo_verified) - reg2 = create(:geo_project_registry, :repository_verification_outdated, project: project2_repo_verified) + reg1 = create(:geo_project_registry, :synced, :repository_verification_outdated, project: project1_repo_verified) + reg2 = create(:geo_project_registry, :synced, :repository_verification_outdated, project: project2_repo_verified) expect(secondary_singleworker).to receive(:perform_async).with(reg1.id).once @@ -82,12 +82,12 @@ end it 'handles multiple batches of projects needing verification, skipping failed repos' do - reg1 = create(:geo_project_registry, :repository_verification_outdated, project: project1_repo_verified) - reg2 = create(:geo_project_registry, :repository_verification_outdated, project: project2_repo_verified) - create(:geo_project_registry, :repository_verification_outdated, project: project3_repo_failed) - reg4 = create(:geo_project_registry, :wiki_verification_outdated, project: project4_wiki_verified) - create(:geo_project_registry, :repository_verification_failed, :wiki_verification_failed, project: project5_both_verified) - reg6 = create(:geo_project_registry, project: project6_both_verified) + reg1 = create(:geo_project_registry, :synced, :repository_verification_outdated, project: project1_repo_verified) + reg2 = create(:geo_project_registry, :synced, :repository_verification_outdated, project: project2_repo_verified) + create(:geo_project_registry, :synced, :repository_verification_outdated, project: project3_repo_failed) + reg4 = create(:geo_project_registry, :synced, :wiki_verification_outdated, project: project4_wiki_verified) + create(:geo_project_registry, :synced, :repository_verification_failed, :wiki_verification_failed, project: project5_both_verified) + reg6 = create(:geo_project_registry, :synced, project: project6_both_verified) expect(secondary_singleworker).to receive(:perform_async).with(reg1.id).once