toiler 0.5.0 → 0.5.1.pre1

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: 5abd63f186c193943169cb25c4f29498dcf0b7cb
4
- data.tar.gz: 1d781bbfb99012e0f3af32ad8caac69fb00e5c10
3
+ metadata.gz: 3efc28d7e6e93a72eec97541769224ae90bf88aa
4
+ data.tar.gz: 48c91cc61b0c9624848d3c6b2a5139ca2916566a
5
5
  SHA512:
6
- metadata.gz: f1c7cacc2c8ba06c9863d056550a36b6429a2c3422e394b14284e0bd63d06d85fbad6976a485c9e3cdde06ef86310a8aba6a5eb3145b99a1197db56eaa06417b
7
- data.tar.gz: a1e41500cebe89ef547e86a23f7e647e04dd8704f8808f1ccf8197bf7ccb2423d21172052e60259bcbc0bf980fdef8ba474ba2fb3f5aa2e0520ddd31b77acd05
6
+ metadata.gz: da792a91216f97a6c7cbee7becc4352d5c9c49a8ecc21cab178adebcb21991a791d72b2ddd93aad434f3533f12ba49e4919f7647c5e8ed1b827802212422a182
7
+ data.tar.gz: 6d21aed25d630a51f64d61f0520750ca3eba9849277a97f8828cc79830650146de9d90f097d0f26c0abaaf92f1bba368d71fffb5436c8003c7f1ee2758d7834f
@@ -10,49 +10,37 @@ module Toiler
10
10
  FETCH_LIMIT = 10
11
11
 
12
12
  attr_accessor :queue, :wait, :visibility_timeout, :free_processors,
13
- :scheduled, :executing, :polling
13
+ :executing, :waiting_messages
14
14
 
15
- def initialize(queue, client)
15
+ def initialize(queue, client, count)
16
16
  debug "Initializing Fetcher for queue #{queue}..."
17
17
  @queue = Toiler::Aws::Queue.new queue, client
18
- @wait = Toiler.options[:wait] || 20
19
- @free_processors = Concurrent::AtomicFixnum.new(0)
18
+ @wait = Toiler.options[:wait] || 60
19
+ @free_processors = count
20
20
  @batch = Toiler.worker_class_registry[queue].batch?
21
21
  @visibility_timeout = @queue.visibility_timeout
22
- @scheduled = Concurrent::AtomicBoolean.new
23
- @executing = Concurrent::AtomicBoolean.new
24
- @polling = Concurrent::AtomicBoolean.new
22
+ @executing = false
23
+ @waiting_messages = 0
25
24
  debug "Finished initializing Fetcher for queue #{queue}"
25
+ tell :poll_messages
26
26
  end
27
27
 
28
28
  def default_executor
29
- Concurrent.global_io_executor
29
+ Concurrent.global_fast_executor
30
30
  end
31
31
 
32
32
  def on_message(msg)
33
- executing.make_true
33
+ @executing = true
34
34
  method, *args = msg
35
35
  send(method, *args)
36
36
  rescue StandardError => e
37
37
  error "Fetcher #{queue.name} raised exception #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
38
38
  ensure
39
- executing.make_false
39
+ @executing = false
40
40
  end
41
41
 
42
42
  def executing?
43
- executing.value
44
- end
45
-
46
- def polling?
47
- polling.value
48
- end
49
-
50
- def scheduled?
51
- scheduled.value
52
- end
53
-
54
- def get_free_processors
55
- free_processors.value
43
+ @executing
56
44
  end
57
45
 
58
46
  private
@@ -63,46 +51,39 @@ module Toiler
63
51
 
64
52
  def processor_finished
65
53
  debug "Fetcher #{queue.name} received processor finished signal..."
66
- free_processors.increment
67
- schedule_poll
54
+ @free_processors += 1
55
+ tell :poll_messages
68
56
  end
69
57
 
70
58
  def max_messages
71
- batch? ? FETCH_LIMIT : [FETCH_LIMIT, free_processors.value].min
59
+ batch? ? FETCH_LIMIT : [FETCH_LIMIT, free_processors].min
72
60
  end
