未验证 提交 4464a391 编写于 作者: R Rafael França 提交者: GitHub

Merge pull request #31189 from tgxworld/raise_error_when_advisory_lock_is_not_releases

Raise an error if advisory lock in migrator was not released.
......@@ -140,6 +140,7 @@ def initialize(message = nil)
class ConcurrentMigrationError < MigrationError #:nodoc:
DEFAULT_MESSAGE = "Cannot run migrations because another migration process is currently running.".freeze
RELEASE_LOCK_FAILED_MESSAGE = "Failed to release advisory lock".freeze
def initialize(message = DEFAULT_MESSAGE)
super
......@@ -1355,12 +1356,17 @@ def use_advisory_lock?
def with_advisory_lock
lock_id = generate_migrator_advisory_lock_id
got_lock = Base.connection.get_advisory_lock(lock_id)
connection = Base.connection
got_lock = connection.get_advisory_lock(lock_id)
raise ConcurrentMigrationError unless got_lock
load_migrated # reload schema_migrations to be sure it wasn't changed by another process before we got the lock
yield
ensure
Base.connection.release_advisory_lock(lock_id) if got_lock
if got_lock && !connection.release_advisory_lock(lock_id)
raise ConcurrentMigrationError.new(
ConcurrentMigrationError::RELEASE_LOCK_FAILED_MESSAGE
)
end
end
MIGRATOR_SALT = 2053462845
......
......@@ -693,6 +693,25 @@ def migrate(x)
assert_no_column Person, :last_name,
"without an advisory lock, the Migrator should not make any changes, but it did."
end
def test_with_advisory_lock_raises_the_right_error_when_it_fails_to_release_lock
migration = Class.new(ActiveRecord::Migration::Current).new
migrator = ActiveRecord::Migrator.new(:up, [migration], 100)
lock_id = migrator.send(:generate_migrator_advisory_lock_id)
e = assert_raises(ActiveRecord::ConcurrentMigrationError) do
silence_stream($stderr) do
migrator.send(:with_advisory_lock) do
ActiveRecord::Base.connection.release_advisory_lock(lock_id)
end
end
end
assert_match(
/#{ActiveRecord::ConcurrentMigrationError::RELEASE_LOCK_FAILED_MESSAGE}/,
e.message
)
end
end
private
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册