48 lines
1.5 KiB
Ruby
48 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Database
|
|
module Migrations
|
|
module LockRetryMixin
|
|
module ActiveRecordMigrationProxyLockRetries
|
|
def migration_class
|
|
migration.class
|
|
end
|
|
|
|
def migration_connection
|
|
migration.connection
|
|
end
|
|
|
|
def enable_lock_retries?
|
|
# regular AR migrations don't have this,
|
|
# only ones inheriting from Gitlab::Database::Migration have
|
|
return false unless migration.respond_to?(:enable_lock_retries?)
|
|
|
|
migration.enable_lock_retries?
|
|
end
|
|
end
|
|
|
|
module ActiveRecordMigratorLockRetries
|
|
# We patch the original method to start a transaction
|
|
# using the WithLockRetries methodology for the whole migration.
|
|
def ddl_transaction(migration, &block)
|
|
if use_transaction?(migration) && migration.enable_lock_retries?
|
|
Gitlab::Database::WithLockRetries.new(
|
|
connection: migration.migration_connection,
|
|
klass: migration.migration_class,
|
|
logger: Gitlab::BackgroundMigration::Logger
|
|
).run(raise_on_exhaustion: false, &block)
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.patch!
|
|
ActiveRecord::MigrationProxy.prepend(ActiveRecordMigrationProxyLockRetries)
|
|
ActiveRecord::Migrator.prepend(ActiveRecordMigratorLockRetries)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|