Skip to content

Remove temporary container_repositories indexes

What does this MR do and why?

This MR removes temporary indexes that were created during container registry migration.

We have verified in db-main-replica-gprd that the indexes are no longer in use.

sql
gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'tmp_index_container_repos_on_non_migrated';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'tmp_index_container_repositories_on_id_migration_state';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'tmp_index_migrated_container_registries';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'idx_container_repos_on_import_started_at_when_importing';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'idx_container_repos_on_migration_state_migration_plan_created';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'idx_container_repos_on_pre_import_done_at_when_pre_import_done';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'idx_container_repos_on_pre_import_started_at_when_pre_importing';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'index_container_repositories_on_greatest_completed_at';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

gitlabhq_production=> SELECT idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_all_indexes WHERE indexrelname = 'index_container_repositories_on_migration_state_import_done_at';
 idx_scan | idx_tup_read | idx_tup_fetch 
----------+--------------+---------------
        0 |            0 |             0
(1 row)

Screenshots or screen recordings

None.

Database Migration

up
main: == [advisory_lock_connection] object_id: 228740, pg_backend_pid: 69848
main: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: migrating ========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0884s
main: -- indexes(:container_repositories)
main:    -> 0.0032s
main: -- current_schema()
main:    -> 0.0002s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- indexes(:container_repositories)
main:    -> 0.0021s
main: -- current_schema()
main:    -> 0.0002s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- indexes(:container_repositories)
main:    -> 0.0023s
main: -- current_schema()
main:    -> 0.0002s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0005s
main: -- indexes(:container_repositories)
main:    -> 0.0026s
main: -- current_schema()
main:    -> 0.0001s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- indexes(:container_repositories)
main:    -> 0.0022s
main: -- current_schema()
main:    -> 0.0003s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- indexes(:container_repositories)
main:    -> 0.0023s
main: -- current_schema()
main:    -> 0.0002s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0005s
main: -- indexes(:container_repositories)
main:    -> 0.0026s
main: -- current_schema()
main:    -> 0.0001s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0005s
main: -- indexes(:container_repositories)
main:    -> 0.0025s
main: -- current_schema()
main:    -> 0.0002s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- indexes(:container_repositories)
main:    -> 0.0027s
main: -- current_schema()
main:    -> 0.0002s
main: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: migrated (0.1487s) 

main: == [advisory_lock_connection] object_id: 228740, pg_backend_pid: 69848
ci: == [advisory_lock_connection] object_id: 229100, pg_backend_pid: 69852
ci: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: migrating ========
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0007s
ci: -- indexes(:container_repositories)
ci:    -> 0.0039s
ci: -- current_schema()
ci:    -> 0.0003s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0006s
ci: -- indexes(:container_repositories)
ci:    -> 0.0029s
ci: -- current_schema()
ci:    -> 0.0001s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- indexes(:container_repositories)
ci:    -> 0.0025s
ci: -- current_schema()
ci:    -> 0.0002s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0006s
ci: -- indexes(:container_repositories)
ci:    -> 0.0023s
ci: -- current_schema()
ci:    -> 0.0003s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- indexes(:container_repositories)
ci:    -> 0.0029s
ci: -- current_schema()
ci:    -> 0.0003s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0005s
ci: -- indexes(:container_repositories)
ci:    -> 0.0023s
ci: -- current_schema()
ci:    -> 0.0002s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- indexes(:container_repositories)
ci:    -> 0.0025s
ci: -- current_schema()
ci:    -> 0.0002s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- indexes(:container_repositories)
ci:    -> 0.0028s
ci: -- current_schema()
ci:    -> 0.0002s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- indexes(:container_repositories)
ci:    -> 0.0027s
ci: -- current_schema()
ci:    -> 0.0002s
ci: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: migrated (0.0694s) 

