From 98d1c3fbe89c354d98f883a91a7d85aef76a2b23 Mon Sep 17 00:00:00 2001 From: "Alexander J. Murmann" Date: Mon, 16 May 2011 08:21:11 -0700 Subject: [PATCH] After enque only scales workers up to 1 if there is no worker after_enque now only starts a single worker, if there is none. The current worker count also is being pulled from Redis instead of heroku This improves response time of the dyno by moving expencive API calls to the worker --- .../plugins/resque_heroku_autoscaler.rb | 6 +++- spec/resque_heroku_autoscaler_spec.rb | 33 +++++++------------ 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/lib/resque/plugins/resque_heroku_autoscaler.rb b/lib/resque/plugins/resque_heroku_autoscaler.rb index 4228f66..fae1920 100644 --- a/lib/resque/plugins/resque_heroku_autoscaler.rb +++ b/lib/resque/plugins/resque_heroku_autoscaler.rb @@ -6,7 +6,11 @@ module HerokuAutoscaler @@heroku_client = nil def after_enqueue_scale_workers_up(*args) - calculate_and_set_workers + if !Resque::Plugins::HerokuAutoscaler::Config.scaling_disabled? && \ + Resque.info[:workers] == 0 && \ + Resque::Plugins::HerokuAutoscaler::Config.new_worker_count(Resque.info[:pending]) >= 1 + set_workers(1) + end end def after_perform_scale_workers(*args) diff --git a/spec/resque_heroku_autoscaler_spec.rb b/spec/resque_heroku_autoscaler_spec.rb index c7c4b7d..0c9774c 100644 --- a/spec/resque_heroku_autoscaler_spec.rb +++ b/spec/resque_heroku_autoscaler_spec.rb @@ -41,36 +41,25 @@ class AnotherJob stub(TestJob).heroku_client { @fake_heroku_client } lambda do - TestJob.after_enqueue_scale_workers_up("some", "random", "aguments", 42) + TestJob.after_enqueue_scale_workers_up("some", "random", "aguments", 42) end.should_not raise_error end it "should create one worker" do - stub(TestJob).current_workers { 0 } - stub(Resque).info{ {:pending => 1} } - mock(TestJob).set_workers(1) - TestJob.after_enqueue_scale_workers_up - end - context "when new_worker_count was changed" do - before do - stub(TestJob).current_workers { 1 } - @original_method = Resque::Plugins::HerokuAutoscaler::Config.instance_variable_get(:@new_worker_count) - subject.config do |c| - c.new_worker_count do - 2 - end + @original_method = Resque::Plugins::HerokuAutoscaler::Config.instance_variable_get(:@new_worker_count) + subject.config do |c| + c.new_worker_count do + 5 end end - after do - Resque::Plugins::HerokuAutoscaler::Config.instance_variable_set(:@new_worker_count, @original_method) - end + stub(TestJob).current_workers { 0 } + stub(Resque).info { {:pending => 100, :workers => 0} } + mock(TestJob).set_workers(1) + TestJob.after_enqueue_scale_workers_up - it "should use the given block" do - mock(TestJob).set_workers(2) - TestJob.after_enqueue_scale_workers_up - end + Resque::Plugins::HerokuAutoscaler::Config.instance_variable_set(:@new_worker_count, @original_method) end context "when scaling workers is disabled" do @@ -257,7 +246,7 @@ class AnotherJob c.heroku_app = 'some_app_name' end - stub(TestJob).current_workers {0} + stub(TestJob).current_workers { 0 } mock(TestJob).heroku_client { mock(@fake_heroku_client).set_workers('some_app_name', 10) } TestJob.set_workers(10) end