sqewer 7.0.0 → 8.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
  SHA256:
3
- metadata.gz: acb88799499e49e2390422fd05b7c7a160bfec1f441347947941a8f15f62e3f1
4
- data.tar.gz: d009682a2cf36c0a27daf683b6110a1a0ce6b3f1b35ba111ad391d57281aa4d1
3
+ metadata.gz: 04eca66282554d24d485eb24c83cfbbe6c920eeafe2cc87f2f4638fb1c35ef82
4
+ data.tar.gz: 8eadd3fdbc63b6f0f26a65d5338a587fd6819889d94a83020914f4af65e527ff
5
5
  SHA512:
6
- metadata.gz: 262f94efde1b86cbce03be08ce9a9c4cdd11de0bb95354c1f7a0adc29bdd4dc08c5d3d82d3377c5d9825dde7bbe1a7323214ed6d89c82d4ed97a56ffd27e0f98
7
- data.tar.gz: 5375e768f53ad132fd5a6460dbe5bbf6b1457eaa514c54a1d445fb0f9b7ac30a4c852157877894766ae69da82c2e4efb76c42c4a0689f759ee9b83d909869752
6
+ metadata.gz: 27504ff6d9db93063d766ced7efc1b76de5f4e7977490a2046316438eade94389705a75470e49d9d8e8a5a05862b2551df7d6d673398938b12c166842e6380bf
7
+ data.tar.gz: 1b1a9ef385a4ed693cc6d0999eb8d526b36fda101cfc6ab19e11d856ddf0327a4237affe854e7e03891c16cb9f8e7f4fe4c7140b26218eef64bd23909d4817c2
data/.gitignore CHANGED
@@ -54,3 +54,5 @@ Gemfile.lock
54
54
 
55
55
  # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
56
  # .rubocop-https?--*
57
+
58
+ workdb.sqlite3*
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ### 8.0.3
2
+ - Fix `Sqewer::Connection` to properly get the list of AWS errors
3
+
4
+ ### 8.0.2
5
+ - Add `Aws::SQS::Errors::AccessDenied` to the list of errors that Sqewer must release the singleton SQS client
6
+
7
+ ### 8.0.1
8
+ - Release the singleton SQS client when AWS raises credentials error to be able to use a new credential next time
9
+
10
+ ### 8.0.0
11
+ - Remove method `Sqewer.client=`
12
+ - Change `Sqewer::Connection` to use a singleton SQS client by default
13
+
1
14
  ### 7.0.0
2
15
  - Remove support of Ruby 2.3, 2.4 and 2.5
3
16
  - Remove support of Rails 4
data/lib/sqewer.rb CHANGED
@@ -11,23 +11,9 @@ module Sqewer
11
11
  end
12
12
  end
13
13
 
14
- # Sets an instance of Aws::SQS::Client to be used as a singleton.
15
- # We recommend setting the options instance_profile_credentials_timeout and
16
- # instance_profile_credentials_retries, for example:
17
- #
18
- # sqs_client = Aws::SQS::Client.new(
19
- # instance_profile_credentials_timeout: 1,
20
- # instance_profile_credentials_retries: 5,
21
- # )
22
- # Storm.client = sqs_client
23
- #
24
- # @param client[Aws::SQS::Client] an instance of Aws::SQS::Client
25
- def self.client=(client)
26
- @client = client
27
- end
28
-
14
+ # Returns a singleton of Aws::SQS::Client
29
15
  def self.client
30
- @client
16
+ Sqewer::Connection.client
31
17
  end
32
18
 
33
19
  # Loads a particular Sqewer extension that is not loaded
@@ -39,12 +39,25 @@ class Sqewer::Connection
39
39
  raise "SQS_QUEUE_URL not set in the environment. This is the queue URL Sqewer uses by default."
40
40
  end
41
41
 
42
+ # Returns a singleton of Aws::SQS::Client
43
+ def self.client
44
+ # It's better using a singleton client to prevent making a lot of HTTP
45
+ # requests to the AWS metadata endpoint when getting credentials.
46
+ @client ||= begin
47
+ require 'aws-sdk-sqs'
48
+ ::Aws::SQS::Client.new(
49
+ instance_profile_credentials_timeout: 1,
50
+ instance_profile_credentials_retries: 5,
51
+ )
52
+ end
53
+ end
54
+
42
55
  # Initializes a new adapter, with access to the SQS queue at the given URL.
43
56
  #
44
57
  # @param queue_url[String] the SQS queue URL (the URL can be copied from your AWS console)
45
- def initialize(queue_url)
46
- require 'aws-sdk-sqs'
58
+ def initialize(queue_url, client: self.class.client)
47
59
  @queue_url = queue_url
60
+ @client = client
48
61
  end
49
62
 
50
63
  # Receive at most 10 messages from the queue, and return the array of Message objects. Retries for at
@@ -55,7 +68,7 @@ class Sqewer::Connection
55
68
  # @return [Array<Message>] an array of Message objects
56
69
  def receive_messages
57
70
  Retriable.retriable on: network_and_aws_sdk_errors, tries: MAX_RANDOM_RECEIVE_FAILURES do
58
- response = client.receive_message(
71
+ response = @client.receive_message(
59
72
  queue_url: @queue_url,
60
73
  attribute_names: ['All'],
61
74
  wait_time_seconds: DEFAULT_TIMEOUT_SECONDS,
@@ -63,6 +76,14 @@ class Sqewer::Connection
63
76
  )
64
77
  response.messages.map {|message| Message.new(message.receipt_handle, message.body, message.attributes) }
65
78
  end
79
+ rescue *sqs_errors_to_release_client
80
+ # We noticed cases where errors related to AWS credentials started to happen suddenly.
81
+ # We don't know the root cause yet, but what we can do is release the
82
+ # singleton @client instance because it contains a cache of credentials that in most
83
+ # cases is no longer valid.
84
+ self.class.release_client
85
+
86
+ raise
66
87
  end
67
88
 
68
89
  # Send a message to the backing queue
@@ -189,6 +210,12 @@ class Sqewer::Connection
189
210
  buffer.each_batch {|batch| handle_batch_with_retries(:delete_message_batch, batch) }
190
211
  end
191
212
 
213
+ protected
214
+
215
+ def self.release_client
216
+ @client = nil
217
+ end
218
+
192
219
  private
193
220
 
194
221
  def network_and_aws_sdk_errors
@@ -197,7 +224,7 @@ class Sqewer::Connection
197
224
 
198
225
  def handle_batch_with_retries(method, batch)
199
226
  Retriable.retriable on: network_and_aws_sdk_errors, tries: MAX_RANDOM_FAILURES_PER_CALL do
200
- resp = client.send(method, queue_url: @queue_url, entries: batch)
227
+ resp = @client.send(method, queue_url: @queue_url, entries: batch)
201
228
  wrong_messages, aws_failures = resp.failed.partition {|m| m.sender_fault }
202
229
  if wrong_messages.any?
203
230
  err = wrong_messages.inspect + ', ' + resp.inspect
@@ -208,17 +235,20 @@ class Sqewer::Connection
208
235
  raise NotOurFaultAwsError
209
236
  end
210
237
  end
238
+ rescue *sqs_errors_to_release_client
239
+ # We noticed cases where errors related to AWS credentials started to happen suddenly.
240
+ # We don't know the root cause yet, but what we can do is release the
241
+ # singleton @client instance because it contains a cache of credentials that in most
242
+ # cases is no longer valid.
243
+ self.class.release_client
244
+
245
+ raise
211
246
  end
212
247
 
213
- def client
214
- # It's better using a singleton client to prevent making a lot of HTTP
215
- # requests to the AWS metadata endpoint when getting credentials.
216
- # Maybe in the future, we can remove @client and use Storm.client only.
217
- return Sqewer.client if Sqewer.client
218
-
219
- @client ||= Aws::SQS::Client.new(
220
- instance_profile_credentials_timeout: 1, # defaults to 1 second
221
- instance_profile_credentials_retries: 5, # defaults to 0 retries
222
- )
248
+ def sqs_errors_to_release_client
249
+ [
250
+ Aws::Errors::MissingCredentialsError,
251
+ Aws::SQS::Errors::AccessDenied,
252
+ ]
223
253
  end
224
254
  end
@@ -1,3 +1,3 @@
1
1
  module Sqewer
2
- VERSION = '7.0.0'
2
+ VERSION = '8.0.3'
3
3
  end
data/sqewer.gemspec CHANGED
@@ -50,4 +50,5 @@ Gem::Specification.new do |spec|
50
50
  spec.add_development_dependency "dotenv"
51
51
  spec.add_development_dependency "simplecov"
52
52
  spec.add_development_dependency "appsignal", '~> 2'
53
+ spec.add_development_dependency "pry-byebug"
53
54
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqewer
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 8.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
8
8
  - Andrei Horak
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-04-08 00:00:00.000000000 Z
12
+ date: 2021-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-sqs
@@ -221,6 +221,20 @@ dependencies:
221
221
  - - "~>"
222
222
  - !ruby/object:Gem::Version
223
223
  version: '2'
224
+ - !ruby/object:Gem::Dependency
225
+ name: pry-byebug
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
224
238
  description: A full-featured library for all them SQS worker needs
225
239
  email:
226
240
  - me@julik.nl
@@ -271,7 +285,7 @@ homepage: https://github.com/WeTransfer/sqewer
271
285
  licenses: []
272
286
  metadata:
273
287
  allowed_push_host: https://rubygems.org
274
- post_install_message:
288
+ post_install_message:
275
289
  rdoc_options: []
276
290
  require_paths:
277
291
  - lib
@@ -286,8 +300,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
300
  - !ruby/object:Gem::Version
287
301
  version: '0'
288
302
  requirements: []
289
- rubygems_version: 3.0.3
290
- signing_key:
303
+ rubygems_version: 3.1.6
304
+ signing_key:
291
305
  specification_version: 4
292
306
  summary: Process jobs from SQS
293
307
  test_files: []