summaryrefslogtreecommitdiff
path: root/db/migrate
diff options
context:
space:
mode:
authorAndreas Brandl <abrandl@gitlab.com>2018-03-06 20:09:01 +0100
committerAndreas Brandl <abrandl@gitlab.com>2018-03-16 13:35:25 +0100
commit754272e392c0da088200a1b56156600973f63267 (patch)
tree21fdb2f633deff884d39d89f7672f230f1d6c143 /db/migrate
parenta0abb904782970de456dae5539ad5de2afef0e05 (diff)
downloadgitlab-ce-754272e392c0da088200a1b56156600973f63267.tar.gz
Atomic generation of internal ids for issues.
Diffstat (limited to 'db/migrate')
-rw-r--r--db/migrate/20180305095250_create_internal_ids_table.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/db/migrate/20180305095250_create_internal_ids_table.rb b/db/migrate/20180305095250_create_internal_ids_table.rb
new file mode 100644
index 00000000000..19c1904bb43
--- /dev/null
+++ b/db/migrate/20180305095250_create_internal_ids_table.rb
@@ -0,0 +1,35 @@
+class CreateInternalIdsTable < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ create_table :internal_ids do |t|
+ t.references :project
+ t.integer :usage, null: false
+ t.integer :last_value, null: false
+ end
+
+ unless index_exists?(:internal_ids, [:usage, :project_id])
+ add_index :internal_ids, [:usage, :project_id], unique: true
+ end
+
+ unless foreign_key_exists?(:internal_ids, :project_id)
+ add_concurrent_foreign_key :internal_ids, :projects, column: :project_id, on_delete: :cascade
+ end
+ end
+
+ def down
+ drop_table :internal_ids
+ end
+
+ private
+
+ def foreign_key_exists?(table, column)
+ foreign_keys(table).any? do |key|
+ key.options[:column] == column.to_s
+ end
+ end
+end