Commit f847c19c authored by Gabriel Mazetto's avatar Gabriel Mazetto

Merge branch 'mk/require-primary-key-scope-for-replicables' into 'master'

Geo: Refactor: Subsume scope by primary key for replicables

See merge request gitlab-org/gitlab!43475
parents 0ffeb505 22d22650
...@@ -197,7 +197,9 @@ For example, to add support for files referenced by a `Widget` model with a ...@@ -197,7 +197,9 @@ For example, to add support for files referenced by a `Widget` model with a
file_store == ObjectStorage::Store::LOCAL file_store == ObjectStorage::Store::LOCAL
end end
def self.replicables_for_geo_node # @param primary_key_in [Range, Widget] arg to pass to primary_key_in scope
# @return [ActiveRecord::Relation<Widget>] everything that should be synced to this node, restricted by primary key
def self.replicables_for_geo_node(primary_key_in)
# Should be implemented. The idea of the method is to restrict # Should be implemented. The idea of the method is to restrict
# the set of synced items depending on synchronization settings # the set of synced items depending on synchronization settings
end end
......
...@@ -82,8 +82,13 @@ module EE ...@@ -82,8 +82,13 @@ module EE
super super
end end
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, Ci::JobArtifact] arg to pass to primary_key_in scope
not_expired.merge(selective_sync_scope(node)) # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<Ci::JobArtifact>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
not_expired
.primary_key_in(primary_key_in)
.merge(selective_sync_scope(node))
.merge(object_storage_scope(node)) .merge(object_storage_scope(node))
end end
......
...@@ -9,8 +9,11 @@ module EE ...@@ -9,8 +9,11 @@ module EE
end end
class_methods do class_methods do
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, ContainerRepository] arg to pass to primary_key_in scope
node.container_repositories # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<ContainerRepository>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
node.container_repositories.primary_key_in(primary_key_in)
end end
end end
......
...@@ -17,9 +17,15 @@ module EE ...@@ -17,9 +17,15 @@ module EE
end end
class_methods do class_methods do
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, LfsObject] arg to pass to primary_key_in scope
local_storage_only = !node&.sync_object_storage # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
local_storage_only ? node.lfs_objects.with_files_stored_locally : node.lfs_objects # @return [ActiveRecord::Relation<LfsObject>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
local_storage_only = !node.sync_object_storage
scope = node.lfs_objects.primary_key_in(primary_key_in)
scope = scope.with_files_stored_locally if local_storage_only
scope
end end
end end
......
...@@ -29,8 +29,12 @@ module EE ...@@ -29,8 +29,12 @@ module EE
end end
class_methods do class_methods do
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, MergeRequestDiff] arg to pass to primary_key_in scope
has_external_diffs.merge(selective_sync_scope(node)) # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<MergeRequestDiff>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
has_external_diffs.primary_key_in(primary_key_in)
.merge(selective_sync_scope(node))
.merge(object_storage_scope(node)) .merge(object_storage_scope(node))
end end
......
...@@ -11,9 +11,12 @@ module EE ...@@ -11,9 +11,12 @@ module EE
end end
class_methods do class_methods do
# @return [ActiveRecord::Relation<Packages::PackageFile>] scope of everything that should be synced # @param primary_key_in [Range, Packages::PackageFile] arg to pass to primary_key_in scope
def replicables_for_geo_node # @return [ActiveRecord::Relation<LfsObject>] everything that should be synced to this node, restricted by primary key
selective_sync_scope.merge(object_storage_scope) def replicables_for_geo_node(primary_key_in)
primary_key_in(primary_key_in)
.merge(selective_sync_scope)
.merge(object_storage_scope)
end end
private private
......
...@@ -204,8 +204,11 @@ module EE ...@@ -204,8 +204,11 @@ module EE
class_methods do class_methods do
extend ::Gitlab::Utils::Override extend ::Gitlab::Utils::Override
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, Project] arg to pass to primary_key_in scope
node.projects # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<Project>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
node.projects.primary_key_in(primary_key_in)
end end
def search_by_visibility(level) def search_by_visibility(level)
......
...@@ -11,7 +11,10 @@ module EE ...@@ -11,7 +11,10 @@ module EE
end end
class_methods do class_methods do
def replicables_for_geo_node # @param primary_key_in [Range, SnippetRepository] arg to pass to primary_key_in scope
# @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<SnippetRepository>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
# Not implemented yet. Should be responsible for selective sync # Not implemented yet. Should be responsible for selective sync
all all
end end
......
...@@ -14,8 +14,13 @@ module EE ...@@ -14,8 +14,13 @@ module EE
end end
class_methods do class_methods do
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param primary_key_in [Range, Terraform::StateVersion] arg to pass to primary_key_in scope
selective_sync_scope(node).merge(object_storage_scope(node)) # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
# @return [ActiveRecord::Relation<Terraform::StateVersion>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
primary_key_in(primary_key_in)
.merge(selective_sync_scope(node))
.merge(object_storage_scope(node))
end end
private private
......
...@@ -18,9 +18,13 @@ module EE ...@@ -18,9 +18,13 @@ module EE
end end
class_methods do class_methods do
# @return [ActiveRecord::Relation<Upload>] scope of everything that should be synced to this node # @param primary_key_in [Range, Upload] arg to pass to primary_key_in scope
def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) # @param node [GeoNode] defaults to ::Gitlab::Geo.current_node
selective_sync_scope(node).merge(object_storage_scope(node)) # @return [ActiveRecord::Relation<Upload>] everything that should be synced to this node, restricted by primary key
def replicables_for_geo_node(primary_key_in, node = ::Gitlab::Geo.current_node)
primary_key_in(primary_key_in)
.merge(selective_sync_scope(node))
.merge(object_storage_scope(node))
end end
# Searches for a list of uploads based on the query given in `query`. # Searches for a list of uploads based on the query given in `query`.
......
...@@ -53,8 +53,7 @@ class Geo::BaseRegistry < Geo::TrackingBase ...@@ -53,8 +53,7 @@ class Geo::BaseRegistry < Geo::TrackingBase
model_primary_key = self::MODEL_CLASS.primary_key.to_sym model_primary_key = self::MODEL_CLASS.primary_key.to_sym
source_ids = self::MODEL_CLASS source_ids = self::MODEL_CLASS
.replicables_for_geo_node .replicables_for_geo_node(range)
.primary_key_in(range)
.pluck(self::MODEL_CLASS.arel_table[model_primary_key]) .pluck(self::MODEL_CLASS.arel_table[model_primary_key])
tracked_ids = self.pluck_model_ids_in_range(range) tracked_ids = self.pluck_model_ids_in_range(range)
......
...@@ -34,8 +34,7 @@ class Geo::UploadRegistry < Geo::BaseRegistry ...@@ -34,8 +34,7 @@ class Geo::UploadRegistry < Geo::BaseRegistry
# For example: [[[1, 'avatar'], [5, 'file']], [[3, 'attachment']]] # For example: [[[1, 'avatar'], [5, 'file']], [[3, 'attachment']]]
def self.find_registry_differences(range) def self.find_registry_differences(range)
source = source =
self::MODEL_CLASS.replicables_for_geo_node self::MODEL_CLASS.replicables_for_geo_node(range)
.id_in(range)
.pluck(self::MODEL_CLASS.arel_table[:id], self::MODEL_CLASS.arel_table[:uploader]) .pluck(self::MODEL_CLASS.arel_table[:id], self::MODEL_CLASS.arel_table[:uploader])
.map! { |id, uploader| [id, uploader.sub(/Uploader\z/, '').underscore] } .map! { |id, uploader| [id, uploader.sub(/Uploader\z/, '').underscore] }
......
...@@ -84,7 +84,7 @@ module Gitlab ...@@ -84,7 +84,7 @@ module Gitlab
end end
def in_replicables_for_geo_node? def in_replicables_for_geo_node?
self.class.replicables_for_geo_node.primary_key_in(self).exists? self.class.replicables_for_geo_node(self).exists?
end end
end end
end end
......
...@@ -45,7 +45,7 @@ RSpec.describe Gitlab::Geo::ReplicableModel do ...@@ -45,7 +45,7 @@ RSpec.describe Gitlab::Geo::ReplicableModel do
describe '#in_replicables_for_geo_node?' do describe '#in_replicables_for_geo_node?' do
it 'reuses replicables_for_geo_node' do it 'reuses replicables_for_geo_node' do
expect(DummyModel).to receive(:replicables_for_geo_node).once.and_return(DummyModel.all) expect(DummyModel).to receive(:replicables_for_geo_node).once.with(subject).and_call_original
subject.in_replicables_for_geo_node? subject.in_replicables_for_geo_node?
end end
......
...@@ -162,7 +162,7 @@ RSpec.describe Ci::JobArtifact do ...@@ -162,7 +162,7 @@ RSpec.describe Ci::JobArtifact do
end end
with_them do with_them do
subject(:job_artifact_included) { described_class.replicables_for_geo_node.include?(ci_job_artifact) } subject(:job_artifact_included) { described_class.replicables_for_geo_node(ci_job_artifact).exists? }
let(:project) { create(*project_factory) } let(:project) { create(*project_factory) }
let(:ci_build) { create(:ci_build, project: project) } let(:ci_build) { create(:ci_build, project: project) }
......
...@@ -74,13 +74,13 @@ RSpec.describe MergeRequestDiff do ...@@ -74,13 +74,13 @@ RSpec.describe MergeRequestDiff do
create(:merge_request, source_project: project) create(:merge_request, source_project: project)
expect(described_class.replicables_for_geo_node).to be_empty expect(described_class.replicables_for_geo_node(1..described_class.last.id)).to be_empty
end end
it 'excludes empty diffs' do it 'excludes empty diffs' do
create(:merge_request, source_project: create(:project)) create(:merge_request, source_project: create(:project))
expect(described_class.replicables_for_geo_node).to be_empty expect(described_class.replicables_for_geo_node(1..described_class.last.id)).to be_empty
end end
end end
...@@ -119,7 +119,7 @@ RSpec.describe MergeRequestDiff do ...@@ -119,7 +119,7 @@ RSpec.describe MergeRequestDiff do
end end
it 'returns the proper number of merge request diff states' do it 'returns the proper number of merge request diff states' do
expect(described_class.replicables_for_geo_node).to have_attributes(count: synced_states) expect(described_class.replicables_for_geo_node(1..described_class.last.id)).to have_attributes(count: synced_states)
end end
end end
end end
......
...@@ -60,7 +60,7 @@ RSpec.describe Terraform::StateVersion do ...@@ -60,7 +60,7 @@ RSpec.describe Terraform::StateVersion do
end end
it 'returns the proper number of terraform states' do it 'returns the proper number of terraform states' do
expect(Terraform::StateVersion.replicables_for_geo_node.count).to eq(synced_states) expect(described_class.replicables_for_geo_node(1..described_class.last.id).count).to eq(synced_states)
end end
end end
end end
......
...@@ -37,7 +37,7 @@ RSpec.describe Packages::PackageFile, type: :model do ...@@ -37,7 +37,7 @@ RSpec.describe Packages::PackageFile, type: :model do
end end
describe '.replicables_for_geo_node' do describe '.replicables_for_geo_node' do
subject { described_class.replicables_for_geo_node } subject { described_class.replicables_for_geo_node(1..described_class.last.id) }
it 'returns a package files scope' do it 'returns a package files scope' do
secondary = create(:geo_node) secondary = create(:geo_node)
......
...@@ -37,7 +37,7 @@ RSpec.describe Upload do ...@@ -37,7 +37,7 @@ RSpec.describe Upload do
end end
with_them do with_them do
subject(:upload_included) { described_class.replicables_for_geo_node.include?(upload) } subject(:upload_included) { described_class.replicables_for_geo_node(upload).exists? }
let(:model) { create(*model_factory) } let(:model) { create(*model_factory) }
let(:node) do let(:node) do
......
...@@ -83,8 +83,8 @@ module EE ...@@ -83,8 +83,8 @@ module EE
with_replicator Geo::DummyReplicator with_replicator Geo::DummyReplicator
def self.replicables_for_geo_node def self.replicables_for_geo_node(primary_key_in)
self.all self.primary_key_in(primary_key_in)
end end
end end
......
...@@ -36,7 +36,7 @@ RSpec.shared_examples 'a replicable model' do ...@@ -36,7 +36,7 @@ RSpec.shared_examples 'a replicable model' do
end end
it 'is implemented' do it 'is implemented' do
expect(model_record.class.replicables_for_geo_node).to be_an(ActiveRecord::Relation) expect(model_record.class.replicables_for_geo_node(model_record.id)).to be_an(ActiveRecord::Relation)
end end
end 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