sqewer 4.0.0 → 4.0.1

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: 3df44f7b0b7b55d48c513d4573c16c22051a6452
4
- data.tar.gz: 2967480bcb890b11fa117135e7a4f3541d9724be
3
+ metadata.gz: b516a6047b6e4470f59d4890618272005ce1a849
4
+ data.tar.gz: 8cb5e9d063df19d987ea7bc84e3f69a79a48a8e0
5
5
  SHA512:
6
- metadata.gz: 8fd9e0949bf88525d352b70b46899e91ecef4865d2b60a64348d5ea3587052e18fa6d3d05d12f62a46f31420eac0a80920ebbe4273242d1f2f85a834e9e249f5
7
- data.tar.gz: 2f06335925254b2e923fce2bb979dc10cfa10232a61f16d6ffd47d745678204889167504f008b45c3bdd38419595b7b51d135306ea0f0782548c9472f122e6d0
6
+ metadata.gz: d74828a5dd45a9e8e7be4a6ea06e175f50335ca783cb04e3df50a2cc1e4900f282026a0d622a614ac9037600aa3c0f0a777085dcd7e682f28e44569425f598b3
7
+ data.tar.gz: 6e517aad10bf1b4a6be180fb734a697896034b0a15dd844a40df793ad67539afcdc6fcc70c123c16fc7eb12f433c3c6127b506ccb8a88538a0de3fb85d4be162
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'aws-sdk', '~> 2'
4
- gem 'very_tiny_state_machine', '~> 1'
4
+ gem 'very_tiny_state_machine'
5
5
  gem 'hash_tools'
6
6
  gem 'exceptional_fork'
7
7
 
@@ -3,7 +3,8 @@ require 'thread'
3
3
  # A recorder for send_message and delete_message calls.
4
4
  # Will buffer those calls as if it were a Connection, and then execute
5
5
  # them within a synchronized mutex lock, to prevent concurrent submits
6
- # from the Connection object
6
+ # to the Connection object, and, consequently, concurrent calls to the
7
+ # SQS client.
7
8
  class Sqewer::ConnectionMessagebox
8
9
  class MethodCall < Struct.new(:method_name, :posargs, :kwargs)
9
10
  def perform(on)
@@ -33,12 +33,17 @@ class Sqewer::Isolator
33
33
  # @param worker[Sqewer::Worker] the worker that is running the jobs
34
34
  # @param message[Sqewer::Connection::Message] the message that is being processed
35
35
  def perform(worker, message)
36
+ submitter_class = worker.submitter_class
37
+ execution_context_class = worker.execution_context_class
38
+ middleware_stack = worker.middleware_stack
39
+ connection = worker.connection
40
+ logger = worker.logger
41
+ serializer = worker.serializer
36
42
 
37
- submitter_class, execution_context_class,
38
- middleware_stack, connection, serializer, logger =
39
- worker.submitter_class, worker.execution_context_class,
40
- worker.middleware_stack, worker.connection, worker.serializer, worker.logger
41
-
43
+ # Create a messagebox that buffers all the calls to Connection, so that
44
+ # we can send out those commands in one go (without interfering with senders
45
+ # on other threads, as it seems the Aws::SQS::Client is not entirely
46
+ # thread-safe - or at least not it's HTTP client part).
42
47
  box = Sqewer::ConnectionMessagebox.new(connection)
43
48
 
44
49
  job = middleware_stack.around_deserialization(serializer, message.receipt_handle, message.body) do
@@ -60,10 +65,8 @@ class Sqewer::Isolator
60
65
 
61
66
  delta = Time.now - t
62
67
  logger.info { "[worker] Finished %s in %0.2fs" % [job.inspect, delta] }
63
- rescue => e
64
- raise e
65
68
  ensure
66
69
  n_flushed = box.flush!
67
- logger.info { "[worker] Flushed %d messages" % n_flushed } if n_flushed.nonzero?
70
+ logger.debug { "[worker] Flushed %d connection commands" % n_flushed } if n_flushed.nonzero?
68
71
  end
69
72
  end
@@ -0,0 +1,24 @@
1
+ require 'delegate'
2
+ require 'thread'
3
+
4
+ # Controls the state of the Worker object, and wraps it's state transitions
5
+ # with a Mutex.
6
+ class Sqewer::StateLock < SimpleDelegator
7
+ def initialize
8
+ @m = Mutex.new
9
+ m = VeryTinyStateMachine.new(:stopped)
10
+ m.permit_state :starting, :running, :stopping, :stopped, :failed
11
+ m.permit_transition :stopped => :starting, :starting => :running
12
+ m.permit_transition :running => :stopping, :stopping => :stopped
13
+ m.permit_transition :starting => :failed # Failed to start
14
+ __setobj__(m)
15
+ end
16
+
17
+ def in_state?(some_state)
18
+ @m.synchronize { __getobj__.in_state?(some_state) }
19
+ end
20
+
21
+ def transition!(to_state)
22
+ @m.synchronize { __getobj__.transition!(to_state) }
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Sqewer
2
- VERSION = '4.0.0'
2
+ VERSION = '4.0.1'
3
3
  end
data/lib/sqewer/worker.rb CHANGED
@@ -74,10 +74,7 @@ class Sqewer::Worker
74
74
 
75
75
  @execution_counter = Sqewer::AtomicCounter.new
76
76
 
77
- @state = VeryTinyStateMachine.new(:stopped)
78
- @state.permit_state :starting, :running, :stopping, :stopped, :failed
79
- @state.permit_transition :stopped => :starting, :starting => :running, :running => :stopping, :stopping => :stopped
80
- @state.permit_transition :starting => :failed # Failed to start
77
+ @state = Sqewer::StateLock.new
81
78
  end
82
79
 
83
80
  # Start listening on the queue, spin up a number of consumer threads that will execute the jobs.
@@ -117,9 +114,8 @@ class Sqewer::Worker
117
114
  Thread.pass
118
115
  end
119
116
  else
120
- @logger.debug { "[worker] Suspending poller (%d items buffered)" % @execution_queue.length }
121
- sleep 1
122
- Thread.pass
117
+ @logger.debug { "[worker] Cache is full (%d items), postponing receive" % @execution_queue.length }
118
+ sleep SLEEP_SECONDS_ON_EMPTY_QUEUE
123
119
  end
124
120
  end
125
121
  end
@@ -147,7 +143,7 @@ class Sqewer::Worker
147
143
  break if n_live.zero?
148
144
 
149
145
  n_dead = @threads.length - n_live
150
- @logger.info {"Waiting on threads to terminate, %d still alive, %d quit" % [n_live, n_dead] }
146
+ @logger.info { '[worker] Waiting on threads to terminate, %d still alive, %d quit' % [n_live, n_dead] }
151
147
 
152
148
  sleep 2
153
149
  end
@@ -188,9 +184,8 @@ class Sqewer::Worker
188
184
  handle_message(message)
189
185
  rescue ThreadError # Queue is empty
190
186
  sleep SLEEP_SECONDS_ON_EMPTY_QUEUE
191
- Thread.pass
192
187
  rescue => e # anything else, at or below StandardError that does not need us to quit
193
- @logger.error { "[worker] Failed %s... with %s: %s" % [message.inspect[0..64], e.class, e.message] }
188
+ @logger.error { '[worker] Failed "%s..." with %s: %s' % [message.inspect[0..32], e.class, e.message] }
194
189
  e.backtrace.each { |s| @logger.error{"\t#{s}"} }
195
190
  end
196
191
  end
@@ -12,7 +12,7 @@ describe Sqewer::CLI, :sqs => true, :wait => {timeout: 120} do
12
12
  stderr = Tempfile.new('worker-stderr')
13
13
  stderr.sync = true
14
14
 
15
- pid = fork { $stderr.reopen(stderr); exec("ruby #{__dir__}/cli_app.rb") }
15
+ pid = fork { $stderr.reopen(stderr); $stderr.sync = true; exec("ruby #{__dir__}/cli_app.rb") }
16
16
 
17
17
  Thread.new do
18
18
  20.times do
@@ -39,7 +39,7 @@ describe Sqewer::CLI, :sqs => true, :wait => {timeout: 120} do
39
39
  stderr = Tempfile.new('worker-stderr')
40
40
  stderr.sync = true
41
41
 
42
- pid = fork { $stderr.reopen(stderr); exec("ruby #{__dir__}/cli_app.rb") }
42
+ pid = fork { $stderr.reopen(stderr); $stderr.sync; exec("ruby #{__dir__}/cli_app.rb") }
43
43
 
44
44
  Thread.new do
45
45
  20.times do
data/sqewer.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: sqewer 4.0.0 ruby lib
5
+ # stub: sqewer 4.0.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "sqewer"
9
- s.version = "4.0.0"
9
+ s.version = "4.0.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
40
40
  "lib/sqewer/null_logger.rb",
41
41
  "lib/sqewer/serializer.rb",
42
42
  "lib/sqewer/simple_job.rb",
43
+ "lib/sqewer/state_lock.rb",
43
44
  "lib/sqewer/submitter.rb",
44
45
  "lib/sqewer/version.rb",
45
46
  "lib/sqewer/worker.rb",
@@ -67,7 +68,7 @@ Gem::Specification.new do |s|
67
68
 
68
69
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
69
70
  s.add_runtime_dependency(%q<aws-sdk>, ["~> 2"])
70
- s.add_runtime_dependency(%q<very_tiny_state_machine>, ["~> 1"])
71
+ s.add_runtime_dependency(%q<very_tiny_state_machine>, [">= 0"])
71
72
  s.add_runtime_dependency(%q<hash_tools>, [">= 0"])
72
73
  s.add_runtime_dependency(%q<exceptional_fork>, [">= 0"])
73
74
  s.add_development_dependency(%q<ks>, [">= 0"])
@@ -81,7 +82,7 @@ Gem::Specification.new do |s|
81
82
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
82
83
  else
83
84
  s.add_dependency(%q<aws-sdk>, ["~> 2"])
84
- s.add_dependency(%q<very_tiny_state_machine>, ["~> 1"])
85
+ s.add_dependency(%q<very_tiny_state_machine>, [">= 0"])
85
86
  s.add_dependency(%q<hash_tools>, [">= 0"])
86
87
  s.add_dependency(%q<exceptional_fork>, [">= 0"])
87
88
  s.add_dependency(%q<ks>, [">= 0"])
@@ -96,7 +97,7 @@ Gem::Specification.new do |s|
96
97
  end
97
98
  else
98
99
  s.add_dependency(%q<aws-sdk>, ["~> 2"])
99
- s.add_dependency(%q<very_tiny_state_machine>, ["~> 1"])
100
+ s.add_dependency(%q<very_tiny_state_machine>, [">= 0"])
100
101
  s.add_dependency(%q<hash_tools>, [">= 0"])
101
102
  s.add_dependency(%q<exceptional_fork>, [">= 0"])
102
103
  s.add_dependency(%q<ks>, [">= 0"])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqewer
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: very_tiny_state_machine
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1'
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hash_tools
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -221,6 +221,7 @@ files:
221
221
  - lib/sqewer/null_logger.rb
222
222
  - lib/sqewer/serializer.rb
223
223
  - lib/sqewer/simple_job.rb
224
+ - lib/sqewer/state_lock.rb
224
225
  - lib/sqewer/submitter.rb
225
226
  - lib/sqewer/version.rb
226
227
  - lib/sqewer/worker.rb