From f89097e966ae31c200e4c911cca2277f291040ca Mon Sep 17 00:00:00 2001 From: Mikael Henriksson Date: Sun, 19 Aug 2012 11:38:31 +0200 Subject: [PATCH] Make scheduled jobs unique until they are scheduled for. --- .../middleware/client/unique_jobs.rb | 5 ++++- lib/sidekiq-unique-jobs/version.rb | 2 +- test/helper.rb | 2 +- test/lib/sidekiq/test_client.rb | 22 +++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb b/lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb index 8731de555..333972d3c 100644 --- a/lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb +++ b/lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb @@ -23,8 +23,11 @@ def call(worker_class, item, queue) if conn.get(payload_hash) conn.unwatch else + expires_at = HASH_KEY_EXPIRATION + expires_at = ((Time.at(item['at']) - Time.now.utc) * 24 * 60 * 60).to_i if item['at'] + unique = conn.multi do - conn.setex(payload_hash, HASH_KEY_EXPIRATION, 1) + conn.setex(payload_hash, expires_at, 1) end end end diff --git a/lib/sidekiq-unique-jobs/version.rb b/lib/sidekiq-unique-jobs/version.rb index 94cd05b93..d79187997 100644 --- a/lib/sidekiq-unique-jobs/version.rb +++ b/lib/sidekiq-unique-jobs/version.rb @@ -1,3 +1,3 @@ module SidekiqUniqueJobs - VERSION = "2.2.0" + VERSION = "2.2.1" end diff --git a/test/helper.rb b/test/helper.rb index 7782105e4..69ebfa52b 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,7 +3,7 @@ require 'simplecov' SimpleCov.start end - +require 'pry' require 'minitest/unit' require 'minitest/pride' require 'minitest/autorun' diff --git a/test/lib/sidekiq/test_client.rb b/test/lib/sidekiq/test_client.rb index 660c3bf2e..8fcdb8bc1 100644 --- a/test/lib/sidekiq/test_client.rb +++ b/test/lib/sidekiq/test_client.rb @@ -1,6 +1,7 @@ require 'helper' require 'sidekiq/worker' require "sidekiq-unique-jobs" +require 'sidekiq/scheduled' class TestClient < MiniTest::Unit::TestCase describe 'with real redis' do @@ -12,6 +13,8 @@ class TestClient < MiniTest::Unit::TestCase class QueueWorker include Sidekiq::Worker sidekiq_options :queue => 'customqueue' + def perform(x) + end end it 'does not push duplicate messages when configured for unique only' do @@ -25,5 +28,24 @@ class QueueWorker 10.times { Sidekiq::Client.push('class' => QueueWorker, 'args' => [1, 2]) } assert_equal 10, Sidekiq.redis {|c| c.llen("queue:customqueue") } end + + # TODO: If anyone know of a better way to check that the expiration for scheduled + # jobs are set around the same time as the scheduled job itself feel free to improve. + it 'expires the payload_hash when a scheduled job is scheduled at' do + require 'active_support/all' + QueueWorker.sidekiq_options :unique => true + + at = 15.minutes.from_now + expected_expires_at = (Time.at(at) - Time.now.utc).to_f + + QueueWorker.perform_in(at, 'mike') + payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(['mike'])) + + # deconstruct this into a time format we can use to get a decent delta for + actual_expires_at = Sidekiq.redis {|c| c.ttl(payload_hash).to_f / 24 / 60 / 60 } + + assert_in_delta expected_expires_at, actual_expires_at, 0.05 + + end end end \ No newline at end of file