73
61
 
74
- def poll_future
62
+ def poll_future(max_number_of_messages)
75
63
  Concurrent::Promises.future do
76
- queue.receive_messages message_attribute_names: %w(All),
64
+ queue.receive_messages message_attribute_names: %w[All],
77
65
  wait_time_seconds: wait,
78
- max_number_of_messages: max_messages
66
+ max_number_of_messages: max_number_of_messages
79
67
  end
80
68
  end
81
69
 
82
70
  def poll_messages
83
- return unless polling.make_true
84
- poll_future.on_rejection! do
85
- polling.make_false
86
- scheduled.make_false
87
- tell :schedule_poll
71
+ return unless free_processors / 2 > waiting_messages
72
+
73
+ max_number_of_messages = max_messages
74
+ @waiting_messages += max_number_of_messages
75
+
76
+ debug "Fetcher #{queue.name} polling messages..."
77
+ future = poll_future max_number_of_messages
78
+ future.on_rejection! do
79
+ tell :poll_messages
88
80
  end
89
- poll_future.on_fulfillment! do |msgs|
90
- polling.make_false
91
- scheduled.make_false
92
- if !msgs.nil? && !msgs.empty?
93
- tell [:assign_messages, msgs]
94
- else
95
- tell :schedule_poll
96
- end
81
+ future.on_fulfillment! do |msgs|
82
+ tell [:assign_messages, msgs] if !msgs.nil? && !msgs.empty?
83
+ tell :poll_messages
97
84
  end
98
85
  end
99
86
 
100
- def schedule_poll
101
- return unless free_processors.value > 0 && scheduled.make_true
102
- debug "Fetcher #{queue.name} scheduling polling..."
103
- tell :poll_messages
104
- end
105
-
106
87
  def processor_pool
107
88
  @processor_pool ||= Toiler.processor_pool queue.name
108
89
  end
@@ -111,10 +92,9 @@ module Toiler
111
92
  messages = [messages] if batch?
112
93
  messages.each do |m|
113
94
  processor_pool.tell [:process, visibility_timeout, m]
114
- free_processors.decrement
95
+ @free_processors -= 1
115
96
  end
116
97
  debug "Fetcher #{queue.name} assigned #{messages.count} messages"
117
- tell :schedule_poll
118
98
  end
119
99
  end
120
100
  end
@@ -17,7 +17,6 @@ module Toiler
17
17
  @executing = Concurrent::AtomicBoolean.new
18
18
  @thread = nil
19
19
  init_options
20
- processor_finished
21
20
  end
22
21
 
23
22
  def default_executor
@@ -89,7 +88,8 @@ module Toiler
89
88
 
90
89
  def visibility_extender(queue_visibility, sqs_msg, body)
91
90
  return unless auto_visibility_timeout?
92
- interval = [1,queue_visibility/3].max
91
+
92
+ interval = [1, queue_visibility / 3].max
93
93
  Concurrent::TimerTask.execute execution_interval: interval,
94
94
  timeout_interval: interval do
95
95
  begin
@@ -116,7 +116,7 @@ module Toiler
116
116
  when :text, nil then sqs_msg.body
117
117
  else body_parser.load sqs_msg.body
118
118
  end
119
- rescue => e
119
+ rescue StandardError => e
120
120
  raise "Error parsing the message body: #{e.message}"
121
121
  end
122
122
  end
@@ -11,8 +11,8 @@ module Toiler
11
11
 
12
12
  def initialize
13
13
  @client = ::Aws::SQS::Client.new
14
- spawn_fetchers
15
14
  spawn_processors
15
+ spawn_fetchers
16
16
  end
17
17
 
18
18
  def on_message(_msg)
@@ -20,10 +20,12 @@ module Toiler
20
20
  end
21
21
 
22
22
  def spawn_fetchers
23
- Toiler.active_worker_class_registry.each do |queue, _klass|
23
+ Toiler.active_worker_class_registry.each do |queue, klass|
24
+ count = klass.concurrency
24
25
  begin
