From: Tom Hughes Date: Fri, 5 Jun 2009 23:07:10 +0000 (+0000) Subject: Update deadlock_retry plugin with latest upstream code. X-Git-Tag: live~7174 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/2b9f430908974f213edb4a3751c57624211c3c4e?hp=edcd4af496f7c385b38afc3e16e76b6a122d76fa Update deadlock_retry plugin with latest upstream code. --- diff --git a/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb b/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb index 413cb823c..39aeff869 100644 --- a/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb +++ b/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb @@ -44,6 +44,7 @@ module DeadlockRetry begin transaction_without_deadlock_handling(*objects, &block) rescue ActiveRecord::StatementInvalid => error + raise unless connection.open_transactions.zero? if DEADLOCK_ERROR_MESSAGES.any? { |msg| error.message =~ /#{Regexp.escape(msg)}/ } raise if retry_count >= MAXIMUM_RETRIES_ON_DEADLOCK retry_count += 1 diff --git a/vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb b/vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb index db0f6195d..7124391f8 100644 --- a/vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb +++ b/vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb @@ -20,8 +20,21 @@ require 'test/unit' require "#{File.dirname(__FILE__)}/../lib/deadlock_retry" class MockModel - def self.transaction(*objects, &block) - block.call + @@open_transactions = 0 + + def self.transaction(*objects) + @@open_transactions += 1 + yield + ensure + @@open_transactions -= 1 + end + + def self.open_transactions + @@open_transactions + end + + def self.connection + self end def self.logger @@ -62,4 +75,21 @@ class DeadlockRetryTest < Test::Unit::TestCase MockModel.transaction { raise ActiveRecord::StatementInvalid, "Something else" } end end + + def test_error_in_nested_transaction_should_retry_outermost_transaction + tries = 0 + errors = 0 + + MockModel.transaction do + tries += 1 + MockModel.transaction do + MockModel.transaction do + errors += 1 + raise ActiveRecord::StatementInvalid, "MySQL::Error: Lock wait timeout exceeded" unless errors > 3 + end + end + end + + assert_equal 4, tries + end end