pebbles-river 0.1.1 → 0.1.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.
- data/lib/pebbles/river/daemon_helper.rb +30 -7
- data/lib/pebbles/river/river.rb +6 -4
- data/lib/pebbles/river/supervisor.rb +28 -13
- data/lib/pebbles/river/version.rb +1 -1
- data/lib/pebbles/river.rb +0 -2
- metadata +25 -6
- checksums.yaml +0 -15
- data/lib/pebbles/river/multi_prefork.rb +0 -49
@@ -11,10 +11,10 @@ module Pebbles
|
|
11
11
|
#
|
12
12
|
# * `name`: Name of the process. Optional, defaults to `$0`.
|
13
13
|
#
|
14
|
-
# * `configure_start_command(command)`. Implement to add more
|
15
|
-
# the start command, eg. configuration options. Optional.
|
14
|
+
# * `configure_start_command(command)`. Implement to add more
|
15
|
+
# options to the start command, eg. configuration options. Optional.
|
16
16
|
#
|
17
|
-
# * `on_start(options)`. Implement to inject code before the program
|
17
|
+
# * `on_start(options, helper)`. Implement to inject code before the program
|
18
18
|
# starts. Options are the start options, a hash. Optional.
|
19
19
|
#
|
20
20
|
# * `configure_supervisor(supervisor)`. This must call `add_listener` on the
|
@@ -22,6 +22,12 @@ module Pebbles
|
|
22
22
|
#
|
23
23
|
class DaemonHelper
|
24
24
|
|
25
|
+
attr_accessor :logger
|
26
|
+
|
27
|
+
def self.run(adapter, options = {})
|
28
|
+
new(adapter, options).run
|
29
|
+
end
|
30
|
+
|
25
31
|
def initialize(adapter, options = {})
|
26
32
|
@adapter = adapter
|
27
33
|
|
@@ -41,7 +47,9 @@ module Pebbles
|
|
41
47
|
c.option :pidfile, '-p', '--pidfile PIDFILE', 'Path to pid file.'
|
42
48
|
c.option :workers, Integer, '-w', '--workers N', 'Set number of workers per queue (defaults to 1).'
|
43
49
|
c.action do |_, options|
|
44
|
-
|
50
|
+
handle_exceptions do
|
51
|
+
start(options)
|
52
|
+
end
|
45
53
|
end
|
46
54
|
if @adapter.respond_to?(:configure_start_command)
|
47
55
|
@adapter.configure_start_command(c)
|
@@ -52,7 +60,9 @@ module Pebbles
|
|
52
60
|
c.description 'Stops daemon'
|
53
61
|
c.option :pidfile, '-p', '--pidfile PIDFILE', 'Path to pid file.'
|
54
62
|
c.action do |_, options|
|
55
|
-
|
63
|
+
handle_exceptions do
|
64
|
+
stop(options)
|
65
|
+
end
|
56
66
|
end
|
57
67
|
end
|
58
68
|
p.command(:status) do |c|
|
@@ -60,7 +70,9 @@ module Pebbles
|
|
60
70
|
c.description 'Prints daemon status'
|
61
71
|
c.option :pidfile, '-p', '--pidfile PIDFILE', 'Path to pid file.'
|
62
72
|
c.action do |_, options|
|
63
|
-
|
73
|
+
handle_exceptions do
|
74
|
+
status(options)
|
75
|
+
end
|
64
76
|
end
|
65
77
|
end
|
66
78
|
end
|
@@ -76,7 +88,7 @@ module Pebbles
|
|
76
88
|
|
77
89
|
def start(options)
|
78
90
|
if @adapter.respond_to?(:on_start)
|
79
|
-
@adapter.on_start(options)
|
91
|
+
@adapter.on_start(options, self)
|
80
92
|
end
|
81
93
|
|
82
94
|
daemon = new_daemon(options)
|
@@ -146,6 +158,17 @@ module Pebbles
|
|
146
158
|
nochdir: true)
|
147
159
|
end
|
148
160
|
|
161
|
+
def handle_exceptions(&block)
|
162
|
+
yield
|
163
|
+
rescue => e
|
164
|
+
if @logger.respond_to?(:exception)
|
165
|
+
@logger.exception(e)
|
166
|
+
end
|
167
|
+
$stderr.puts "Error: #{e.class}: #{e}"
|
168
|
+
$stderr.puts e.backtrace.map { |s| "\t#{s}\n" }.join
|
169
|
+
exit(1)
|
170
|
+
end
|
171
|
+
|
149
172
|
end
|
150
173
|
|
151
174
|
end
|
data/lib/pebbles/river/river.rb
CHANGED
@@ -22,12 +22,14 @@ module Pebbles
|
|
22
22
|
def connect
|
23
23
|
unless @session
|
24
24
|
handle_session_error do
|
25
|
-
|
26
|
-
|
25
|
+
session = Bunny::Session.new
|
26
|
+
session.start
|
27
27
|
|
28
|
-
|
28
|
+
channel = session.create_channel
|
29
29
|
|
30
|
-
|
30
|
+
exchange = channel.exchange(exchange_name, EXCHANGE_OPTIONS.dup)
|
31
|
+
|
32
|
+
@session, @channel, @exchange = session, channel, exchange
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -12,17 +12,22 @@ module Pebbles
|
|
12
12
|
|
13
13
|
@worker_count = options[:worker_count] || 1
|
14
14
|
|
15
|
-
@
|
15
|
+
@prefork_pools = []
|
16
|
+
|
17
|
+
@worker_modules = []
|
16
18
|
end
|
17
19
|
|
18
20
|
def start_workers
|
19
|
-
if @
|
21
|
+
if @worker_modules.empty?
|
20
22
|
raise ConfigurationError.new("No listeners configured")
|
21
23
|
end
|
22
24
|
|
23
|
-
@
|
24
|
-
|
25
|
-
|
25
|
+
@worker_modules.each do |m|
|
26
|
+
@prefork_pools.push(
|
27
|
+
Servolux::Prefork.new(
|
28
|
+
min_workers: @worker_count,
|
29
|
+
module: m))
|
30
|
+
end
|
26
31
|
end
|
27
32
|
|
28
33
|
def add_listener(listener, queue_spec)
|
@@ -39,10 +44,16 @@ module Pebbles
|
|
39
44
|
process_name = "#{@name}: queue worker: #{queue_spec[:name]}"
|
40
45
|
logger = @logger
|
41
46
|
|
42
|
-
@
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
@worker_modules.push(Module.new {
|
48
|
+
define_method :execute do
|
49
|
+
$0 = process_name
|
50
|
+
trap('TERM') do
|
51
|
+
logger.info "Worker received TERM"
|
52
|
+
worker.stop
|
53
|
+
exit(0)
|
54
|
+
end
|
55
|
+
worker.run
|
56
|
+
end
|
46
57
|
})
|
47
58
|
end
|
48
59
|
|
@@ -51,7 +62,9 @@ module Pebbles
|
|
51
62
|
$0 = "#{name}: master"
|
52
63
|
|
53
64
|
logger.info "Starting workers"
|
54
|
-
@prefork
|
65
|
+
@prefork_pools.each do |prefork|
|
66
|
+
prefork.start(1)
|
67
|
+
end
|
55
68
|
end
|
56
69
|
|
57
70
|
# From Servolux::Server
|
@@ -66,7 +79,9 @@ module Pebbles
|
|
66
79
|
|
67
80
|
# From Servolux::Server
|
68
81
|
def run
|
69
|
-
@prefork
|
82
|
+
@prefork_pools.each do |prefork|
|
83
|
+
prefork.ensure_worker_pool_size
|
84
|
+
end
|
70
85
|
rescue => e
|
71
86
|
if logger.respond_to? :exception
|
72
87
|
logger.exception(e)
|
@@ -80,9 +95,9 @@ module Pebbles
|
|
80
95
|
|
81
96
|
def shutdown_workers
|
82
97
|
logger.info "Shutting down all workers"
|
83
|
-
@
|
98
|
+
@prefork_pools.each(&:stop)
|
84
99
|
loop do
|
85
|
-
break if @prefork.live_worker_count <= 0
|
100
|
+
break if @prefork_pools.all? { |prefork| prefork.live_worker_count <= 0 }
|
86
101
|
logger.info "Waiting for workers to quit"
|
87
102
|
sleep 0.25
|
88
103
|
end
|
data/lib/pebbles/river.rb
CHANGED
@@ -8,7 +8,6 @@ require 'servolux'
|
|
8
8
|
require_relative "river/version"
|
9
9
|
require_relative "river/errors"
|
10
10
|
require_relative "river/message"
|
11
|
-
require_relative "river/multi_prefork"
|
12
11
|
require_relative "river/worker"
|
13
12
|
require_relative "river/subscription"
|
14
13
|
require_relative "river/supervisor"
|
@@ -16,5 +15,4 @@ require_relative "river/routing"
|
|
16
15
|
require_relative "river/river"
|
17
16
|
require_relative "river/compatibility"
|
18
17
|
require_relative "river/rate_limiter"
|
19
|
-
require_relative "river/multi_prefork"
|
20
18
|
require_relative "river/daemon_helper"
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pebbles-river
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Alexander Staubo
|
@@ -9,11 +10,12 @@ authors:
|
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2014-
|
13
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: pebblebed
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
17
19
|
requirements:
|
18
20
|
- - ! '>='
|
19
21
|
- !ruby/object:Gem::Version
|
@@ -21,6 +23,7 @@ dependencies:
|
|
21
23
|
type: :runtime
|
22
24
|
prerelease: false
|
23
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
24
27
|
requirements:
|
25
28
|
- - ! '>='
|
26
29
|
- !ruby/object:Gem::Version
|
@@ -28,6 +31,7 @@ dependencies:
|
|
28
31
|
- !ruby/object:Gem::Dependency
|
29
32
|
name: bunny
|
30
33
|
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
31
35
|
requirements:
|
32
36
|
- - ~>
|
33
37
|
- !ruby/object:Gem::Version
|
@@ -35,6 +39,7 @@ dependencies:
|
|
35
39
|
type: :runtime
|
36
40
|
prerelease: false
|
37
41
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
38
43
|
requirements:
|
39
44
|
- - ~>
|
40
45
|
- !ruby/object:Gem::Version
|
@@ -42,6 +47,7 @@ dependencies:
|
|
42
47
|
- !ruby/object:Gem::Dependency
|
43
48
|
name: activesupport
|
44
49
|
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
45
51
|
requirements:
|
46
52
|
- - ! '>='
|
47
53
|
- !ruby/object:Gem::Version
|
@@ -49,6 +55,7 @@ dependencies:
|
|
49
55
|
type: :runtime
|
50
56
|
prerelease: false
|
51
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
52
59
|
requirements:
|
53
60
|
- - ! '>='
|
54
61
|
- !ruby/object:Gem::Version
|
@@ -56,6 +63,7 @@ dependencies:
|
|
56
63
|
- !ruby/object:Gem::Dependency
|
57
64
|
name: servolux
|
58
65
|
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
59
67
|
requirements:
|
60
68
|
- - ~>
|
61
69
|
- !ruby/object:Gem::Version
|
@@ -63,6 +71,7 @@ dependencies:
|
|
63
71
|
type: :runtime
|
64
72
|
prerelease: false
|
65
73
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
66
75
|
requirements:
|
67
76
|
- - ~>
|
68
77
|
- !ruby/object:Gem::Version
|
@@ -70,6 +79,7 @@ dependencies:
|
|
70
79
|
- !ruby/object:Gem::Dependency
|
71
80
|
name: mercenary
|
72
81
|
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
73
83
|
requirements:
|
74
84
|
- - ~>
|
75
85
|
- !ruby/object:Gem::Version
|
@@ -77,6 +87,7 @@ dependencies:
|
|
77
87
|
type: :runtime
|
78
88
|
prerelease: false
|
79
89
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
80
91
|
requirements:
|
81
92
|
- - ~>
|
82
93
|
- !ruby/object:Gem::Version
|
@@ -84,6 +95,7 @@ dependencies:
|
|
84
95
|
- !ruby/object:Gem::Dependency
|
85
96
|
name: rspec
|
86
97
|
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
87
99
|
requirements:
|
88
100
|
- - ~>
|
89
101
|
- !ruby/object:Gem::Version
|
@@ -91,6 +103,7 @@ dependencies:
|
|
91
103
|
type: :development
|
92
104
|
prerelease: false
|
93
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
94
107
|
requirements:
|
95
108
|
- - ~>
|
96
109
|
- !ruby/object:Gem::Version
|
@@ -98,6 +111,7 @@ dependencies:
|
|
98
111
|
- !ruby/object:Gem::Dependency
|
99
112
|
name: bundler
|
100
113
|
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
101
115
|
requirements:
|
102
116
|
- - ~>
|
103
117
|
- !ruby/object:Gem::Version
|
@@ -105,6 +119,7 @@ dependencies:
|
|
105
119
|
type: :development
|
106
120
|
prerelease: false
|
107
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
108
123
|
requirements:
|
109
124
|
- - ~>
|
110
125
|
- !ruby/object:Gem::Version
|
@@ -112,6 +127,7 @@ dependencies:
|
|
112
127
|
- !ruby/object:Gem::Dependency
|
113
128
|
name: rake
|
114
129
|
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
115
131
|
requirements:
|
116
132
|
- - ! '>='
|
117
133
|
- !ruby/object:Gem::Version
|
@@ -119,6 +135,7 @@ dependencies:
|
|
119
135
|
type: :development
|
120
136
|
prerelease: false
|
121
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
122
139
|
requirements:
|
123
140
|
- - ! '>='
|
124
141
|
- !ruby/object:Gem::Version
|
@@ -126,6 +143,7 @@ dependencies:
|
|
126
143
|
- !ruby/object:Gem::Dependency
|
127
144
|
name: simplecov
|
128
145
|
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
129
147
|
requirements:
|
130
148
|
- - ! '>='
|
131
149
|
- !ruby/object:Gem::Version
|
@@ -133,6 +151,7 @@ dependencies:
|
|
133
151
|
type: :development
|
134
152
|
prerelease: false
|
135
153
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
136
155
|
requirements:
|
137
156
|
- - ! '>='
|
138
157
|
- !ruby/object:Gem::Version
|
@@ -154,7 +173,6 @@ files:
|
|
154
173
|
- lib/pebbles/river/daemon_helper.rb
|
155
174
|
- lib/pebbles/river/errors.rb
|
156
175
|
- lib/pebbles/river/message.rb
|
157
|
-
- lib/pebbles/river/multi_prefork.rb
|
158
176
|
- lib/pebbles/river/rate_limiter.rb
|
159
177
|
- lib/pebbles/river/river.rb
|
160
178
|
- lib/pebbles/river/routing.rb
|
@@ -171,26 +189,27 @@ files:
|
|
171
189
|
homepage: ''
|
172
190
|
licenses:
|
173
191
|
- MIT
|
174
|
-
metadata: {}
|
175
192
|
post_install_message:
|
176
193
|
rdoc_options: []
|
177
194
|
require_paths:
|
178
195
|
- lib
|
179
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
197
|
+
none: false
|
180
198
|
requirements:
|
181
199
|
- - ! '>='
|
182
200
|
- !ruby/object:Gem::Version
|
183
201
|
version: '0'
|
184
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
185
204
|
requirements:
|
186
205
|
- - ! '>='
|
187
206
|
- !ruby/object:Gem::Version
|
188
207
|
version: '0'
|
189
208
|
requirements: []
|
190
209
|
rubyforge_project:
|
191
|
-
rubygems_version:
|
210
|
+
rubygems_version: 1.8.23.2
|
192
211
|
signing_key:
|
193
|
-
specification_version:
|
212
|
+
specification_version: 3
|
194
213
|
summary: Implements an event river mechanism for Pebblebed.
|
195
214
|
test_files:
|
196
215
|
- spec/lib/river_spec.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
YzUyMjRmYmNiMDMxODU5NTYwMjYxZjg1ZWE1ZmJkZDg2ZWE5NzY0Zg==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDc2ZjlmNzFkMWUxYWQ5NTk3NzkwZmNjMDQ1NGYwN2FmY2UwYjJlNg==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MzBjMDMzY2VhOTMwMDIzMjM4NTY5MGRjNzJkYzM0NTM2MGVmZGM5ZmZkNzUw
|
10
|
-
NTdjOWEzMWI1NDUyNjc0MzI2OWVhMjIxNTdmYTEzNmY4YmM5NTg4NzAzYzUw
|
11
|
-
ZTMyNjFiNjYxMTgxYWQxY2UzNTI5NjkyYjMzYjhmMDE4MTRkZDM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YzRjMWUyZmFmMWQxNDA4NWMzNDE5MTYxYTQ1NzJjYjJmZjk5Zjc1MTIxYjNl
|
14
|
-
YjZmNTQ3ZDJjYTc4NmRkODZjNTdkM2I5ZTk5YjdhNTk3MzA5MzMxYTZmOWNi
|
15
|
-
NzhiZTBjNDIwMmVhZDgxODMyY2M4OGU1MGRjYzE4YmI2OWFlYzk=
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Pebbles
|
2
|
-
module River
|
3
|
-
|
4
|
-
# Overrides preforker to instantiate a round-robin set of modules. The
|
5
|
-
# desired worker count is multiplied by the number of modules; for example,
|
6
|
-
# if specifying modules [A, B] and the worker count is 2, then 4 actual
|
7
|
-
# processes will be forked.
|
8
|
-
class MultiPrefork < ::Servolux::Prefork
|
9
|
-
|
10
|
-
def initialize(options, &block)
|
11
|
-
raise ArgumentError, "Block invocation not supported" if block
|
12
|
-
raise ArgumentError, "Must pass :modules, not :module" if options[:module]
|
13
|
-
|
14
|
-
# Like Prefork we support passing procs
|
15
|
-
@modules = options[:modules].map { |m|
|
16
|
-
if m.is_a?(Proc)
|
17
|
-
Module.new { define_method :execute, &m }
|
18
|
-
else
|
19
|
-
m
|
20
|
-
end
|
21
|
-
}
|
22
|
-
@index = 0
|
23
|
-
|
24
|
-
options = {}.merge(options)
|
25
|
-
options[:module] = @modules.first
|
26
|
-
options.delete(:modules)
|
27
|
-
if (min_workers = options[:min_workers])
|
28
|
-
options[:min_workers] = min_workers * @modules.length
|
29
|
-
end
|
30
|
-
if (max_workers = options[:max_workers])
|
31
|
-
options[:max_workers] = max_workers * @modules.length
|
32
|
-
end
|
33
|
-
|
34
|
-
super(options)
|
35
|
-
end
|
36
|
-
|
37
|
-
# This cheats by overriding `Prefork#add_workers` and replacing the
|
38
|
-
# `@module instance` variable.
|
39
|
-
def add_workers(number = 1)
|
40
|
-
number.times do
|
41
|
-
@module = @modules[@index]
|
42
|
-
super(1)
|
43
|
-
@index = (@index + 1) % @modules.length
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|