Skip to content

Commit

Permalink
Change UPDATE to a loop
Browse files Browse the repository at this point in the history
it "should" not create a deadlock anymore
  • Loading branch information
Haelle committed Apr 2, 2021
1 parent bf6f768 commit c9acd73
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 10 deletions.
20 changes: 17 additions & 3 deletions app/concepts/stock/task/create_associations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,15 @@ def log_transaction_failed(_, error:, logger:, **)
private

def execute_transaction(ctx)
ActiveRecord::Base.connection.execute(sql)
rescue ActiveRecord::ActiveRecordError
ctx[:loop_count] = 0
loop do
pg_result = ActiveRecord::Base.connection.execute(sql)
updated_rows_count = pg_result.cmd_tuples
break if updated_rows_count.zero?
ctx[:loop_count] += 1
end
ctx[:loop_count].positive?
rescue ActiveRecord::ActiveRecordError, StandardError
ctx[:error] = $ERROR_INFO
false
end
Expand All @@ -36,9 +43,16 @@ def sql
UPDATE etablissements_tmp
SET unite_legale_id = unites_legales_tmp.id
FROM unites_legales_tmp
WHERE etablissements_tmp.siren = unites_legales_tmp.siren
WHERE etablissements_tmp.id IN (
SELECT id from etablissements_tmp where unite_legale_id IS NULL LIMIT #{request_limit}
)
AND etablissements_tmp.siren = unites_legales_tmp.siren
END_SQL
end

def request_limit
5_000
end
end
end
end
12 changes: 11 additions & 1 deletion spec/concepts/stock/operation/post_import_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,18 @@
it_behaves_like 'not doing anything'
end

context 'when both imports are COMPLETED' do
context 'when both imports are COMPLETED', use_transactional_fixtures: false do
let(:siren_1) { '005880034' }

before do
wrap_with_table_renamed(UniteLegale) do
create :unite_legale, siren: siren_1
end

wrap_with_table_renamed(Etablissement) do
create :etablissement, siren: siren_1
end

create :stock_etablissement, :completed
create :stock_unite_legale, :completed
end
Expand Down
27 changes: 21 additions & 6 deletions spec/concepts/stock/task/create_associations_spec.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
require 'rails_helper'

describe Stock::Task::CreateAssociations do
describe Stock::Task::CreateAssociations, use_transactional_fixtures: false do
subject { described_class.call logger: logger }

let(:logger) { instance_spy Logger }
let(:siren) { '005880034' }
let(:siren_1) { '005880034' }
let(:siren_2) { '005880035' }
let(:siren_3) { '005880036' }

let!(:unite_legale) do
wrap_with_table_renamed(UniteLegale) do
create :unite_legale, siren: siren
create :unite_legale, siren: siren_1
create :unite_legale, siren: siren_2
create :unite_legale, siren: siren_3
end
end

let!(:etablissement) do
wrap_with_table_renamed(Etablissement) do
create :etablissement, siren: siren
create :etablissement, siren: siren_1
create :etablissement, siren: siren_2
create :etablissement, siren: siren_3
end
end

Expand All @@ -33,9 +39,18 @@
it 'created the association for etablissement' do
subject
etab = Etablissement.new(
get_raw_data('etablissements_tmp').first
get_raw_data('etablissements_tmp').find { |e| e['siren'] == siren_1 }
)
expect(etab.unite_legale_id).to eq unite_legale.id
entreprise = UniteLegale.new(
get_raw_data('unites_legales_tmp').find { |u| u['siren'] == siren_1 }
)
expect(etab.unite_legale_id).to eq entreprise.id
end

it 'should have done 2 loop for the associations' do
allow_any_instance_of(described_class).to receive(:request_limit).and_return 2
subject
expect(subject[:loop_count]).to eq 2
end

context 'when association failed' do
Expand Down

0 comments on commit c9acd73

Please sign in to comment.