From af84e4be30c4cda47ba7d68592959a7b59e48409 Mon Sep 17 00:00:00 2001
From: Nikola Milojevic <nmilojevic@gitlab.com>
Date: Thu, 6 May 2021 15:37:48 +0000
Subject: [PATCH] Don't update db WAL location if already provided

---
 .../sidekiq_client_middleware.rb              |  6 +++
 .../sidekiq_client_middleware_spec.rb         | 40 +++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/ee/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb b/ee/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
index 77426f46cebdd..a346fd4b63215 100644
--- a/ee/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
+++ b/ee/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
@@ -20,6 +20,8 @@ def mark_data_consistency_location(worker_class, job)
           return unless worker_class.include?(::ApplicationWorker)
           return unless worker_class.get_data_consistency_feature_flag_enabled?
 
+          return if location_already_provided?(job)
+
           job['worker_data_consistency'] = worker_class.get_data_consistency
 
           return if worker_class.get_data_consistency == :always
@@ -31,6 +33,10 @@ def mark_data_consistency_location(worker_class, job)
           end
         end
 
+        def location_already_provided?(job)
+          job['database_replica_location'] || job['database_write_location']
+        end
+
         def load_balancer
           LoadBalancing.proxy.load_balancer
         end
diff --git a/ee/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb b/ee/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
index 7ce86e49fc105..7b71da587fb20 100644
--- a/ee/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
+++ b/ee/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
@@ -82,6 +82,38 @@ def perform(*args)
       end
     end
 
+    shared_examples_for 'database location was already provided' do |provided_database_location, other_location|
+      shared_examples_for 'does not set database location again' do |write_performed|
+        before do
+          allow(Gitlab::Database::LoadBalancing::Session.current).to receive(:performed_write?).and_return(write_performed)
+        end
+
+        it 'does not set database locations again' do
+          middleware.call(worker_class, job, double(:queue), redis_pool) { 10 }
+
+          expect(job[provided_database_location]).to eq(old_location)
+          expect(job[other_location]).to be_nil
+        end
+      end
+
+      let(:old_location) { '0/D525E3A8' }
+      let(:new_location) { 'AB/12345' }
+      let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", provided_database_location => old_location } }
+
+      before do
+        allow(middleware).to receive_message_chain(:load_balancer, :primary_write_location).and_return(new_location)
+        allow(middleware).to receive_message_chain(:load_balancer, :database_replica_location).and_return(new_location)
+      end
+
+      context "when write was performed" do
+        include_examples 'does not set database location again', true
+      end
+
+      context "when write was not performed" do
+        include_examples 'does not set database location again', false
+      end
+    end
+
     let(:queue) { 'default' }
     let(:redis_pool) { Sidekiq.redis_pool }
     let(:worker_class) { 'TestDataConsistencyWorker' }
@@ -104,6 +136,14 @@ def perform(*args)
       include_examples 'does not pass database locations'
     end
 
+    context 'database write location was already provided' do
+      include_examples 'database location was already provided', 'database_write_location', 'database_replica_location'
+    end
+
+    context 'database replica location was already provided' do
+      include_examples 'database location was already provided', 'database_replica_location', 'database_write_location'
+    end
+
     context 'when worker data consistency is :always' do
       include_context 'data consistency worker class', :always, :load_balancing_for_test_data_consistency_worker
 
-- 
GitLab