Commit bdfa544a authored by Douglas Barbosa Alexandre's avatar Douglas Barbosa Alexandre Committed by Ash McKenzie

Remove legacy finder for projects updated recently

This commit removes the legacy queries for projects updated
recently since  we made Foreign Data Wrapper (FDW) a hard
requirement for Geo on GitLab 12.0.
parent bf087c0e
# frozen_string_literal: true
# Finder for retrieving projects updated recently that
# belong to a specific shard using cross-database joins.
#
# Basic usage:
#
# Geo::LegacyProjectUpdatedRecentlyFinder
# .new(current_node: Gitlab::Geo.current_node, shard_name: 'default', batch_size: 1000)
# .execute
module Geo
class LegacyProjectUpdatedRecentlyFinder < RegistryFinder
def initialize(current_node: nil, shard_name:, batch_size:)
super(current_node: current_node)
@shard_name = shard_name
@batch_size = batch_size
end
# rubocop:disable CodeReuse/ActiveRecord
def execute
registries = find_registries_to_resync
return Project.none if registries.empty?
id_and_last_sync_values = registries.map do |id, last_repository_synced_at|
"(#{id}, #{quote_value(last_repository_synced_at)})"
end
projects = current_node.projects.within_shards(shard_name)
joined_relation = projects.joins(<<~SQL)
INNER JOIN
(VALUES #{id_and_last_sync_values.join(',')})
project_registry(id, last_repository_synced_at)
ON #{Project.table_name}.id = project_registry.id
SQL
joined_relation
.limit(batch_size)
end
# rubocop:enable CodeReuse/ActiveRecord
private
attr_reader :batch_size, :shard_name
# rubocop:disable CodeReuse/ActiveRecord
def find_registries_to_resync
Geo::ProjectRegistry
.dirty
.retry_due
.pluck(:project_id, :last_repository_synced_at)
end
# rubocop:enable CodeReuse/ActiveRecord
end
end
......@@ -79,21 +79,13 @@ module Geo
end
def find_projects_updated_recently(shard_name:, batch_size:)
finder_klass_for_projects_updated_recently
Geo::ProjectUpdatedRecentlyFinder
.new(current_node: current_node, shard_name: shard_name, batch_size: batch_size)
.execute
end
private
def finder_klass_for_projects_updated_recently
if use_legacy_queries_for_selective_sync?
Geo::LegacyProjectUpdatedRecentlyFinder
else
Geo::ProjectUpdatedRecentlyFinder
end
end
def registries_for_synced_projects(type)
Geo::ProjectRegistrySyncedFinder
.new(current_node: current_node, type: type)
......
# frozen_string_literal: true
require 'spec_helper'
describe Geo::LegacyProjectUpdatedRecentlyFinder, :geo do
describe '#execute' do
let(:node) { create(:geo_node) }
let(:group_1) { create(:group) }
let(:group_2) { create(:group) }
let(:nested_group_1) { create(:group, parent: group_1) }
let!(:project_1) { create(:project, group: group_1) }
let!(:project_2) { create(:project, group: nested_group_1) }
let!(:project_3) { create(:project, group: group_2) }
let!(:project_4) { create(:project, group: group_1) }
before do
project_4.update_column(:repository_storage, 'foo')
create(:geo_project_registry, :synced, :repository_dirty, project: project_1)
create(:geo_project_registry, :synced, :repository_dirty, project: project_2)
create(:geo_project_registry, :synced, project: project_3)
create(:geo_project_registry, :synced, :wiki_dirty, project: project_4)
end
subject { described_class.new(current_node: node, shard_name: 'default', batch_size: 100) }
context 'without selective sync' do
it 'returns projects with a dirty entry on the tracking database' do
expect(subject.execute).to match_ids(project_1, project_2)
end
end
context 'with selective sync by namespace' do
it 'returns projects that belong to the namespaces with a dirty entry on the tracking database' do
node.update!(selective_sync_type: 'namespaces', namespaces: [group_1])
expect(subject.execute).to match_ids(project_1, project_2)
end
end
context 'with selective sync by shard' do
before do
node.update!(selective_sync_type: 'shards', selective_sync_shards: ['foo'])
end
it 'does not return registries when selected shards to sync does not include the shard_name' do
subject = described_class.new(current_node: node, shard_name: 'default', batch_size: 100)
expect(subject.execute).to be_empty
end
it 'returns projects that belong to the shards with a dirty entry on the tracking database' do
project_5 = create(:project, group: group_1)
project_5.update_column(:repository_storage, 'foo')
create(:geo_project_registry, :synced, project: project_5)
subject = described_class.new(current_node: node, shard_name: 'foo', batch_size: 100)
expect(subject.execute).to match_ids(project_4)
end
end
end
end
require 'spec_helper'
describe Geo::ProjectRegistryFinder, :geo do
using RSpec::Parameterized::TableSyntax
include ::EE::GeoHelpers
# Using let() instead of set() because set() does not work properly
......@@ -380,35 +378,6 @@ describe Geo::ProjectRegistryFinder, :geo do
end
end
shared_examples 'delegates to the proper finder' do |legacy_finder_klass, finder_klass, method, args|
where(:selective_sync, :fdw_enabled, :fdw_for_selective_sync, :finder) do
false | false | false | legacy_finder_klass
false | false | true | legacy_finder_klass
false | true | true | finder_klass
false | true | false | finder_klass
true | false | false | legacy_finder_klass
true | false | true | legacy_finder_klass
true | true | true | finder_klass
true | true | false | legacy_finder_klass
end
with_them do
before do
stub_fdw(fdw_enabled)
stub_feature_flags(use_fdw_queries_for_selective_sync: fdw_for_selective_sync)
stub_selective_sync(secondary, selective_sync)
end
it 'delegates to the proper finder' do
expect_next_instance_of(finder) do |finder|
expect(finder).to receive(:execute).once
end
subject.public_send(method, *args)
end
end
end
context 'FDW', :geo_fdw do
context 'with use_fdw_queries_for_selective_sync disabled' do
before do
......@@ -438,10 +407,13 @@ describe Geo::ProjectRegistryFinder, :geo do
end
describe '#find_projects_updated_recently', :geo_fdw do
include_examples 'delegates to the proper finder',
Geo::LegacyProjectUpdatedRecentlyFinder,
Geo::ProjectUpdatedRecentlyFinder,
:find_projects_updated_recently, [shard_name: 'default', batch_size: 100]
it 'delegates to the proper finder' do
expect_next_instance_of(Geo::ProjectUpdatedRecentlyFinder) do |finder|
expect(finder).to receive(:execute).once
end
subject.find_projects_updated_recently(shard_name: 'default', batch_size: 100)
end
end
describe '#find_failed_project_registries', :geo_fdw do
......
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