toiler 0.5.0 → 0.5.1.pre1

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