resque-serial-queues 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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