From d79129880ecfd85d0a48b052af659162647926d9 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 10 Jun 2015 17:02:30 +1000 Subject: [PATCH 1/3] Put lock around adjustment clear/re-create to avoid race condition resulting in duplicate fees --- app/models/spree/order_decorator.rb | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 3c0f212945..df478d8d2f 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -157,20 +157,22 @@ Spree::Order.class_eval do end def update_distribution_charge! - EnterpriseFee.clear_all_adjustments_on_order self + with_lock do + EnterpriseFee.clear_all_adjustments_on_order self - line_items.each do |line_item| - if provided_by_order_cycle? line_item - OpenFoodNetwork::EnterpriseFeeCalculator.new.create_line_item_adjustments_for line_item + line_items.each do |line_item| + if provided_by_order_cycle? line_item + OpenFoodNetwork::EnterpriseFeeCalculator.new.create_line_item_adjustments_for line_item - else - pd = product_distribution_for line_item - pd.create_adjustment_for line_item if pd + else + pd = product_distribution_for line_item + pd.create_adjustment_for line_item if pd + end end - end - if order_cycle - OpenFoodNetwork::EnterpriseFeeCalculator.new.create_order_adjustments_for self + if order_cycle + OpenFoodNetwork::EnterpriseFeeCalculator.new.create_order_adjustments_for self + end end end From a0fd91dc57dace93d1e200624cebdfca8b4e1a5a Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 10 Jun 2015 17:03:56 +1000 Subject: [PATCH 2/3] Do not preload_app with unicorn, update newrelic agent so that it doesn't require this setting. --- Gemfile.lock | 2 +- config/unicorn.rb | 29 ++--------------------------- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index eddc27ee84..864870b280 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -354,7 +354,7 @@ GEM net-scp (1.1.2) net-ssh (>= 2.6.5) net-ssh (2.6.8) - newrelic_rpm (3.6.7.152) + newrelic_rpm (3.12.0.288) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) oj (2.1.2) diff --git a/config/unicorn.rb b/config/unicorn.rb index e5d7317940..22e954b4d0 100644 --- a/config/unicorn.rb +++ b/config/unicorn.rb @@ -1,27 +1,2 @@ -preload_app true # https://newrelic.com/docs/ruby/no-data-with-unicorn -worker_processes 4 # amount of unicorn workers to spin up -timeout 60 # restarts workers that hang for 30 seconds - - -# https://devcenter.heroku.com/articles/forked-pg-connections -before_fork do |server, worker| - - Signal.trap 'TERM' do - puts 'Unicorn master intercepting TERM and sending myself QUIT instead' - Process.kill 'QUIT', Process.pid - end - - defined?(ActiveRecord::Base) and - ActiveRecord::Base.connection.disconnect! -end - -after_fork do |server, worker| - - Signal.trap 'TERM' do - puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' - end - - defined?(ActiveRecord::Base) and - ActiveRecord::Base.establish_connection - -end +worker_processes 2 # amount of unicorn workers to spin up +timeout 120 # restarts workers that hang for 30 seconds From 604360034b6fffe3c2253c2734b626e0e0205cc4 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 10 Jun 2015 17:04:09 +1000 Subject: [PATCH 3/3] Make filter method private --- app/controllers/spree/api/line_items_controller_decorator.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/spree/api/line_items_controller_decorator.rb b/app/controllers/spree/api/line_items_controller_decorator.rb index 35fca864f4..5493c74043 100644 --- a/app/controllers/spree/api/line_items_controller_decorator.rb +++ b/app/controllers/spree/api/line_items_controller_decorator.rb @@ -1,5 +1,8 @@ Spree::Api::LineItemsController.class_eval do - after_filter :apply_enterprise_fees, :only => :update + after_filter :apply_enterprise_fees, only: :update + + + private def apply_enterprise_fees authorize! :read, order