ci: == [advisory_lock_connection] object_id: 229100, pg_backend_pid: 69852
down
main: == [advisory_lock_connection] object_id: 228500, pg_backend_pid: 3077
main: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: reverting ========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0663s
main: -- index_exists?(:container_repositories, [:project_id, :id], {:name=>"tmp_index_container_repos_on_non_migrated", :where=>"migration_state != 'import_done'", :algorithm=>:concurrently})
main:    -> 0.0036s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0004s
main: -- add_index(:container_repositories, [:project_id, :id], {:name=>"tmp_index_container_repos_on_non_migrated", :where=>"migration_state != 'import_done'", :algorithm=>:concurrently})
main:    -> 0.0016s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- index_exists?(:container_repositories, [:id, :migration_state], {:name=>"tmp_index_container_repositories_on_id_migration_state", :algorithm=>:concurrently})
main:    -> 0.0024s
main: -- add_index(:container_repositories, [:id, :migration_state], {:name=>"tmp_index_container_repositories_on_id_migration_state", :algorithm=>:concurrently})
main:    -> 0.0012s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- index_exists?(:container_repositories, [:project_id], {:name=>"tmp_index_migrated_container_registries", :where=>"migration_state = 'import_done' OR created_at >= '2022-01-23'", :algorithm=>:concurrently})
main:    -> 0.0026s
main: -- add_index(:container_repositories, [:project_id], {:name=>"tmp_index_migrated_container_registries", :where=>"migration_state = 'import_done' OR created_at >= '2022-01-23'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- index_exists?(:container_repositories, [:migration_import_started_at], {:name=>"idx_container_repos_on_import_started_at_when_importing", :where=>"migration_state = 'importing'::text", :algorithm=>:concurrently})
main:    -> 0.0025s
main: -- add_index(:container_repositories, [:migration_import_started_at], {:name=>"idx_container_repos_on_import_started_at_when_importing", :where=>"migration_state = 'importing'::text", :algorithm=>:concurrently})
main:    -> 0.0009s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- index_exists?(:container_repositories, [:migration_state, :migration_plan, :created_at], {:name=>"idx_container_repos_on_migration_state_migration_plan_created", :algorithm=>:concurrently})
main:    -> 0.0030s
main: -- add_index(:container_repositories, [:migration_state, :migration_plan, :created_at], {:name=>"idx_container_repos_on_migration_state_migration_plan_created", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- index_exists?(:container_repositories, [:migration_pre_import_done_at], {:name=>"idx_container_repos_on_pre_import_done_at_when_pre_import_done", :where=>"migration_state = 'pre_import_done'::text", :algorithm=>:concurrently})
main:    -> 0.0029s
main: -- add_index(:container_repositories, [:migration_pre_import_done_at], {:name=>"idx_container_repos_on_pre_import_done_at_when_pre_import_done", :where=>"migration_state = 'pre_import_done'::text", :algorithm=>:concurrently})
main:    -> 0.0012s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- index_exists?(:container_repositories, [:migration_pre_import_started_at], {:name=>"idx_container_repos_on_pre_import_started_at_when_pre_importing", :where=>"migration_state = 'pre_importing'::text", :algorithm=>:concurrently})
main:    -> 0.0034s
main: -- add_index(:container_repositories, [:migration_pre_import_started_at], {:name=>"idx_container_repos_on_pre_import_started_at_when_pre_importing", :where=>"migration_state = 'pre_importing'::text", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- execute("        CREATE INDEX CONCURRENTLY index_container_repositories_on_greatest_completed_at ON container_repositories\n        USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at))\n        WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text]));\n")
main:    -> 0.0009s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0004s
main: -- index_exists?(:container_repositories, [:migration_state, :migration_import_done_at], {:name=>"index_container_repositories_on_migration_state_import_done_at", :algorithm=>:concurrently})
main:    -> 0.0037s
main: -- add_index(:container_repositories, [:migration_state, :migration_import_done_at], {:name=>"index_container_repositories_on_migration_state_import_done_at", :algorithm=>:concurrently})
main:    -> 0.0009s
main: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: reverted (0.1399s) 

main: == [advisory_lock_connection] object_id: 228500, pg_backend_pid: 3077
ci: == [advisory_lock_connection] object_id: 228420, pg_backend_pid: 3703
ci: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: reverting ========
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0717s
ci: -- index_exists?(:container_repositories, [:project_id, :id], {:name=>"tmp_index_container_repos_on_non_migrated", :where=>"migration_state != 'import_done'", :algorithm=>:concurrently})
ci:    -> 0.0048s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0003s
ci: -- add_index(:container_repositories, [:project_id, :id], {:name=>"tmp_index_container_repos_on_non_migrated", :where=>"migration_state != 'import_done'", :algorithm=>:concurrently})
ci:    -> 0.0021s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0004s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0007s
ci: -- index_exists?(:container_repositories, [:id, :migration_state], {:name=>"tmp_index_container_repositories_on_id_migration_state", :algorithm=>:concurrently})
ci:    -> 0.0040s
ci: -- add_index(:container_repositories, [:id, :migration_state], {:name=>"tmp_index_container_repositories_on_id_migration_state", :algorithm=>:concurrently})
ci:    -> 0.0013s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- index_exists?(:container_repositories, [:project_id], {:name=>"tmp_index_migrated_container_registries", :where=>"migration_state = 'import_done' OR created_at >= '2022-01-23'", :algorithm=>:concurrently})
ci:    -> 0.0043s
ci: -- add_index(:container_repositories, [:project_id], {:name=>"tmp_index_migrated_container_registries", :where=>"migration_state = 'import_done' OR created_at >= '2022-01-23'", :algorithm=>:concurrently})
ci:    -> 0.0011s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0008s
ci: -- index_exists?(:container_repositories, [:migration_import_started_at], {:name=>"idx_container_repos_on_import_started_at_when_importing", :where=>"migration_state = 'importing'::text", :algorithm=>:concurrently})
ci:    -> 0.0049s
ci: -- add_index(:container_repositories, [:migration_import_started_at], {:name=>"idx_container_repos_on_import_started_at_when_importing", :where=>"migration_state = 'importing'::text", :algorithm=>:concurrently})
ci:    -> 0.0011s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0006s
ci: -- index_exists?(:container_repositories, [:migration_state, :migration_plan, :created_at], {:name=>"idx_container_repos_on_migration_state_migration_plan_created", :algorithm=>:concurrently})
ci:    -> 0.0047s
ci: -- add_index(:container_repositories, [:migration_state, :migration_plan, :created_at], {:name=>"idx_container_repos_on_migration_state_migration_plan_created", :algorithm=>:concurrently})
ci:    -> 0.0015s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0006s
ci: -- index_exists?(:container_repositories, [:migration_pre_import_done_at], {:name=>"idx_container_repos_on_pre_import_done_at_when_pre_import_done", :where=>"migration_state = 'pre_import_done'::text", :algorithm=>:concurrently})
ci:    -> 0.0061s
ci: -- add_index(:container_repositories, [:migration_pre_import_done_at], {:name=>"idx_container_repos_on_pre_import_done_at_when_pre_import_done", :where=>"migration_state = 'pre_import_done'::text", :algorithm=>:concurrently})
ci:    -> 0.0015s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0004s
ci: -- index_exists?(:container_repositories, [:migration_pre_import_started_at], {:name=>"idx_container_repos_on_pre_import_started_at_when_pre_importing", :where=>"migration_state = 'pre_importing'::text", :algorithm=>:concurrently})
ci:    -> 0.0059s
ci: -- add_index(:container_repositories, [:migration_pre_import_started_at], {:name=>"idx_container_repos_on_pre_import_started_at_when_pre_importing", :where=>"migration_state = 'pre_importing'::text", :algorithm=>:concurrently})
ci:    -> 0.0017s
ci: -- execute("        CREATE INDEX CONCURRENTLY index_container_repositories_on_greatest_completed_at ON container_repositories\n        USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at))\n        WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text]));\n")
ci:    -> 0.0015s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci:    -> 0.0011s
ci: -- index_exists?(:container_repositories, [:migration_state, :migration_import_done_at], {:name=>"index_container_repositories_on_migration_state_import_done_at", :algorithm=>:concurrently})
ci:    -> 0.0068s
ci: -- add_index(:container_repositories, [:migration_state, :migration_import_done_at], {:name=>"index_container_repositories_on_migration_state_import_done_at", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: == 20230615144627 RemoveTemporaryContainerRepositoryIndexes: reverted (0.1891s) 

ci: == [advisory_lock_connection] object_id: 228420, pg_backend_pid: 3703

How to set up and validate locally

  1. Run gdk psql
  2. Run \d container_repositories in the psql console.
  3. Note the Indexes: list in the output. This is immediately below the column list.

Output on the MR branch, after running rails db:migrate:

output
Table "public.container_repositories"
              Column              |            Type             | Collation | Nullable |                      Default                       
----------------------------------+-----------------------------+-----------+----------+----------------------------------------------------
 id                               | integer                     |           | not null | nextval('container_repositories_id_seq'::regclass)
 project_id                       | integer                     |           | not null | 
 name                             | character varying           |           | not null | 
 created_at                       | timestamp without time zone |           | not null | 
 updated_at                       | timestamp without time zone |           | not null | 
 status                           | smallint                    |           |          | 
 expiration_policy_started_at     | timestamp with time zone    |           |          | 
 expiration_policy_cleanup_status | smallint                    |           | not null | 0
 expiration_policy_completed_at   | timestamp with time zone    |           |          | 
 migration_pre_import_started_at  | timestamp with time zone    |           |          | 
 migration_pre_import_done_at     | timestamp with time zone    |           |          | 
 migration_import_started_at      | timestamp with time zone    |           |          | 
 migration_import_done_at         | timestamp with time zone    |           |          | 
 migration_aborted_at             | timestamp with time zone    |           |          | 
 migration_skipped_at             | timestamp with time zone    |           |          | 
 migration_retries_count          | integer                     |           | not null | 0
 migration_skipped_reason         | smallint                    |           |          | 
 migration_state                  | text                        |           | not null | 'default'::text
 migration_aborted_in_state       | text                        |           |          | 
 migration_plan                   | text                        |           |          | 
 last_cleanup_deleted_tags_count  | integer                     |           |          | 
 delete_started_at                | timestamp with time zone    |           |          | 
 status_updated_at                | timestamp with time zone    |           |          | 
Indexes:
    "container_repositories_pkey" PRIMARY KEY, btree (id)
    "idx_container_repos_on_exp_cleanup_status_project_id_start_date" btree (expiration_policy_cleanup_status, project_id, expiration_policy_started_at)
    "index_container_repositories_on_project_id_and_id" btree (project_id, id)
    "index_container_repositories_on_project_id_and_name" UNIQUE, btree (project_id, name)
    "index_container_repositories_on_status_and_id" btree (status, id) WHERE status IS NOT NULL
    "index_container_repository_on_name_trigram" gin (name gin_trgm_ops)
Check constraints:
    "check_05e9012f36" CHECK (char_length(migration_plan) <= 255)
    "check_13c58fe73a" CHECK (char_length(migration_state) <= 255)
    "check_97f0249439" CHECK (char_length(migration_aborted_in_state) <= 255)
Foreign-key constraints:
    "fk_rails_32f7bf5aad" FOREIGN KEY (project_id) REFERENCES projects(id)
Referenced by:
    TABLE "container_repository_states" CONSTRAINT "fk_rails_63436c99ce" FOREIGN KEY (container_repository_id) REFERENCES container_repositories(id) ON DELETE CASCADE

Output on master branch:

NOTE: indexes will also be gone if you run db:migrate on the MR branch and then switch to the master branch

output
Table "public.container_repositories"
              Column              |            Type             | Collation | Nullable |                      Default                       
----------------------------------+-----------------------------+-----------+----------+----------------------------------------------------
 id                               | integer                     |           | not null | nextval('container_repositories_id_seq'::regclass)
 project_id                       | integer                     |           | not null | 
 name                             | character varying           |           | not null | 
 created_at                       | timestamp without time zone |           | not null | 
 updated_at                       | timestamp without time zone |           | not null | 
 status                           | smallint                    |           |          | 
 expiration_policy_started_at     | timestamp with time zone    |           |          | 
 expiration_policy_cleanup_status | smallint                    |           | not null | 0
 expiration_policy_completed_at   | timestamp with time zone    |           |          | 
 migration_pre_import_started_at  | timestamp with time zone    |           |          | 
 migration_pre_import_done_at     | timestamp with time zone    |           |          | 
 migration_import_started_at      | timestamp with time zone    |           |          | 
 migration_import_done_at         | timestamp with time zone    |           |          | 
 migration_aborted_at             | timestamp with time zone    |           |          | 
 migration_skipped_at             | timestamp with time zone    |           |          | 
 migration_retries_count          | integer                     |           | not null | 0
 migration_skipped_reason         | smallint                    |           |          | 
 migration_state                  | text                        |           | not null | 'default'::text
 migration_aborted_in_state       | text                        |           |          | 
 migration_plan                   | text                        |           |          | 
 last_cleanup_deleted_tags_count  | integer                     |           |          | 
 delete_started_at                | timestamp with time zone    |           |          | 
 status_updated_at                | timestamp with time zone    |           |          | 
Indexes:
    "container_repositories_pkey" PRIMARY KEY, btree (id)
    "index_container_repositories_on_project_id_and_name" UNIQUE, btree (project_id, name)
    "idx_container_repos_on_exp_cleanup_status_project_id_start_date" btree (expiration_policy_cleanup_status, project_id, expiration_policy_started_at)
    "idx_container_repos_on_import_started_at_when_importing" btree (migration_import_started_at) WHERE migration_state = 'importing'::text
    "idx_container_repos_on_migration_state_migration_plan_created" btree (migration_state, migration_plan, created_at)
    "idx_container_repos_on_pre_import_done_at_when_pre_import_done" btree (migration_pre_import_done_at) WHERE migration_state = 'pre_import_done'::text
    "idx_container_repos_on_pre_import_started_at_when_pre_importing" btree (migration_pre_import_started_at) WHERE migration_state = 'pre_importing'::text
    "index_container_repositories_on_greatest_completed_at" btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at)) WHERE migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text])
    "index_container_repositories_on_migration_state_import_done_at" btree (migration_state, migration_import_done_at)
    "index_container_repositories_on_project_id_and_id" btree (project_id, id)
    "index_container_repositories_on_status_and_id" btree (status, id) WHERE status IS NOT NULL
    "index_container_repository_on_name_trigram" gin (name gin_trgm_ops)
    "tmp_index_container_repos_on_non_migrated" btree (project_id, id) WHERE migration_state <> 'import_done'::text
    "tmp_index_container_repositories_on_id_migration_state" btree (id, migration_state)
    "tmp_index_migrated_container_registries" btree (project_id) WHERE migration_state = 'import_done'::text OR created_at >= '2022-01-23 00:00:00'::timestamp without time zone
Check constraints:
    "check_05e9012f36" CHECK (char_length(migration_plan) <= 255)
    "check_13c58fe73a" CHECK (char_length(migration_state) <= 255)
    "check_97f0249439" CHECK (char_length(migration_aborted_in_state) <= 255)
Foreign-key constraints:
    "fk_rails_32f7bf5aad" FOREIGN KEY (project_id) REFERENCES projects(id)
Referenced by:
    TABLE "container_repository_states" CONSTRAINT "fk_rails_63436c99ce" FOREIGN KEY (container_repository_id) REFERENCES container_repositories(id) ON DELETE CASCADE

MR acceptance checklist

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

Related to #351783 (closed)

Edited by Radamanthus Batnag

Merge request reports