From 6cedc2aa41650472d839f947906bd97979e252bc Mon Sep 17 00:00:00 2001 From: Aakriti Gupta Date: Wed, 22 Oct 2025 11:21:34 +0200 Subject: [PATCH] Publish event according to project repo replication version --- .../geo/project_repository_replicator.rb | 13 +++++++++ .../geo_project_repository_replication_v2.yml | 8 +++++ ee/lib/gitlab/geo.rb | 4 +++ ee/lib/gitlab/geo/replicator.rb | 2 ++ .../geo/project_repository_replicator_spec.rb | 29 +++++++++++++++++-- ...lob_replicator_strategy_shared_examples.rb | 5 ++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 ee/config/feature_flags/ops/geo_project_repository_replication_v2.yml diff --git a/ee/app/replicators/geo/project_repository_replicator.rb b/ee/app/replicators/geo/project_repository_replicator.rb index 632b0a0c7a759d..cc601b64a5c075 100644 --- a/ee/app/replicators/geo/project_repository_replicator.rb +++ b/ee/app/replicators/geo/project_repository_replicator.rb @@ -28,6 +28,19 @@ def repository model_record.repository end + override :should_publish_replication_event? + def should_publish_replication_event? + return false unless super + + if ::Gitlab::Geo.geo_project_repository_replication_v2_enabled? + # V2: Only create events for ProjectRepository objects, not Projects + model_record.is_a?(::ProjectRepository) + else + # V1: Only create events for Project objects, not ProjectRepositories + model_record.is_a?(::Project) + end + end + private def pool_repository diff --git a/ee/config/feature_flags/ops/geo_project_repository_replication_v2.yml b/ee/config/feature_flags/ops/geo_project_repository_replication_v2.yml new file mode 100644 index 00000000000000..ff75ab3b40e38d --- /dev/null +++ b/ee/config/feature_flags/ops/geo_project_repository_replication_v2.yml @@ -0,0 +1,8 @@ +--- +name: geo_project_repository_replication_v2 +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/194051 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/549772 +milestone: '18.6' +type: ops +group: group::geo +default_enabled: false diff --git a/ee/lib/gitlab/geo.rb b/ee/lib/gitlab/geo.rb index 4fbab4c1ad4a98..39849af9624955 100644 --- a/ee/lib/gitlab/geo.rb +++ b/ee/lib/gitlab/geo.rb @@ -364,5 +364,9 @@ def self.org_mover_extend_selective_sync_to_primary_checksumming? def self.geo_selective_sync_by_organizations_enabled? ::Feature.enabled?(:geo_selective_sync_by_organizations, :instance) end + + def self.geo_project_repository_replication_v2_enabled? + ::Feature.enabled?(:geo_project_repository_replication_v2, :instance) + end end end diff --git a/ee/lib/gitlab/geo/replicator.rb b/ee/lib/gitlab/geo/replicator.rb index 29a584c889ac7d..1a83864f4194eb 100644 --- a/ee/lib/gitlab/geo/replicator.rb +++ b/ee/lib/gitlab/geo/replicator.rb @@ -353,6 +353,8 @@ def resource_exists? protected + # This method can be overriden in a replicator class to add other + # conditionals for accepting events def should_publish_replication_event? self.class.replication_enabled? end diff --git a/ee/spec/replicators/geo/project_repository_replicator_spec.rb b/ee/spec/replicators/geo/project_repository_replicator_spec.rb index d543a83aff5d80..564aa35fa1fb5e 100644 --- a/ee/spec/replicators/geo/project_repository_replicator_spec.rb +++ b/ee/spec/replicators/geo/project_repository_replicator_spec.rb @@ -3,9 +3,27 @@ require 'spec_helper' RSpec.describe Geo::ProjectRepositoryReplicator, feature_category: :geo_replication do - let(:model_record) { create(:project, :repository) } + include EE::GeoHelpers + + let(:secondary) { create(:geo_node) } + let(:primary) { create(:geo_node, :primary) } + + before do + stub_current_geo_node(secondary) + end + + context 'with legacy project repository replication (V1)' do + let(:model_record) { create(:project_with_repo) } + let(:project) { model_record } + + subject(:replicator) { model_record.replicator } + + before do + stub_feature_flags(geo_project_repository_replication_v2: false) + end + + it_behaves_like 'a repository replicator' - include_examples 'a repository replicator' do describe 'housekeeping implementation' do let_it_be(:pool_repository) { create(:pool_repository) } let_it_be(:model_record) { create(:project, pool_repository: pool_repository) } @@ -21,8 +39,15 @@ expect(service).to receive(:execute) end + replicator = described_class.new(model_record_id: model_record.id) replicator.before_housekeeping end end + + include_examples 'a verifiable replicator' do + before do + stub_current_geo_node(primary) + end + end end end diff --git a/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb b/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb index 93b51b47c00381..96a242f6687e4f 100644 --- a/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb +++ b/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb @@ -18,6 +18,11 @@ subject(:replicator) { model_record.replicator } before do + # These tests create projects and expect the Geo::Event counts to change + # including project creation related events. + # Disabling this flag will allow legacy project repository replication to + # work, as these tests expect. + stub_feature_flags(geo_project_repository_replication_v2: false) stub_current_geo_node(primary) end -- GitLab