Skip to content

Add UniquenessHelpers as database helper

What does this MR do and why?

This new helper allows us to ensure uniqueness ids across several partitions by preventing users from updating the id of a given resource.

How to use it?

# frozen_string_literal: true

class EnsureUniquessForCiRunnerManagerBuild < Gitlab::Database::Migration[2.2]
  include Gitlab::Database::PartitioningMigrationHelpers::UniquenessHelpers

  milestone '16.7'
  TABLE_NAME = :p_ci_runner_machine_builds
  TRIGGER_NAME = "assign_#{TABLE_NAME}_id_trigger"

  def up
    ensure_unique_id(TABLE_NAME, TRIGGER_NAME)
  end

  def down
    drop_trigger(TABLE_NAME, TRIGGER_NAME, if_exists: true)
    drop_function("assign_#{TABLE_NAME}_id_value", if_exists: true)
  end
end
$ rails db:migrate:ci
ci: == [advisory_lock_connection] object_id: 182040, pg_backend_pid: 57095
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: migrating ============
ci: -- current_schema(nil)
ci:    -> 0.0011s
ci: -- change_column_default(:p_ci_runner_machine_builds, :build_id, nil)
ci:    -> 0.0025s
ci: -- execute("CREATE OR REPLACE FUNCTION assign_p_ci_runner_machine_builds_id_value()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF NEW.\"id\" IS NOT NULL THEN\n  RAISE WARNING 'Manually assigning ids is not allowed, the value will be ignored';\nEND IF;\nNEW.\"id\" := nextval('ci_runner_machine_builds_id_seq'::regclass);\nRETURN NEW;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
ci:    -> 0.0012s
ci: -- execute("CREATE TRIGGER assign_p_ci_runner_machine_builds_id_trigger\nBEFORE INSERT ON p_ci_runner_machine_builds\nFOR EACH ROW\n\nEXECUTE FUNCTION assign_p_ci_runner_machine_builds_id_value()\n")
ci:    -> 0.0006s
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: migrated (0.1095s) ===
ci: == [advisory_lock_connection] object_id: 182040, pg_backend_pid: 57095

$ rails db:rollback:ci
ci: == [advisory_lock_connection] object_id: 182740, pg_backend_pid: 57423
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: reverting ============
ci: -- execute("DROP TRIGGER IF EXISTS assign_p_ci_runner_machine_builds_id_trigger ON p_ci_runner_machine_builds")
ci:    -> 0.0015s
ci: -- execute("DROP FUNCTION IF EXISTS assign_p_ci_runner_machine_builds_id_value()")
ci:    -> 0.0008s
ci: == 20231206100435 EnsureUniquessForCiRunnerMachineBuild: reverted (0.0142s) ===
ci: == [advisory_lock_connection] object_id: 182740, pg_backend_pid: 57423

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Max Orefice

Merge request reports