From cce32b9cf16dc46dc2526ee01b8afa04a283f6d3 Mon Sep 17 00:00:00 2001
From: Madelein van Niekerk <mvanniekerk@gitlab.com>
Date: Fri, 1 Dec 2023 09:36:55 +0000
Subject: [PATCH] Merge branch '431358-fix-reindexing-preflight-check' into
 'master'

Fix cluster reindexing service preflight check

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138211

Merged-by: Madelein van Niekerk <mvanniekerk@gitlab.com>
Approved-by: Siddharth Dungarwal <sdungarwal@gitlab.com>
Approved-by: Madelein van Niekerk <mvanniekerk@gitlab.com>
Co-authored-by: Dmitry Gruzd <dgruzd@gitlab.com>

(cherry picked from commit 532a65fa80d2469dd2f0a719a84de70d72982763)

be61bd22 Fix cluster reindexing preflight check
---
 .../services/elastic/cluster_reindexing_service.rb   |  8 +++++++-
 .../elastic/cluster_reindexing_service_spec.rb       | 12 ++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/ee/app/services/elastic/cluster_reindexing_service.rb b/ee/app/services/elastic/cluster_reindexing_service.rb
index 07a9905eb0180..8de3a8c6273a5 100644
--- a/ee/app/services/elastic/cluster_reindexing_service.rb
+++ b/ee/app/services/elastic/cluster_reindexing_service.rb
@@ -61,7 +61,13 @@ def initial!
         return false
       end
 
-      expected_free_size = alias_names.sum { |name| elastic_helper.index_size_bytes(index_name: name) } * 2
+      target_classes = current_task.target_classes
+      current_size = target_classes.sum do |klass|
+        name = elastic_helper.klass_to_alias_name(klass: klass)
+        elastic_helper.index_size_bytes(index_name: name)
+      end
+
+      expected_free_size = current_size * 2
       if elastic_helper.cluster_free_size_bytes < expected_free_size
         abort_reindexing!("You should have at least #{expected_free_size} bytes of storage available to perform reindexing. Please increase the storage in your Elasticsearch cluster before reindexing.")
         return false
diff --git a/ee/spec/services/elastic/cluster_reindexing_service_spec.rb b/ee/spec/services/elastic/cluster_reindexing_service_spec.rb
index 7827648a7cecc..8676f23e3523c 100644
--- a/ee/spec/services/elastic/cluster_reindexing_service_spec.rb
+++ b/ee/spec/services/elastic/cluster_reindexing_service_spec.rb
@@ -43,6 +43,18 @@
 
       expect(Gitlab::CurrentSettings.elasticsearch_pause_indexing).to eq(true)
     end
+
+    context 'when partial reindexing' do
+      let(:task) { create(:elastic_reindexing_task, state: :initial, targets: %w[Project User]) }
+
+      it 'errors when there is not enough space' do
+        allow(helper).to receive(:index_size_bytes).twice.and_return(10.megabytes)
+        allow(helper).to receive(:cluster_free_size_bytes).and_return(30.megabytes)
+
+        expect { cluster_reindexing_service.execute }.to change { task.reload.state }.from('initial').to('failure')
+        expect(task.reload.error_message).to match(/storage available/)
+      end
+    end
   end
 
   context 'state: indexing_paused' do
-- 
GitLab