From e6de88f445a45de4ad544238d1878a52a57f51dc Mon Sep 17 00:00:00 2001 From: Pinny Markowitz Date: Tue, 26 Mar 2019 16:03:40 -0400 Subject: [PATCH] add sidekiq middleware component to avoid reusing contexts between workers --- lib/makara.rb | 9 ++++++++- lib/makara/sidekiq/middleware.rb | 11 +++++++++++ lib/makara/sidekiq/railtie.rb | 13 +++++++++++++ spec/sidekiq/middleware_spec.rb | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 lib/makara/sidekiq/middleware.rb create mode 100644 lib/makara/sidekiq/railtie.rb create mode 100644 spec/sidekiq/middleware_spec.rb diff --git a/lib/makara.rb b/lib/makara.rb index dff54dd8..b700d097 100644 --- a/lib/makara.rb +++ b/lib/makara.rb @@ -1,6 +1,9 @@ require 'active_support' require 'makara/version' -require 'makara/railtie' if defined?(Rails) +if defined?(Rails) + require 'makara/railtie' + require 'makara/sidekiq/railtie' if defined?(Sidekiq) +end module Makara autoload :Cache, 'makara/cache' @@ -31,6 +34,10 @@ module Strategies autoload :PriorityFailover, 'makara/strategies/priority_failover' end + module Sidekiq + autoload :Middleware, 'makara/sidekiq/middleware' + end + end ActiveSupport.on_load(:active_record) do diff --git a/lib/makara/sidekiq/middleware.rb b/lib/makara/sidekiq/middleware.rb new file mode 100644 index 00000000..a9274664 --- /dev/null +++ b/lib/makara/sidekiq/middleware.rb @@ -0,0 +1,11 @@ +module Makara + module Sidekiq + class Middleware + def call(*args) + yield + ensure + ::Makara::Context.set_current({}) + end + end + end +end diff --git a/lib/makara/sidekiq/railtie.rb b/lib/makara/sidekiq/railtie.rb new file mode 100644 index 00000000..b2657815 --- /dev/null +++ b/lib/makara/sidekiq/railtie.rb @@ -0,0 +1,13 @@ +module Makara + module Sidekiq + class Railtie < ::Rails::Railtie + initializer 'makara-sidekiq.insert_middleware' do |app| + ::Sidekiq.configure_server do |config| + config.server_middleware do |chain| + chain.add Makara::Sidekiq::Middleware + end + end + end + end + end +end diff --git a/spec/sidekiq/middleware_spec.rb b/spec/sidekiq/middleware_spec.rb new file mode 100644 index 00000000..a4f68999 --- /dev/null +++ b/spec/sidekiq/middleware_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' +require 'makara/sidekiq/middleware' + +describe Makara::Sidekiq::Middleware do + let(:worker) { class_double('Worker') } + let(:job) { Hash.new } + let(:queue) { 'default' } + + shared_examples 'a cleared context' do + it 'clears the context' do + expect(::Makara::Context).to receive(:set_current).with({}) + + subject.call(worker, job, queue) {} + end + end + + context 'when the worker raises an error' do + before do + allow_any_instance_of(worker).to receive(:perform).and_raise(ArgumentError) + end + + it_behaves_like 'a cleared context' + end + + context 'when the worker completes successfully' do + before do + allow_any_instance_of(worker).to receive(:perform).and_return(true) + end + + it_behaves_like 'a cleared context' + end +end