Commit 97153f9b authored by Dylan Griffith's avatar Dylan Griffith

Merge branch 'fix_after_commit_or_now_to_use_models_connection' into 'master'

Fix run_after_commit_or_now to use model's connection

See merge request gitlab-org/gitlab!76182
parents c99b914f f79477f1
...@@ -15,8 +15,8 @@ module AfterCommitQueue ...@@ -15,8 +15,8 @@ module AfterCommitQueue
end end
def run_after_commit_or_now(&block) def run_after_commit_or_now(&block)
if ApplicationRecord.inside_transaction? if self.class.inside_transaction?
if ActiveRecord::Base.connection.current_transaction.records&.include?(self) # rubocop: disable Database/MultipleDatabases if connection.current_transaction.records&.include?(self)
run_after_commit(&block) run_after_commit(&block)
else else
# If the current transaction does not include this record, we can run # If the current transaction does not include this record, we can run
......
...@@ -69,5 +69,60 @@ RSpec.describe AfterCommitQueue do ...@@ -69,5 +69,60 @@ RSpec.describe AfterCommitQueue do
expect(called).to be true expect(called).to be true
end end
context 'multiple databases - Ci::ApplicationRecord models' do
before do
skip_if_multiple_databases_not_setup
table_sql = <<~SQL
CREATE TABLE _test_ci_after_commit_queue (
id serial NOT NULL PRIMARY KEY);
SQL
::Ci::ApplicationRecord.connection.execute(table_sql)
end
let(:ci_klass) do
Class.new(Ci::ApplicationRecord) do
self.table_name = '_test_ci_after_commit_queue'
include AfterCommitQueue
def self.name
'TestCiAfterCommitQueue'
end
end
end
let(:ci_record) { ci_klass.new }
it 'runs immediately if not within a transaction' do
called = false
test_proc = proc { called = true }
ci_record.run_after_commit_or_now(&test_proc)
expect(called).to be true
end
it 'runs after transaction has completed' do
called = false
test_proc = proc { called = true }
Ci::ApplicationRecord.transaction do
# Add this record to the current transaction so that after commit hooks
# are called
Ci::ApplicationRecord.connection.add_transaction_record(ci_record)
ci_record.run_after_commit_or_now(&test_proc)
ci_record.save!
expect(called).to be false
end
expect(called).to be true
end
end
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