Skip to content

Commit eed86a8

Browse files
committed
feat: concurrent migration for postgres db
1 parent 64dec49 commit eed86a8

1 file changed

Lines changed: 36 additions & 8 deletions

File tree

db/migrations/20260323130619_add_unique_constraint_to_security_groups.rb

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
Sequel.migration do
1+
Sequel.migration do # rubocop:disable Metrics/BlockLength
2+
no_transaction # required for concurrently option on postgres
3+
24
up do
35
transaction do
46
duplicates = self[:security_groups].select(:name).
@@ -14,10 +16,23 @@
1416
map(:id)
1517
self[:security_groups].where(id: ids_to_remove).delete
1618
end
19+
end
1720

21+
if database_type == :postgres
22+
VCAP::Migration.with_concurrent_timeout(self) do
23+
drop_index :security_groups, nil,
24+
name: :sg_name_index,
25+
concurrently: true,
26+
if_exists: true
27+
add_index :security_groups, :name,
28+
name: :security_group_name_index,
29+
unique: true,
30+
concurrently: true,
31+
if_not_exists: true
32+
end
33+
else
1834
alter_table(:security_groups) do
19-
# Cannot add unique constraint concurrently as it requires a transaction
20-
# rubocop:disable Sequel/ConcurrentIndex
35+
# rubocop:disable Sequel/ConcurrentIndex -- MySQL does not support concurrent index operations
2136
drop_index :name, name: :sg_name_index if @db.indexes(:security_groups).key?(:sg_name_index)
2237
add_index :name, name: :security_group_name_index, unique: true unless @db.indexes(:security_groups).key?(:security_group_name_index)
2338
# rubocop:enable Sequel/ConcurrentIndex
@@ -26,11 +41,24 @@
2641
end
2742

2843
down do
29-
alter_table(:security_groups) do
30-
# rubocop:disable Sequel/ConcurrentIndex
31-
drop_index :name, name: :security_group_name_index if @db.indexes(:security_groups).key?(:security_group_name_index)
32-
add_index :name, name: :sg_name_index unless @db.indexes(:security_groups).key?(:sg_name_index)
33-
# rubocop:enable Sequel/ConcurrentIndex
44+
if database_type == :postgres
45+
VCAP::Migration.with_concurrent_timeout(self) do
46+
drop_index :security_groups, nil,
47+
name: :security_group_name_index,
48+
concurrently: true,
49+
if_exists: true
50+
add_index :security_groups, :name,
51+
name: :sg_name_index,
52+
concurrently: true,
53+
if_not_exists: true
54+
end
55+
else
56+
alter_table(:security_groups) do
57+
# rubocop:disable Sequel/ConcurrentIndex -- MySQL does not support concurrent index operations
58+
drop_index :name, name: :security_group_name_index if @db.indexes(:security_groups).key?(:security_group_name_index)
59+
add_index :name, name: :sg_name_index unless @db.indexes(:security_groups).key?(:sg_name_index)
60+
# rubocop:enable Sequel/ConcurrentIndex
61+
end
3462
end
3563
end
3664
end

0 commit comments

Comments
 (0)