summaryrefslogtreecommitdiff
path: root/db/post_migrate/20230329091300_swap_ci_runner_machine_builds_primary_key_v2.rb
blob: ad40ed118b138df8ad9f9f8e44c0291806fca99a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# frozen_string_literal: true

class SwapCiRunnerMachineBuildsPrimaryKeyV2 < Gitlab::Database::Migration[2.1]
  include Gitlab::Database::PartitioningMigrationHelpers

  disable_ddl_transaction!

  TABLE_NAME = :p_ci_runner_machine_builds
  BUILDS_TABLE = :ci_builds

  def up
    reorder_primary_key_columns([:build_id, :partition_id])
  end

  def down
    reorder_primary_key_columns([:partition_id, :build_id])
  end

  private

  def reorder_primary_key_columns(columns)
    with_lock_retries(raise_on_exhaustion: true) do
      connection.execute(<<~SQL)
        LOCK TABLE #{BUILDS_TABLE}, #{TABLE_NAME} IN ACCESS EXCLUSIVE MODE;
      SQL

      partitions = Gitlab::Database::PostgresPartitionedTable.each_partition(TABLE_NAME).to_a
      partitions.each { |partition| drop_table partition.identifier }

      execute <<~SQL
        ALTER TABLE #{TABLE_NAME}
          DROP CONSTRAINT p_ci_runner_machine_builds_pkey CASCADE;

        ALTER TABLE #{TABLE_NAME}
          ADD PRIMARY KEY (#{columns.join(', ')});
      SQL

      partitions.each do |partition|
        connection.execute(<<~SQL)
          CREATE TABLE IF NOT EXISTS #{partition.identifier}
            PARTITION OF #{partition.parent_identifier} #{partition.condition};
        SQL
      end
    end
  end
end