25
26
  fetcher = Actor::Fetcher.spawn! name: "fetcher_#{queue}".to_sym,
26
- supervise: true, args: [queue, client]
27
+ supervise: true,
28
+ args: [queue, client, count]
27
29
  Toiler.set_fetcher queue, fetcher
28
30
  rescue StandardError => e
29
31
  error "Failed to start Fetcher for queue #{queue}: #{e.message}\n#{e.backtrace.join("\n")}"
@@ -37,8 +39,9 @@ module Toiler
37
39
  count = klass.concurrency
38
40
  begin
39
41
  pool = Concurrent::Actor::Utils::Pool.spawn! name, count do |index|
40
- Actor::Processor.spawn name: "processor_#{queue}_#{index}".to_sym,
41
- supervise: true, args: [queue]
42
+ Actor::Processor.spawn name: "processor_#{queue}_#{index}".to_sym,
43
+ supervise: true,
44
+ args: [queue]
42
45
  end
43
46
  Toiler.set_processor_pool queue, pool
44
47
  rescue StandardError => e
data/lib/toiler/cli.rb CHANGED
@@ -99,7 +99,7 @@ module Toiler
99
99
  processors = processor_pool.instance_variable_get(:@workers).collect{|w| w.send(:core).send(:context)}
100
100
  busy_processors = processors.count{|pr| pr.executing?}
101
101
  message = "Status for [queue:#{queue}]:"
102
- message += "\n[fetcher:#{fetcher.name}] [executing:#{fetcher.executing?}] [polling:#{fetcher.polling?}] [scheduled:#{fetcher.scheduled?}] [free_processors:#{fetcher.get_free_processors}]"
102
+ message += "\n[fetcher:#{fetcher.name}] [executing:#{fetcher.executing?}] [waiting_messages:#{fetcher.waiting_messages}] [free_processors:#{fetcher.free_processors}]"
103
103
  message += "\n[processor_pool:#{processor_pool.name}] [workers:#{processors.count}] [busy:#{busy_processors}]"
104
104
  processors.each do |processor|
105
105
  thread = processor.thread
@@ -1,4 +1,4 @@
1
1
  # Toiler Version
2
2
  module Toiler
3
- VERSION = '0.5.0'.freeze
3
+ VERSION = '0.5.1.pre1'.freeze
4
4
  end
@@ -14,9 +14,7 @@ RSpec.describe Toiler::Actor::Fetcher, type: :model do
14
14
  describe "#new" do
15
15
  it 'completes sucessfully' do
16
16
  fetcher = described_class.new(queue, client)
17
- expect(fetcher.polling?).to eq(false)
18
17
  expect(fetcher.executing?).to eq(false)
19
- expect(fetcher.scheduled?).to eq(false)
20
18
  end
21
19
  end
22
20
  end
data/toiler.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_development_dependency 'rspec'
21
21
 
22
- spec.add_dependency 'aws-sdk-sqs', '~> 1.0', '>= 1.0.0'
22
+ spec.add_dependency 'aws-sdk-sqs', '>= 1.0.0', '< 2.0.0'
23
23
  spec.add_dependency 'concurrent-ruby', '~> 1.0', '>= 1.0.0'
24
24
  spec.add_dependency 'concurrent-ruby-edge', '~> 0.3', '>= 0.3'
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Schepens
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-24 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -28,22 +28,22 @@ dependencies:
28
28
  name: aws-sdk-sqs
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
31
  - - ">="
35
32
  - !ruby/object:Gem::Version
36
33
  version: 1.0.0
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 2.0.0
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '1.0'
44
41
  - - ">="
45
42
  - !ruby/object:Gem::Version
46
43
  version: 1.0.0
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 2.0.0
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: concurrent-ruby
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -136,9 +136,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - ">="
139
+ - - ">"
140
140
  - !ruby/object:Gem::Version
141
- version: '0'
141
+ version: 1.3.1
142
142
  requirements: []
143
143
  rubyforge_project:
144
144
  rubygems_version: 2.6.11