Commit 32806aee authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'in-transaction' into 'master'

Refactor AfterCommitQueue.inside_transaction?

See merge request gitlab-org/gitlab-ce!29903
parents e6a41c14 84cb1bda
...@@ -17,7 +17,7 @@ module Sidekiq ...@@ -17,7 +17,7 @@ module Sidekiq
module NoEnqueueingFromTransactions module NoEnqueueingFromTransactions
%i(perform_async perform_at perform_in).each do |name| %i(perform_async perform_at perform_in).each do |name|
define_method(name) do |*args| define_method(name) do |*args|
if !Sidekiq::Worker.skip_transaction_check && AfterCommitQueue.inside_transaction? if !Sidekiq::Worker.skip_transaction_check && Gitlab::Database.inside_transaction?
begin begin
raise Sidekiq::Worker::EnqueueFromTransactionError, <<~MSG raise Sidekiq::Worker::EnqueueFromTransactionError, <<~MSG
`#{self}.#{name}` cannot be called inside a transaction as this can lead to `#{self}.#{name}` cannot be called inside a transaction as this can lead to
......
...@@ -15,7 +15,7 @@ module AfterCommitQueue ...@@ -15,7 +15,7 @@ module AfterCommitQueue
end end
def run_after_commit_or_now(&block) def run_after_commit_or_now(&block)
if AfterCommitQueue.inside_transaction? if Gitlab::Database.inside_transaction?
if ActiveRecord::Base.connection.current_transaction.records.include?(self) if ActiveRecord::Base.connection.current_transaction.records.include?(self)
run_after_commit(&block) run_after_commit(&block)
else else
...@@ -32,18 +32,6 @@ module AfterCommitQueue ...@@ -32,18 +32,6 @@ module AfterCommitQueue
true true
end end
def self.open_transactions_baseline
if ::Rails.env.test?
return DatabaseCleaner.connections.count { |conn| conn.strategy.is_a?(DatabaseCleaner::ActiveRecord::Transaction) }
end
0
end
def self.inside_transaction?
ActiveRecord::Base.connection.open_transactions > open_transactions_baseline
end
protected protected
def _run_after_commit_queue def _run_after_commit_queue
......
...@@ -234,6 +234,7 @@ module Gitlab ...@@ -234,6 +234,7 @@ module Gitlab
def self.connection def self.connection
ActiveRecord::Base.connection ActiveRecord::Base.connection
end end
private_class_method :connection
def self.cached_column_exists?(table_name, column_name) def self.cached_column_exists?(table_name, column_name)
connection.schema_cache.columns_hash(table_name).has_key?(column_name.to_s) connection.schema_cache.columns_hash(table_name).has_key?(column_name.to_s)
...@@ -243,8 +244,6 @@ module Gitlab ...@@ -243,8 +244,6 @@ module Gitlab
connection.schema_cache.data_source_exists?(table_name) connection.schema_cache.data_source_exists?(table_name)
end end
private_class_method :connection
def self.database_version def self.database_version
row = connection.execute("SELECT VERSION()").first row = connection.execute("SELECT VERSION()").first
...@@ -272,5 +271,20 @@ module Gitlab ...@@ -272,5 +271,20 @@ module Gitlab
end end
end end
end end
# inside_transaction? will return true if the caller is running within a transaction. Handles special cases
# when running inside a test environment, in which the entire test is running with a DatabaseCleaner transaction
def self.inside_transaction?
ActiveRecord::Base.connection.open_transactions > open_transactions_baseline
end
def self.open_transactions_baseline
if ::Rails.env.test?
return DatabaseCleaner.connections.count { |conn| conn.strategy.is_a?(DatabaseCleaner::ActiveRecord::Transaction) }
end
0
end
private_class_method :open_transactions_baseline
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment