sqewer 7.0.0 → 8.0.3

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