Migrations for adding issue_id to versions table (CE)
What does this MR do?
These migrations do the following:
1. Adds a new issue_id
column to versions
This fixes an n+1 problem when loading versions for an issue in GraphQL as AR can now load from cache.
2. Changes the unique index on versions.sha
to include issue_id
This allows us to export and import Version
data as part of the project importer/exporter (https://gitlab.com/gitlab-org/gitlab-ee/issues/11090). In order to import version data, we need to allow duplicate sha
values for Version
s.
Note, this new scope could have used project_id
instead of issue_id
, however there is a need to migrate issue_id
to the table (see 1.) and not a need to migrate project_id
. It may also be handy in future if we ever want to add the ability to copy design data from one issue to another within the same project.
3. Updates all Version
s with an issue_id
This backfills the data for older records. As mentioned in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/30765#note_192089192 there is very little (or no) existing data.
Migration output
➜ gitlab git:(11090-export-design-management-1-issue-migration) be rake db:migrate
== 20190715042813 AddIssueIdToVersions: migrating =============================
-- add_reference(:design_management_versions, :issue, {:index=>true, :foreign_key=>{:on_delete=>:cascade}})
-> 0.0326s
== 20190715042813 AddIssueIdToVersions: migrated (0.0326s) ====================
== 20190715043944 RemoveShaIndexFromVersions: migrating =======================
-- transaction_open?()
-> 0.0000s
-- select_one("SELECT current_setting('server_version_num') AS v")
-> 0.0007s
-- index_exists?(:design_management_versions, :sha, {:algorithm=>:concurrently})
-> 0.0022s
-- execute("SET statement_timeout TO 0")
-> 0.0003s
-- remove_index(:design_management_versions, {:algorithm=>:concurrently, :column=>:sha})
-> 0.0054s
-- execute("RESET ALL")
-> 0.0003s
== 20190715043944 RemoveShaIndexFromVersions: migrated (0.0091s) ==============
== 20190715043954 SetIssueIdForAllVersions: migrating =========================
-- execute("UPDATE design_management_versions as versions SET issue_id = (\n SELECT design_management_designs.issue_id\n FROM design_management_designs\n INNER JOIN design_management_designs_versions ON design_management_designs.id = design_management_designs_versions.design_id\n WHERE design_management_designs_versions.version_id = versions.id\n LIMIT 1\n )")
-> 0.0028s
== 20190715043954 SetIssueIdForAllVersions: migrated (0.0028s) ================
== 20190715044501 AddUniqueIssueIdShaIndexToVersions: migrating ===============
-- transaction_open?()
-> 0.0000s
-- index_exists?(:design_management_versions, [:sha, :issue_id], {:unique=>true, :using=>:btree, :algorithm=>:concurrently})
-> 0.0016s
-- execute("SET statement_timeout TO 0")
-> 0.0004s
-- add_index(:design_management_versions, [:sha, :issue_id], {:unique=>true, :using=>:btree, :algorithm=>:concurrently})
-> 0.0026s
-- execute("RESET ALL")
-> 0.0004s
== 20190715044501 AddUniqueIssueIdShaIndexToVersions: migrated (0.0052s) ======
Database checklist
-
Conforms to the database guides
When adding migrations:
-
Updated db/schema.rb
-
Added a down
method so the migration can be reverted -
Added the output of the migration(s) to the MR body -
Added tests for the migration in spec/migrations
if necessary (e.g. when migrating data)
When adding or modifying queries to improve performance:
- [-] Included data that shows the performance improvement, preferably in the form of a benchmark
- [-] Included the output of
EXPLAIN (ANALYZE, BUFFERS)
of the relevant queries
When adding foreign keys to existing tables:
- [-] Included a migration to remove orphaned rows in the source table before adding the foreign key
- [-] Removed any instances of
dependent: ...
that may no longer be necessary
When adding tables:
- [-] Ordered columns based on the Ordering Table Columns guidelines
- [-] Added foreign keys to any columns pointing to data in other tables
- [-] Added indexes for fields that are used in statements such as WHERE, ORDER BY, GROUP BY, and JOINs
When removing columns, tables, indexes or other structures:
-
Removed these in a post-deployment migration -
Made sure the application no longer uses (or ignores) these structures
General checklist
- [-] Changelog entry added, if necessary
- [-] Documentation created/updated
-
Tests added for this feature/bug -
Conforms to the code review guidelines -
Conforms to the merge request performance guidelines -
Conforms to the style guides