diff --git a/lib/sidekiq/worker.rb b/lib/sidekiq/worker.rb index e41de0f47..1c54efb5a 100644 --- a/lib/sidekiq/worker.rb +++ b/lib/sidekiq/worker.rb @@ -42,13 +42,13 @@ def perform_async(*args) def perform_in(interval, *args) int = interval.to_f - now = Time.now.to_f - ts = (int < 1_000_000_000 ? now + int : int) + now = Time.now + ts = (int < 1_000_000_000 ? (now + interval).to_f : int) item = { 'class' => self, 'args' => args, 'at' => ts } # Optimization to enqueue something now that is scheduled to go out now or in the past - item.delete('at'.freeze) if ts <= now + item.delete('at'.freeze) if ts <= now.to_f client_push(item) end diff --git a/test/test_scheduling.rb b/test/test_scheduling.rb index 80f610db8..c2f8757f2 100644 --- a/test/test_scheduling.rb +++ b/test/test_scheduling.rb @@ -30,6 +30,15 @@ def perform(x) @redis.verify end + it 'schedules a job in one month' do + @redis.expect :zadd, true do |key, args| + assert_equal 'schedule', key + assert_in_delta 1.month.since.to_f, args[0][0].to_f, 1 + end + assert ScheduledWorker.perform_in(1.month, 'mike') + @redis.verify + end + it 'schedules a job via timestamp' do @redis.expect :zadd, true, ['schedule', Array] assert ScheduledWorker.perform_in(5.days.from_now, 'mike')