shoryuken 3.1.4 → 3.1.5

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: 4ff2018a0359b4e5287c85d99d56cbe38c8c0b01
4
- data.tar.gz: 363cc8117930365492c2049aaafc7b4b670f1e95
3
+ metadata.gz: ed935b3a706f2e96acd020a62bee5141910bf63f
4
+ data.tar.gz: 502827e59b4c18b605eccbd7c9b31829afaef23e
5
5
  SHA512:
6
- metadata.gz: 6cde1b21dab95a1ee1b7eea7e313ccba94728745ca708d59bf64ee0a1ca7f32b07302ca02963732d326eb8291ea386c4f1651d8499511a7d2df93bca10a9073a
7
- data.tar.gz: '0338ea06538ec87a07f6ab88f978670a43610f6ea79d0a1fbb24eea0a262c436aeb25e9be8f042faf7e78793a7fc53a80640e6e8970b1bd77bf6b70bf5469457'
6
+ metadata.gz: 802af1fc13ac74c36745582d3b796def81bfdd53d8340a44ea212813a8cb3598d40969821c8172eeba6dca2a10a8be8affce9d7390dee028660a46f909533601
7
+ data.tar.gz: '075822afd74835bbe91e49efa991dc24957405ce830005f2f4c59d0add5e5db39633680a5bda5647af7ec7e74815ca0050ea6a316bf5e5bed870d7e048224db1'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [v3.1.5] - 2017-07-23
2
+
3
+ - Fix memory leak
4
+ - [#414](https://github.com/phstc/shoryuken/pull/414)
5
+
6
+ - Fail fast on bad queue URLs
7
+ - [#413](https://github.com/phstc/shoryuken/pull/413)
8
+
1
9
  ## [v3.1.4] - 2017-07-14
2
10
 
3
11
  - Require forwardable allowding to call `shoryuken` without `bundle exec`
@@ -3,8 +3,7 @@ module Shoryuken
3
3
  include Util
4
4
 
5
5
  def initialize
6
- @managers = create_managers
7
- @shutdowning = Concurrent::AtomicBoolean.new(false)
6
+ @managers = create_managers
8
7
  end
9
8
 
10
9
  def start
@@ -41,24 +40,10 @@ module Shoryuken
41
40
 
42
41
  def start_managers
43
42
  @managers.each do |manager|
44
- Concurrent::Promise.execute { manager.start }.rescue do |ex|
45
- log_manager_failure(ex)
46
- start_soft_shutdown
47
- end
43
+ Concurrent::Future.execute { manager.start }
48
44
  end
49
45
  end
50
46
 
51
- def start_soft_shutdown
52
- Process.kill('USR1', Process.pid) if @shutdowning.make_true
53
- end
54
-
55
- def log_manager_failure(ex)
56
- return unless ex
57
-
58
- logger.error { "Manager failed: #{ex.message}" }
59
- logger.error { ex.backtrace.join("\n") } unless ex.backtrace.nil?
60
- end
61
-
62
47
  def initiate_stop
63
48
  logger.info { 'Shutting down' }
64
49
 
@@ -27,9 +27,7 @@ module Shoryuken
27
27
  def dispatch_loop
28
28
  return unless running?
29
29
 
30
- Concurrent::Promise.execute(
31
- executor: @executor
32
- ) { dispatch }.then { dispatch_loop }.rescue { |ex| raise ex }
30
+ @executor.post { dispatch }
33
31
  end
34
32
 
35
33
  def dispatch
@@ -44,6 +42,10 @@ module Shoryuken
44
42
  logger.debug { "Ready: #{ready}, Busy: #{busy}, Active Queues: #{@polling_strategy.active_queues}" }
45
43
 
46
44
  batched_queue?(queue) ? dispatch_batch(queue) : dispatch_single_messages(queue)
45
+
46
+ dispatch_loop
47
+ rescue => ex
48
+ handle_dispatch_error(ex)
47
49
  end
48
50
 
49
51
  def busy
@@ -96,5 +98,12 @@ module Shoryuken
96
98
 
97
99
  sqs_msgs
98
100
  end
101
+
102
+ def handle_dispatch_error(ex)
103
+ logger.error { "Manager failed: #{ex.message}" }
104
+ logger.error { ex.backtrace.join("\n") } unless ex.backtrace.nil?
105
+
106
+ Process.kill('USR1', Process.pid)
107
+ end
99
108
  end
100
109
  end
@@ -49,20 +49,27 @@ module Shoryuken
49
49
 
50
50
  private
51
51
 
52
- def set_name(name)
52
+ def set_by_name(name)
53
53
  self.name = name
54
54
  self.url = client.get_queue_url(queue_name: name).queue_url
55
- rescue Aws::Errors::NoSuchEndpointError, Aws::SQS::Errors::NonExistentQueue => ex
56
- raise ex, "The specified queue #{name} does not exist."
57
55
  end
58
56
 
59
- def set_url(url)
57
+ def set_by_url(url)
60
58
  self.name = url.split('/').last
61
59
  self.url = url
62
60
  end
63
61
 
64
62
  def set_name_and_url(name_or_url)
65
- name_or_url.start_with?('https://sqs.') ? set_url(name_or_url) : set_name(name_or_url)
63
+ if name_or_url.start_with?('https://sqs.')
64
+ set_by_url(name_or_url)
65
+
66
+ # anticipate the fifo? checker for validating the queue URL
67
+ return fifo?
68
+ end
69
+
70
+ set_by_name(name_or_url)
71
+ rescue Aws::Errors::NoSuchEndpointError, Aws::SQS::Errors::NonExistentQueue => ex
72
+ raise ex, "The specified queue #{name_or_url} does not exist."
66
73
  end
67
74
 
68
75
  def queue_attributes
@@ -1,3 +1,3 @@
1
1
  module Shoryuken
2
- VERSION = '3.1.4'.freeze
2
+ VERSION = '3.1.5'.freeze
3
3
  end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
+ # rubocop:disable Metrics/BlockLength
3
4
  RSpec.describe Shoryuken::Queue do
4
5
  let(:credentials) { Aws::Credentials.new('access_key_id', 'secret_access_key') }
5
6
  let(:sqs) { Aws::SQS::Client.new(stub_responses: true, credentials: credentials) }
@@ -15,10 +16,12 @@ RSpec.describe Shoryuken::Queue do
15
16
  end
16
17
 
17
18
  describe '#new' do
18
- context 'when queue url supplied' do
19
- subject { described_class.new(sqs, queue_url) }
19
+ context 'when queue URL supplied' do
20
+ it 'instantiates by URL and validate the URL' do
21
+ expect_any_instance_of(described_class).to receive(:fifo?).and_return(false)
22
+
23
+ subject = described_class.new(sqs, queue_url)
20
24
 
21
- specify do
22
25
  expect(subject.name).to eq(queue_name)
23
26
  end
24
27
  end
@@ -51,7 +54,9 @@ RSpec.describe Shoryuken::Queue do
51
54
  failure = double(id: 'id', code: 'code', message: '...', sender_fault: false)
52
55
  logger = double 'Logger'
53
56
 
54
- expect(sqs).to receive(:delete_message_batch).with(entries: entries, queue_url: queue_url).and_return(double(failed: [failure]))
57
+ expect(sqs).to(
58
+ receive(:delete_message_batch).with(entries: entries, queue_url: queue_url).and_return(double(failed: [failure]))
59
+ )
55
60
  expect(subject).to receive(:logger).and_return(logger)
56
61
  expect(logger).to receive(:error)
57
62
 
@@ -111,36 +116,30 @@ RSpec.describe Shoryuken::Queue do
111
116
  end
112
117
 
113
118
  describe '#send_messages' do
114
- before {
115
- allow(subject).to receive(:fifo?).and_return(false)
116
- }
119
+ before { allow(subject).to receive(:fifo?).and_return(false) }
120
+
117
121
  it 'accepts SQS request parameters' do
118
122
  # https://docs.aws.amazon.com/sdkforruby/api/Aws/SQS/Client.html#send_message_batch-instance_method
119
- expect(sqs).to receive(:send_message_batch).with(hash_including(entries: [{id: '0', message_body: 'msg1'}, {id: '1', message_body: 'msg2'}]))
123
+ expect(sqs).to(
124
+ receive(:send_message_batch).with(hash_including(entries: [{id: '0', message_body: 'msg1'}, {id: '1', message_body: 'msg2'}]))
125
+ )
120
126
 
121
127
  subject.send_messages(entries: [{id: '0', message_body: 'msg1'}, {id: '1', message_body: 'msg2'}])
122
128
  end
123
129
 
124
130
  it 'accepts an array of messages' do
125
- options = { entries: [{ id: '0',
126
- message_body: 'msg1',
127
- delay_seconds: 1,
128
- message_attributes: { attr: 'attr1' } },
129
- { id: '1',
130
- message_body: 'msg2',
131
- delay_seconds: 1,
132
- message_attributes: { attr: 'attr2' } }] }
133
-
131
+ options = { entries: [
132
+ { id: '0', message_body: 'msg1', delay_seconds: 1, message_attributes: { attr: 'attr1' } },
133
+ { id: '1', message_body: 'msg2', delay_seconds: 1, message_attributes: { attr: 'attr2' } }
134
+ ] }
134
135
  expect(sqs).to receive(:send_message_batch).with(hash_including(options))
135
136
 
136
- subject.send_messages([{ message_body: 'msg1',
137
- delay_seconds: 1,
138
- message_attributes: { attr: 'attr1' }
139
- }, {
140
- message_body: 'msg2',
141
- delay_seconds: 1,
142
- message_attributes: { attr: 'attr2' }
143
- }])
137
+ subject.send_messages(
138
+ [
139
+ { message_body: 'msg1', delay_seconds: 1, message_attributes: { attr: 'attr1' } },
140
+ { message_body: 'msg2', delay_seconds: 1, message_attributes: { attr: 'attr2' } }
141
+ ]
142
+ )
144
143
  end
145
144
 
146
145
  context 'when FIFO' do
@@ -170,16 +169,24 @@ RSpec.describe Shoryuken::Queue do
170
169
  expect(first_entry[:message_deduplication_id]).to eq 'my id'
171
170
  end
172
171
 
173
- subject.send_messages([{ message_body: 'msg1',
174
- message_attributes: { attr: 'attr1' },
175
- message_group_id: 'my group',
176
- message_deduplication_id: 'my id' }])
172
+ subject.send_messages(
173
+ [
174
+ { message_body: 'msg1',
175
+ message_attributes: { attr: 'attr1' },
176
+ message_group_id: 'my group',
177
+ message_deduplication_id: 'my id' }
178
+ ]
179
+ )
177
180
  end
178
181
  end
179
182
  end
180
183
 
181
184
  it 'accepts an array of string' do
182
- expect(sqs).to receive(:send_message_batch).with(hash_including(entries: [{ id: '0', message_body: 'msg1' }, { id: '1', message_body: 'msg2' }]))
185
+ expect(sqs).to(
186
+ receive(:send_message_batch).with(
187
+ hash_including(entries: [{ id: '0', message_body: 'msg1' }, { id: '1', message_body: 'msg2' }])
188
+ )
189
+ )
183
190
 
184
191
  subject.send_messages(%w(msg1 msg2))
185
192
  end
@@ -189,9 +196,13 @@ RSpec.describe Shoryuken::Queue do
189
196
  before do
190
197
  attribute_response = double 'Aws::SQS::Types::GetQueueAttributesResponse'
191
198
 
192
- allow(attribute_response).to receive(:attributes).and_return('FifoQueue' => fifo.to_s, 'ContentBasedDeduplication' => 'true')
199
+ allow(attribute_response).to(
200
+ receive(:attributes).and_return('FifoQueue' => fifo.to_s, 'ContentBasedDeduplication' => 'true')
201
+ )
193
202
  allow(subject).to receive(:url).and_return(queue_url)
194
- allow(sqs).to receive(:get_queue_attributes).with(queue_url: queue_url, attribute_names: ['All']).and_return(attribute_response)
203
+ allow(sqs).to(
204
+ receive(:get_queue_attributes).with(queue_url: queue_url, attribute_names: ['All']).and_return(attribute_response)
205
+ )
195
206
  end
196
207
 
197
208
  context 'when queue is FIFO' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoryuken
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.4
4
+ version: 3.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Cantero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-14 00:00:00.000000000 Z
11
+ date: 2017-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler