sidekiq-sqs 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/lib/sidekiq-sqs.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'active_support'
2
+ require 'aws-sdk'
2
3
 
3
4
  require "sidekiq-sqs/version"
4
5
  require 'sidekiq-sqs/manager'
@@ -27,7 +28,7 @@ module Sidekiq
27
28
 
28
29
  # Can't figure how to include/extend and not get a private method...
29
30
  def Sidekiq.sqs
30
- @sqs_connection ||= AWS::SQS.new
31
+ AWS::SQS.new
31
32
  end
32
33
 
33
34
  Sidekiq.configure_server do |config|
@@ -16,6 +16,16 @@ module Sidekiq
16
16
  @unique_queues = @queues.uniq
17
17
  end
18
18
 
19
+ # TODO Since there's only one fetcher per manager, we run into the issue
20
+ # where it takes longer to fetch a single job that it does to process,
21
+ # on average, so that we have waiting workers even if we have jobs in the
22
+ # queue because, with the HTTP round trip, fetching single messages is too
23
+ # slow.
24
+ #
25
+ # We could fetch 10 at a time, but then we have to worry about stuffing them
26
+ # into a "cache", and pushing them back into SQS if we die or exit. We could,
27
+ # I guess, just let the "hold" on them expire, and then they would be picked
28
+ # up again. I wonder if that would be 'good enough'
19
29
  def fetch
20
30
  watchdog('Fetcher#fetch died') do
21
31
  return if Sidekiq::Fetcher.done?
@@ -4,7 +4,14 @@ module Sidekiq
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- remove_method :assign
7
+ remove_method :assign, :dispatch, :stop
8
+ alias_method_chain :initialize, :sqs
9
+ end
10
+
11
+ def initialize_with_sqs(options = {})
12
+ initialize_without_sqs(options)
13
+
14
+ @fetcher = Sidekiq::Fetcher.pool(args: [current_actor, options[:queues], !!options[:strict]])
8
15
  end
9
16
 
10
17
  def assign(msg, queue)
@@ -24,6 +31,44 @@ module Sidekiq
24
31
  end
25
32
  end
26
33
  end
34
+
35
+ def stop(options={})
36
+ watchdog('Manager#stop died') do
37
+ shutdown = options[:shutdown]
38
+ timeout = options[:timeout]
39
+
40
+ @done = true
41
+ Sidekiq::Fetcher.done!
42
+ @fetcher.finalize
43
+
44
+ logger.info { "Shutting down #{@ready.size} quiet workers" }
45
+ @ready.each { |x| x.terminate if x.alive? }
46
+ @ready.clear
47
+
48
+ logger.debug { "Clearing workers in redis" }
49
+ Sidekiq.redis do |conn|
50
+ workers = conn.smembers('workers')
51
+ workers.each do |name|
52
+ conn.srem('workers', name) if name =~ /:#{process_id}-/
53
+ end
54
+ end
55
+
56
+ return after(0) { signal(:shutdown) } if @busy.empty?
57
+ logger.info { "Pausing up to #{timeout} seconds to allow workers to finish..." }
58
+ hard_shutdown_in timeout if shutdown
59
+ end
60
+ end
61
+
62
+ private
63
+ def dispatch
64
+ return if stopped?
65
+ # This is a safety check to ensure we haven't leaked
66
+ # processors somehow.
67
+ raise "BUG: No processors, cannot continue!" if @ready.empty? && @busy.empty?
68
+ raise "No ready processor!?" if @ready.empty?
69
+
70
+ @fetcher.fetch!
71
+ end
27
72
  end
28
73
  end
29
74
  end
@@ -14,7 +14,7 @@ module Sidekiq
14
14
  begin
15
15
  process_without_sqs(Zlib::Inflate.inflate(Base64.decode64(sqs_message.body)), queue)
16
16
  ensure
17
- # FIXME Maybe we want to requeue here?
17
+ # FIXME Maybe we want to requeue here, if there's a non-job related error?
18
18
  sqs_message.delete
19
19
  end
20
20
  end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Sqs
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
  end
5
5
  end
data/sidekiq-sqs.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
10
10
  gem.email = ["jon@burningbush.us"]
11
11
  gem.description = %q{SQS backed job store for Sidekiq. Redis is still used for stats/job worker tracking}
12
12
  gem.summary = %q{SQS backed job store for Sidekiq}
13
- gem.homepage = ""
13
+ gem.homepage = "http://github.com/jmoses/sidekiq-sqs"
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-sqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-28 00:00:00.000000000 Z
12
+ date: 2012-10-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -132,7 +132,7 @@ files:
132
132
  - sidekiq-sqs.gemspec
133
133
  - spec/sidekiq-sqs/middleware/compression_spec.rb
134
134
  - spec/spec_helper.rb
135
- homepage: ''
135
+ homepage: http://github.com/jmoses/sidekiq-sqs
136
136
  licenses: []
137
137
  post_install_message:
138
138
  rdoc_options: []