From 45a06a300e99be27f243508f14d11d6856f58bbd Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 26 Mar 2021 12:44:50 +0000 Subject: [PATCH 1/2] Update Exchange touch on Enterprise to use touch_later This can improve issues with deadlocks where multiple touch calls are triggered in a single update, for example where an exchange touches it's parent enterprise on save, and we do this: oc_with_lots_of_exchanges.exchanges.each{|ex| ex.clone! } --- app/models/exchange.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/exchange.rb b/app/models/exchange.rb index 01e23405a5..282173e622 100644 --- a/app/models/exchange.rb +++ b/app/models/exchange.rb @@ -12,7 +12,7 @@ class Exchange < ActiveRecord::Base belongs_to :order_cycle belongs_to :sender, class_name: 'Enterprise' - belongs_to :receiver, class_name: 'Enterprise', touch: true + belongs_to :receiver, class_name: 'Enterprise' has_many :exchange_variants, dependent: :destroy has_many :variants, through: :exchange_variants @@ -23,6 +23,8 @@ class Exchange < ActiveRecord::Base validates :order_cycle, :sender, :receiver, presence: true validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] } + after_save :touch_receiver + accepts_nested_attributes_for :variants scope :in_order_cycle, lambda { |order_cycle| where(order_cycle_id: order_cycle) } @@ -95,4 +97,10 @@ class Exchange < ActiveRecord::Base def participant incoming? ? sender : receiver end + + def touch_receiver + return unless receiver&.persisted? + + receiver.touch_later + end end From 881e6dbac7fd5d42b8b542efb7ee59e6212577de Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 26 Mar 2021 13:01:33 +0000 Subject: [PATCH 2/2] Add more explicit touch spec for Exchange -> Enterprise --- spec/models/enterprise_caching_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/models/enterprise_caching_spec.rb b/spec/models/enterprise_caching_spec.rb index 01c1498046..e5506c46ab 100644 --- a/spec/models/enterprise_caching_spec.rb +++ b/spec/models/enterprise_caching_spec.rb @@ -92,6 +92,13 @@ describe Enterprise do enterprise.reload }.to change { enterprise.updated_at } end + + it "touches enterprise when a relevant exchange is updated" do + expect { + oc.exchanges.first.update!(updated_at: Time.zone.now) + enterprise.reload + }.to change { enterprise.updated_at } + end end it "touches enterprise when the product's variant is added to order cycle" do