From 2b9f430908974f213edb4a3751c57624211c3c4e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 5 Jun 2009 23:07:10 +0000 Subject: [PATCH] Update deadlock_retry plugin with latest upstream code. --- .../deadlock_retry/lib/deadlock_retry.rb | 1 + .../test/deadlock_retry_test.rb | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) 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 -- 2.43.2