From 237966bb96fb22e466565d16b3db505d98e1325e Mon Sep 17 00:00:00 2001 From: Nick Veys Date: Fri, 6 Sep 2013 10:19:20 -0500 Subject: [PATCH 1/3] Adding specs for #max_run_time --- lib/delayed/backend/shared_spec.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/delayed/backend/shared_spec.rb b/lib/delayed/backend/shared_spec.rb index 1cd847b17..b1940fcd0 100644 --- a/lib/delayed/backend/shared_spec.rb +++ b/lib/delayed/backend/shared_spec.rb @@ -404,6 +404,30 @@ def create_job(opts = {}) end end + describe '#max_run_time' do + + before(:each) { @job = described_class.enqueue SimpleJob.new } + + it 'is not defined' do + expect(@job.max_run_time).to be_nil + end + + it 'results in a default run time when not defined' do + expect(worker.max_run_time(@job)).to eq(Delayed::Worker::DEFAULT_MAX_RUN_TIME) + end + + it 'uses the max_run_time value on the payload when defined' do + @job.payload_object.stub(:max_run_time).and_return(30.minutes) + expect(@job.max_run_time).to eq(30.minutes) + end + + it 'results in an overridden run time when defined' do + @job.payload_object.stub(:max_run_time).and_return(45.minutes) + expect(worker.max_run_time(@job)).to eq(45.minutes) + end + + end + describe "yaml serialization" do it "reloads changed attributes" do story = Story.create(:text => 'hello') From 3e91125046cca1c3d5d8b4e336b9da07472e34bd Mon Sep 17 00:00:00 2001 From: Nick Veys Date: Fri, 6 Sep 2013 10:19:47 -0500 Subject: [PATCH 2/3] Implementing #max_run_time override support --- lib/delayed/backend/base.rb | 4 ++++ lib/delayed/worker.rb | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/delayed/backend/base.rb b/lib/delayed/backend/base.rb index 3a85a2bba..2affec0f9 100644 --- a/lib/delayed/backend/base.rb +++ b/lib/delayed/backend/base.rb @@ -138,6 +138,10 @@ def max_attempts payload_object.max_attempts if payload_object.respond_to?(:max_attempts) end + def max_run_time + payload_object.max_run_time if payload_object.respond_to?(:max_run_time) + end + def fail! update_attributes(:failed_at => self.class.db_time_now) end diff --git a/lib/delayed/worker.rb b/lib/delayed/worker.rb index fbc365fda..452dce283 100644 --- a/lib/delayed/worker.rb +++ b/lib/delayed/worker.rb @@ -203,7 +203,7 @@ def work_off(num = 100) def run(job) job_say job, 'RUNNING' runtime = Benchmark.realtime do - Timeout.timeout(self.class.max_run_time.to_i, WorkerTimeout) { job.invoke_job } + Timeout.timeout(max_run_time(job).to_i, WorkerTimeout) { job.invoke_job } job.destroy end job_say job, 'COMPLETED after %.4f' % runtime @@ -252,6 +252,10 @@ def max_attempts(job) job.max_attempts || self.class.max_attempts end + def max_run_time(job) + job.max_run_time || self.class.max_run_time + end + protected def handle_failed_job(job, error) From fbb704e0f0ef1e2161c9b6c18b6183490ecd78ba Mon Sep 17 00:00:00 2001 From: Nick Veys Date: Fri, 6 Sep 2013 10:19:59 -0500 Subject: [PATCH 3/3] Fixing typo in max_attempts spec --- lib/delayed/backend/shared_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/delayed/backend/shared_spec.rb b/lib/delayed/backend/shared_spec.rb index b1940fcd0..b3aaa4b94 100644 --- a/lib/delayed/backend/shared_spec.rb +++ b/lib/delayed/backend/shared_spec.rb @@ -398,7 +398,7 @@ def create_job(opts = {}) expect(@job.max_attempts).to be_nil end - it "uses the max_retries value on the payload when defined" do + it "uses the max_attempts value on the payload when defined" do @job.payload_object.stub(:max_attempts).and_return(99) expect(@job.max_attempts).to eq(99) end