From 30c35b2528fb4d12cc6ec0a615776ad401e91d22 Mon Sep 17 00:00:00 2001
From: Maxime Orefice <morefice@gitlab.com>
Date: Mon, 4 Dec 2023 10:12:08 +0100
Subject: [PATCH] Add unique indexes to ci_job_artifacts

This commit adds 2 new indexes to prepare ci_job_artifacts
to be partitioned.

Changelog: added
---
 ...e_index_id_partition_id_to_ci_job_artifact.rb | 16 ++++++++++++++++
 ...filte_type_partition_id_to_ci_job_artifact.rb | 16 ++++++++++++++++
 db/schema_migrations/20231204090310              |  1 +
 db/schema_migrations/20231204090413              |  1 +
 db/structure.sql                                 |  4 ++++
 5 files changed, 38 insertions(+)
 create mode 100644 db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb
 create mode 100644 db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb
 create mode 100644 db/schema_migrations/20231204090310
 create mode 100644 db/schema_migrations/20231204090413

diff --git a/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb b/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb
new file mode 100644
index 0000000000000..9d6aef6987757
--- /dev/null
+++ b/db/post_migrate/20231204090310_add_unique_index_id_partition_id_to_ci_job_artifact.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexIdPartitionIdToCiJobArtifact < Gitlab::Database::Migration[2.2]
+  milestone '16.7'
+  disable_ddl_transaction!
+  TABLE_NAME = :ci_job_artifacts
+  INDEX_NAME = :index_ci_job_artifacts_on_id_partition_id_unique
+
+  def up
+    add_concurrent_index(TABLE_NAME, %i[id partition_id], unique: true, name: INDEX_NAME)
+  end
+
+  def down
+    remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+  end
+end
diff --git a/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb b/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb
new file mode 100644
index 0000000000000..ad02456b1b9de
--- /dev/null
+++ b/db/post_migrate/20231204090413_add_unique_index_job_id_filte_type_partition_id_to_ci_job_artifact.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexJobIdFilteTypePartitionIdToCiJobArtifact < Gitlab::Database::Migration[2.2]
+  milestone '16.7'
+  disable_ddl_transaction!
+  TABLE_NAME = :ci_job_artifacts
+  INDEX_NAME = :idx_ci_job_artifacts_on_job_id_file_type_and_partition_id_uniq
+
+  def up
+    add_concurrent_index(TABLE_NAME, %i[job_id file_type partition_id], unique: true, name: INDEX_NAME)
+  end
+
+  def down
+    remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+  end
+end
diff --git a/db/schema_migrations/20231204090310 b/db/schema_migrations/20231204090310
new file mode 100644
index 0000000000000..665a35d90e12d
--- /dev/null
+++ b/db/schema_migrations/20231204090310
@@ -0,0 +1 @@
+eae9f28293f6d4de373d6f78c8c1995369ceb91cc922aa63b590c37a289523a1
\ No newline at end of file
diff --git a/db/schema_migrations/20231204090413 b/db/schema_migrations/20231204090413
new file mode 100644
index 0000000000000..6f9dd659329d0
--- /dev/null
+++ b/db/schema_migrations/20231204090413
@@ -0,0 +1 @@
+97d2e9828fd963ca329ba63970ee3c52e733555aa2a42bf444a0bc9243b1b7a1
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 270c6508743cc..8954f7213918e 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -31408,6 +31408,8 @@ CREATE INDEX idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id ON a
 
 CREATE INDEX idx_build_artifacts_size_refreshes_state_updated_at ON project_build_artifacts_size_refreshes USING btree (state, updated_at);
 
+CREATE UNIQUE INDEX idx_ci_job_artifacts_on_job_id_file_type_and_partition_id_uniq ON ci_job_artifacts USING btree (job_id, file_type, partition_id);
+
 CREATE INDEX idx_ci_pipelines_artifacts_locked ON ci_pipelines USING btree (ci_ref_id, id) WHERE (locked = 1);
 
 CREATE INDEX idx_compliance_security_policies_on_policy_configuration_id ON compliance_framework_security_policies USING btree (policy_configuration_id);
@@ -32118,6 +32120,8 @@ CREATE INDEX index_ci_job_artifacts_on_file_store ON ci_job_artifacts USING btre
 
 CREATE INDEX index_ci_job_artifacts_on_file_type_for_devops_adoption ON ci_job_artifacts USING btree (file_type, project_id, created_at) WHERE (file_type = ANY (ARRAY[5, 6, 8, 23]));
 
+CREATE UNIQUE INDEX index_ci_job_artifacts_on_id_partition_id_unique ON ci_job_artifacts USING btree (id, partition_id);
+
 CREATE INDEX index_ci_job_artifacts_on_id_project_id_and_created_at ON ci_job_artifacts USING btree (project_id, created_at, id);
 
 CREATE INDEX index_ci_job_artifacts_on_id_project_id_and_file_type ON ci_job_artifacts USING btree (project_id, file_type, id);
-- 
GitLab