resque-serial-queues 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd531373558ed3d2a84f9e421a3233c9ab905d1f
4
- data.tar.gz: 9de3eb0f08eb657bd08c24aea3631e63da08373c
3
+ metadata.gz: e19304f340b143c7376d8cc03dd7d81bec8b74c3
4
+ data.tar.gz: 86ed33dcccfcafb040c117666699765858190960
5
5
  SHA512:
6
- metadata.gz: 8fff5b737059347db4d065cfcdc542199a7bde5cd41b3debecadaa1b115de2ce2f1d7080dc3558a87730fde750ff94012b39d5d41e5d9d51740988045e0955be
7
- data.tar.gz: cfc9029142c28796b5b500a533eaaf06eb39ee659517724daddd4edbee16d47cdfd024b2b36c502f5d7e5911b762bd0ee04057b6702bcf2781c9cac1d63eb693
6
+ metadata.gz: d668ba3a3707d79e788f555a996e04e89ca3c5529062e8be643d0315d658bbe5cbc811b69d7c64c083e2ca8df2bae9388368fbd05d755940c9ac60a14fa9e904
7
+ data.tar.gz: 0a57e248988a019a1f717a06eae19c1b29f32da4ac70a60bba38da0da0446423c110045fd63967f448a05c2d38f21e381ba7723ff53d7ea659f210b3682d6509
@@ -1,7 +1,7 @@
1
1
  module Resque
2
2
  module Plugins
3
3
  module SerialQueues
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
6
6
  end
7
7
  end
@@ -17,6 +17,10 @@ module Resque
17
17
  config.serial_queues.include?(queue.to_s)
18
18
  end
19
19
 
20
+ def self.is_queue_locked?(queue)
21
+ redis.exists("queue-lock:#{queue}")
22
+ end
23
+
20
24
  def self.lock_queue(queue)
21
25
  if redis.setnx("queue-lock:#{queue}", 1)
22
26
  redis.expire("queue-lock:#{queue}", config.lock_timeout)
@@ -26,10 +30,6 @@ module Resque
26
30
  end
27
31
  end
28
32
 
29
- def self.is_queue_locked?(queue)
30
- redis.exists("queue-lock:#{queue}")
31
- end
32
-
33
33
  def self.unlock_queue(queue)
34
34
  redis.del("queue-lock:#{queue}")
35
35
  end
@@ -3,10 +3,18 @@ require 'resque/job'
3
3
 
4
4
  class Resque::Job
5
5
  def self.reserve(queue)
6
+ return if queue=="*"
6
7
  return if is_serial_queue?(queue) and is_queue_locked?(queue)
7
- return unless payload = Resque.pop(queue)
8
- lock_queue(queue)
9
- new(queue, payload)
8
+ return if is_serial_queue?(queue) and Resque.peek(queue) and not lock_queue(queue)
9
+ if payload = Resque.pop(queue)
10
+ new(queue, payload)
11
+ else
12
+ unlock_queue(queue)
13
+ nil
14
+ end
15
+ rescue Exception => e
16
+ unlock_queue(queue)
17
+ nil
10
18
  end
11
19
 
12
20
  protected
@@ -21,6 +29,10 @@ class Resque::Job
21
29
  def self.lock_queue(queue)
22
30
  Resque::Plugins::SerialQueues.lock_queue(queue)
23
31
  end
32
+
33
+ def self.unlock_queue(queue)
34
+ Resque::Plugins::SerialQueues.unlock_queue(queue)
35
+ end
24
36
  end
25
37
 
26
38
  class Object
@@ -39,37 +39,34 @@ class LockingTest < ResqueSerialQueuesTest
39
39
  def test_a_queue_is_not_locked_after_running
40
40
  self.class.start_redis_workers 1
41
41
  Resque.enqueue SleepingJob, 0.1
42
- sleep 0.4
42
+ sleep 1
43
43
  assert_queue_unlocked :serial_jobs
44
44
  end
45
45
 
46
46
  def test_a_queue_is_not_locked_after_a_job_fails
47
47
  self.class.start_redis_workers 1
48
48
  Resque.enqueue DelayedFailingJob, 0.1
49
- sleep 0.4
49
+ sleep 1
50
50
  assert_queue_unlocked :serial_jobs
51
51
  end
52
52
 
53
53
  def test_running_many_concurrent_jobs
54
- jobs = 10
55
- max_sleep = 0.05
56
- workers = 2
54
+ jobs = 5000
55
+ max_sleep = 0.5
56
+ workers = 5
57
57
  self.class.start_redis_workers workers
58
58
  jobs.times do
59
59
  Resque.enqueue BenchmarkJob, max_sleep
60
60
  end
61
- assert_queue_locked :serial_jobs
62
61
  while Resque.info[:pending]>0
63
- sleep 0.1
64
- assert Resque.info[:working]<=1, "Should not have more than one working worker"
62
+ sleep 1
65
63
  end
66
- assert_queue_unlocked :serial_jobs
67
64
  results = []
68
65
  while row = Resque::Plugins::SerialQueues.redis.lpop("benchmark-results")
69
66
  results << row.split("-").map(&:to_f)
70
67
  end
71
68
  results.flatten!
72
- assert_equal results, results.sort
69
+ assert_equal results, results.sort, "Workers times seems to overlap"
73
70
  end
74
71
 
75
72
  end
@@ -70,14 +70,23 @@ class ResqueSerialQueuesTest < Minitest::Test
70
70
  raise "Failed to start worker"
71
71
  end
72
72
  else
73
- Resque.redis.client.reconnect
74
- worker = Resque::Worker.new("*")
75
- worker.term_timeout = 4.0
76
- worker.term_child = true
77
- Resque.logger.level = Logger::DEBUG
78
- log "Worker started working"
79
- worker.work 0.1
80
- Kernel.exit!
73
+ begin
74
+ Resque.redis.client.reconnect
75
+ # we need to prevent against querying for jobs in "*"
76
+ Resque.watch_queue :test_queue
77
+ # Resque.logger = MonoLogger.new(File.open(File.expand_path('../../log', __FILE__) << "/resque-#{Process.pid}.log", "w+"))
78
+ # Resque.logger.level = Logger::DEBUG
79
+ # Resque.logger.formatter = Resque::VerboseFormatter.new
80
+ worker = Resque::Worker.new("*")
81
+ worker.term_timeout = 4.0
82
+ worker.term_child = true
83
+ log "Worker will start working"
84
+ worker.work 0.1
85
+ Kernel.exit!
86
+ rescue Exception => e
87
+ log "Failed to start worker: #{e.inspect}"
88
+ Kernel.exit!
89
+ end
81
90
  end
82
91
  end
83
92
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-serial-queues
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cristian Bica