Skip to content

Commit ffe557e

Browse files
committed
feat: concurrent migration for postgres db
1 parent 431150c commit ffe557e

1 file changed

Lines changed: 32 additions & 6 deletions

File tree

db/migrations/20260323144429_add_unique_constraint_to_revision_process_commands.rb

Lines changed: 32 additions & 6 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[:revision_process_commands].
@@ -15,20 +17,44 @@
1517
map(:id)
1618
self[:revision_process_commands].where(id: ids_to_remove).delete
1719
end
20+
end
1821

22+
if database_type == :postgres
23+
VCAP::Migration.with_concurrent_timeout(self) do
24+
add_index :revision_process_commands, %i[revision_guid process_type],
25+
name: :revision_process_commands_revision_guid_process_type_index,
26+
unique: true,
27+
concurrently: true,
28+
if_not_exists: true
29+
end
30+
else
1931
alter_table(:revision_process_commands) do
32+
# rubocop:disable Sequel/ConcurrentIndex -- MySQL does not support concurrent index operations
2033
unless @db.indexes(:revision_process_commands).key?(:revision_process_commands_revision_guid_process_type_index)
21-
add_unique_constraint %i[revision_guid process_type],
22-
name: :revision_process_commands_revision_guid_process_type_index
34+
add_index %i[revision_guid process_type], unique: true,
35+
name: :revision_process_commands_revision_guid_process_type_index
2336
end
37+
# rubocop:enable Sequel/ConcurrentIndex
2438
end
2539
end
2640
end
2741

2842
down do
29-
alter_table(:revision_process_commands) do
30-
if @db.indexes(:revision_process_commands).key?(:revision_process_commands_revision_guid_process_type_index)
31-
drop_constraint(:revision_process_commands_revision_guid_process_type_index, type: :unique)
43+
if database_type == :postgres
44+
VCAP::Migration.with_concurrent_timeout(self) do
45+
drop_index :revision_process_commands, nil,
46+
name: :revision_process_commands_revision_guid_process_type_index,
47+
concurrently: true,
48+
if_exists: true
49+
end
50+
else
51+
alter_table(:revision_process_commands) do
52+
# rubocop:disable Sequel/ConcurrentIndex -- MySQL does not support concurrent index operations
53+
if @db.indexes(:revision_process_commands).key?(:revision_process_commands_revision_guid_process_type_index)
54+
drop_index %i[revision_guid process_type],
55+
name: :revision_process_commands_revision_guid_process_type_index
56+
end
57+
# rubocop:enable Sequel/ConcurrentIndex
3258
end
3359
end
3460
end

0 commit comments

Comments
 (0)