shoryuken 3.1.4 → 3.1.5

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: 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