asir 1.2.2 → 1.2.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/ChangeLog +9 -0
- data/lib/asir/main.rb +26 -9
- data/lib/asir/transport.rb +22 -10
- data/lib/asir/transport/conduit.rb +2 -2
- data/lib/asir/transport/file.rb +18 -17
- data/lib/asir/transport/payload_io.rb +7 -2
- data/lib/asir/version.rb +1 -1
- metadata +110 -103
data/ChangeLog
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
2013-01-16 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
|
+
|
3
|
+
* v1.2.3: New Version: Bug fixes.
|
4
|
+
* bin/asir: asir start * worker will check for existing processes, use force=true to forcefully start.
|
5
|
+
* bin/asir: Fixed after_receive_message callback.
|
6
|
+
* Transport: _after_invoke_message.
|
7
|
+
* Transport: Use with_force_stop! during blocked I/O.
|
8
|
+
* Conduit: ::File not Transport::File.
|
9
|
+
|
1
10
|
2012-12-31 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
11
|
|
3
12
|
* v1.2.2: New Version: JRuby support.
|
data/lib/asir/main.rb
CHANGED
@@ -119,12 +119,10 @@ class Main
|
|
119
119
|
when /^taillog_([^_]+)_([^_]+)!$/
|
120
120
|
exec "tail -f #{log_file.inspect}"
|
121
121
|
when /^pid_([^_]+)_([^_]+)!$/
|
122
|
-
pid =
|
123
|
-
alive = process_running? pid
|
122
|
+
pid = _alive?
|
124
123
|
puts "#{pid_file} #{pid || :NA} #{alive}"
|
125
124
|
when /^alive_([^_]+)_([^_]+)!$/
|
126
|
-
pid =
|
127
|
-
alive = process_running? pid
|
125
|
+
pid = _alive?
|
128
126
|
puts "#{pid_file} #{pid || :NA} #{alive}" if @verbose
|
129
127
|
self.exit_code += 1 unless alive
|
130
128
|
when /^stop_([^_]+)_([^_]+)!$/
|
@@ -134,6 +132,11 @@ class Main
|
|
134
132
|
end
|
135
133
|
end
|
136
134
|
|
135
|
+
def _alive?
|
136
|
+
pid = server_pid rescue nil
|
137
|
+
process_running? pid
|
138
|
+
end
|
139
|
+
|
137
140
|
def usage!
|
138
141
|
$stderr.puts <<"END"
|
139
142
|
SYNOPSIS:
|
@@ -189,7 +192,12 @@ END
|
|
189
192
|
_start_conduit!
|
190
193
|
end
|
191
194
|
|
192
|
-
def _start_conduit!
|
195
|
+
def _start_conduit! type = adjective
|
196
|
+
if (pid = _alive?) && ! force
|
197
|
+
log "already-running pid #{pid}", :stderr
|
198
|
+
return
|
199
|
+
end
|
200
|
+
log "start_conduit! #{type}"
|
193
201
|
config!(:environment)
|
194
202
|
self.transport = config!(:transport)
|
195
203
|
fork_server! do
|
@@ -198,6 +206,10 @@ END
|
|
198
206
|
end
|
199
207
|
|
200
208
|
def _start_worker! type = adjective
|
209
|
+
if (pid = _alive?) && ! force
|
210
|
+
log "already-running pid #{pid}", :stderr
|
211
|
+
return
|
212
|
+
end
|
201
213
|
log "start_worker! #{type}"
|
202
214
|
type = type.to_s
|
203
215
|
config!(:environment)
|
@@ -235,13 +247,18 @@ END
|
|
235
247
|
|
236
248
|
def run_server! cmd = nil
|
237
249
|
lf = File.open(log_file, "a+")
|
250
|
+
lf.sync = true
|
238
251
|
File.chmod(0666, log_file) rescue nil
|
239
252
|
$stdin.close rescue nil
|
240
253
|
STDIN.close rescue nil
|
241
254
|
STDOUT.reopen(lf)
|
255
|
+
STDOUT.sync = true
|
242
256
|
$stdout.reopen(lf) if $stdout.object_id != STDOUT.object_id
|
257
|
+
$stdout.sync = true
|
243
258
|
STDERR.reopen(lf)
|
259
|
+
STDERR.sync = true
|
244
260
|
$stderr.reopen(lf) if $stderr.object_id != STDERR.object_id
|
261
|
+
$stderr.sync = true
|
245
262
|
# Process.daemon rescue nil # Ruby 1.9.x only.
|
246
263
|
lf.puts "#{log_str} starting pid #{$$}"
|
247
264
|
begin
|
@@ -326,8 +343,9 @@ END
|
|
326
343
|
config!(:start)
|
327
344
|
$0 += " #{wid} #{transport.uri rescue nil}"
|
328
345
|
old_arg0 = $0.dup
|
329
|
-
after_receive_message = transport.after_receive_message || lambda { | transport,
|
330
|
-
transport.after_receive_message = lambda do | transport,
|
346
|
+
after_receive_message = transport.after_receive_message || lambda { | transport, state | nil }
|
347
|
+
transport.after_receive_message = lambda do | transport, state |
|
348
|
+
message = state.message
|
331
349
|
$0 = "#{old_arg0} #{transport.message_count} #{message.identifier}"
|
332
350
|
after_receive_message.call(transport, message)
|
333
351
|
end
|
@@ -371,13 +389,12 @@ END
|
|
371
389
|
def process_running? pid
|
372
390
|
case pid
|
373
391
|
when false, nil
|
374
|
-
pid
|
375
392
|
when Integer
|
376
393
|
Process.kill(0, pid)
|
377
394
|
else
|
378
395
|
raise TypeError, "expected false, nil, Integer; given #{pid.inspect}"
|
379
396
|
end
|
380
|
-
|
397
|
+
pid
|
381
398
|
rescue ::Errno::ESRCH
|
382
399
|
false
|
383
400
|
rescue ::Exception => exc
|
data/lib/asir/transport.rb
CHANGED
@@ -104,19 +104,19 @@ module ASIR
|
|
104
104
|
attr_accessor :message_count
|
105
105
|
|
106
106
|
# A Proc to call within #receive_message, after #_receive_message.
|
107
|
-
# trans.after_receive_message(trans,
|
107
|
+
# trans.after_receive_message(trans, state)
|
108
108
|
attr_accessor :after_receive_message
|
109
109
|
|
110
110
|
# A Proc to call within #send_message, before #_send_message.
|
111
|
-
# trans.before_send_message(trans,
|
111
|
+
# trans.before_send_message(trans, state)
|
112
112
|
attr_accessor :before_send_message
|
113
113
|
|
114
|
-
# Proc to call with #invoke_message! if result.exception.
|
115
|
-
# trans.on_result_exception.call(trans,
|
114
|
+
# Proc to call with #invoke_message! if state.result.exception.
|
115
|
+
# trans.on_result_exception.call(trans, state)
|
116
116
|
attr_accessor :on_result_exception
|
117
117
|
|
118
118
|
# Proc to call after #invoke_message!
|
119
|
-
# trans.after_invoke_message.call(trans,
|
119
|
+
# trans.after_invoke_message.call(trans, state)
|
120
120
|
attr_accessor :after_invoke_message
|
121
121
|
|
122
122
|
# Proc to call with exception, if exception occurs within #serve_message!, but outside
|
@@ -150,9 +150,6 @@ module ASIR
|
|
150
150
|
message_ok = true
|
151
151
|
invoke_message!(state)
|
152
152
|
result_ok = true
|
153
|
-
if @after_invoke_message
|
154
|
-
@after_invoke_message.call(self, state)
|
155
|
-
end
|
156
153
|
self
|
157
154
|
else
|
158
155
|
nil
|
@@ -161,7 +158,7 @@ module ASIR
|
|
161
158
|
raise
|
162
159
|
rescue ::Exception => exc
|
163
160
|
exception = original_exception = exc
|
164
|
-
_log [ :message_error, exc ]
|
161
|
+
_log [ :message_error, exc, exc.backtrace ]
|
165
162
|
@on_exception.call(self, exc, :message, state) if @on_exception
|
166
163
|
ensure
|
167
164
|
begin
|
@@ -195,10 +192,18 @@ module ASIR
|
|
195
192
|
def stop! force = false
|
196
193
|
@running = false
|
197
194
|
stop_server! if respond_to?(:stop_server!)
|
198
|
-
raise Error::Terminate if force
|
195
|
+
raise Error::Terminate if force || @force_stop
|
199
196
|
self
|
200
197
|
end
|
201
198
|
|
199
|
+
def with_force_stop!
|
200
|
+
force_stop_save = @force_stop
|
201
|
+
@force_stop = true
|
202
|
+
yield
|
203
|
+
ensure
|
204
|
+
@force_stop = force_stop_save
|
205
|
+
end
|
206
|
+
|
202
207
|
def with_server_signals!
|
203
208
|
old_trap = { }
|
204
209
|
[ "TERM", "HUP" ].each do | sig |
|
@@ -248,9 +253,16 @@ module ASIR
|
|
248
253
|
end
|
249
254
|
end
|
250
255
|
end
|
256
|
+
_after_invoke_message state
|
257
|
+
if @after_invoke_message
|
258
|
+
@after_invoke_message.call(self, state)
|
259
|
+
end
|
251
260
|
self
|
252
261
|
end
|
253
262
|
|
263
|
+
def _after_invoke_message state
|
264
|
+
end
|
265
|
+
|
254
266
|
# The current Message::State.
|
255
267
|
attr_accessor_thread :message_state
|
256
268
|
# The current Message being invoked. DEPRECATED.
|
@@ -21,7 +21,7 @@ module Asir
|
|
21
21
|
end
|
22
22
|
_log { "start_conduit! #{self} started pid=#{@conduit_pid.inspect}" } if @verbose >= 2
|
23
23
|
if pid_file = (@conduit_options || EMPTY_HASH)[:pid_file]
|
24
|
-
File.open(pid_file, "w") { | fh | fh.puts @conduit_pid }
|
24
|
+
::File.open(pid_file, "w") { | fh | fh.puts @conduit_pid }
|
25
25
|
end
|
26
26
|
else
|
27
27
|
_start_conduit!
|
@@ -31,7 +31,7 @@ module Asir
|
|
31
31
|
|
32
32
|
def conduit_pid
|
33
33
|
if ! @conduit_pid and pid_file = (@conduit_options || EMPTY_HASH)[:pid_file]
|
34
|
-
@conduit_pid = (File.read(pid_file).to_i rescue nil)
|
34
|
+
@conduit_pid = (::File.read(pid_file).to_i rescue nil)
|
35
35
|
end
|
36
36
|
@conduit_pid
|
37
37
|
end
|
data/lib/asir/transport/file.rb
CHANGED
@@ -18,22 +18,21 @@ module ASIR
|
|
18
18
|
|
19
19
|
# If not one_way, create a result_file fifo.
|
20
20
|
def send_message message
|
21
|
+
result_file_created = false
|
21
22
|
unless one_way || message.one_way
|
22
|
-
result_file =
|
23
|
-
message[:result_file] ||=
|
24
|
-
self.result_file ||
|
23
|
+
result_file = message[:result_file] ||= self.result_file ||
|
25
24
|
begin
|
26
25
|
message.create_identifier!
|
27
26
|
"#{self.file}-result-#{message.identifier}"
|
28
27
|
end
|
29
28
|
unless ::File.exist?(result_file) and result_fifo
|
30
29
|
::ASIR::Fifo.mkfifo(result_file, perms)
|
31
|
-
|
30
|
+
result_file_created = true
|
32
31
|
end
|
33
32
|
end
|
34
33
|
super
|
35
34
|
ensure
|
36
|
-
if
|
35
|
+
if result_file_created
|
37
36
|
::File.unlink(result_file) rescue nil
|
38
37
|
end
|
39
38
|
end
|
@@ -50,24 +49,26 @@ module ASIR
|
|
50
49
|
|
51
50
|
# Send result to result_file.
|
52
51
|
def _send_result state
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
_write(state.result_payload, stream, state)
|
57
|
-
end
|
52
|
+
with_result_file state do | result_file |
|
53
|
+
::File.open(result_file, "a+") do | stream |
|
54
|
+
_write(state.result_payload, stream, state)
|
58
55
|
end
|
59
56
|
end
|
60
57
|
end
|
61
58
|
|
62
59
|
# Receive result from result_file.
|
63
60
|
def _receive_result state
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
61
|
+
with_result_file state do | result_file |
|
62
|
+
::File.open(result_file, "r") do | stream |
|
63
|
+
state.result_payload = _read(stream, state)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def with_result_file state
|
69
|
+
unless one_way || (message = state.message).one_way
|
70
|
+
if result_file = message[:result_file] || self.result_file
|
71
|
+
yield result_file
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
@@ -31,8 +31,13 @@ module ASIR
|
|
31
31
|
payload
|
32
32
|
end
|
33
33
|
|
34
|
-
def _read_line_and_expect! stream, regexp
|
35
|
-
|
34
|
+
def _read_line_and_expect! stream, regexp, consume = nil
|
35
|
+
ok = false
|
36
|
+
until ok
|
37
|
+
line = stream.readline
|
38
|
+
_log { "_read_line_and_expect! #{stream} #{line.inspect}" }
|
39
|
+
ok = consume && consume.match(line) ? false : true
|
40
|
+
end
|
36
41
|
unless match = regexp.match(line)
|
37
42
|
_log { "_read_line_and_expect! #{stream} #{regexp.inspect} !~ #{line.inspect}" }
|
38
43
|
raise UnexpectedResponse, "expected #{regexp.inspect}, received #{line.inspect}"
|
data/lib/asir/version.rb
CHANGED
metadata
CHANGED
@@ -1,114 +1,120 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: asir
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 2
|
8
|
-
- 2
|
9
|
-
version: 1.2.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.3
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Kurt Stephens
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
requirements:
|
12
|
+
date: 2013-01-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: uuid
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
24
19
|
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
segments:
|
27
|
-
- 2
|
28
|
-
- 3
|
29
|
-
- 6
|
20
|
+
- !ruby/object:Gem::Version
|
30
21
|
version: 2.3.6
|
31
|
-
name: uuid
|
32
|
-
requirement: *id001
|
33
|
-
prerelease: false
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
22
|
type: :runtime
|
36
|
-
|
37
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
38
27
|
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
|
41
|
-
|
42
|
-
- 3
|
43
|
-
- 0
|
44
|
-
version: 2.3.0
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.3.6
|
30
|
+
- !ruby/object:Gem::Dependency
|
45
31
|
name: httpclient
|
46
|
-
requirement:
|
47
|
-
|
48
|
-
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.3.0
|
49
38
|
type: :runtime
|
50
|
-
|
51
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
52
43
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
55
|
-
|
56
|
-
- 4
|
57
|
-
- 1
|
58
|
-
version: 1.4.1
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.3.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
59
47
|
name: rack
|
60
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.4.1
|
54
|
+
type: :runtime
|
61
55
|
prerelease: false
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
- 0
|
70
|
-
- 9
|
71
|
-
- 0
|
72
|
-
version: 0.9.0
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.4.1
|
62
|
+
- !ruby/object:Gem::Dependency
|
73
63
|
name: rake
|
74
|
-
requirement:
|
75
|
-
|
76
|
-
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.0
|
77
70
|
type: :development
|
78
|
-
|
79
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
80
83
|
- - ~>
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
segments:
|
83
|
-
- 2
|
84
|
-
- 12
|
85
|
-
- 0
|
84
|
+
- !ruby/object:Gem::Version
|
86
85
|
version: 2.12.0
|
87
|
-
name: rspec
|
88
|
-
requirement: *id005
|
89
|
-
prerelease: false
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
86
|
type: :development
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.12.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
100
95
|
name: simplecov
|
101
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0.1'
|
102
|
+
type: :development
|
102
103
|
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.1'
|
103
110
|
description: Abstracting Services in Ruby
|
104
111
|
email: ks.ruby@kurtstephens.com
|
105
|
-
executables:
|
112
|
+
executables:
|
106
113
|
- asir
|
107
114
|
extensions: []
|
108
|
-
|
109
|
-
extra_rdoc_files:
|
115
|
+
extra_rdoc_files:
|
110
116
|
- README.textile
|
111
|
-
files:
|
117
|
+
files:
|
112
118
|
- .gitignore
|
113
119
|
- .rspec
|
114
120
|
- .travis.yml
|
@@ -249,37 +255,38 @@ files:
|
|
249
255
|
- spec/uuid_spec.rb
|
250
256
|
- spec/yaml_spec.rb
|
251
257
|
- stylesheets/slides.css
|
252
|
-
has_rdoc: true
|
253
258
|
homepage: http://github.com/kstephens/abstracting_services_in_ruby
|
254
259
|
licenses: []
|
255
|
-
|
256
260
|
post_install_message:
|
257
|
-
rdoc_options:
|
261
|
+
rdoc_options:
|
258
262
|
- --charset=UTF-8
|
259
|
-
require_paths:
|
263
|
+
require_paths:
|
260
264
|
- lib
|
261
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
265
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
266
|
+
none: false
|
267
|
+
requirements:
|
268
|
+
- - ! '>='
|
269
|
+
- !ruby/object:Gem::Version
|
270
|
+
version: '0'
|
271
|
+
segments:
|
266
272
|
- 0
|
267
|
-
|
268
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
+
hash: 418469004383493429
|
274
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
|
+
none: false
|
276
|
+
requirements:
|
277
|
+
- - ! '>='
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: '0'
|
280
|
+
segments:
|
273
281
|
- 0
|
274
|
-
|
282
|
+
hash: 418469004383493429
|
275
283
|
requirements: []
|
276
|
-
|
277
284
|
rubyforge_project:
|
278
|
-
rubygems_version: 1.
|
285
|
+
rubygems_version: 1.8.24
|
279
286
|
signing_key:
|
280
287
|
specification_version: 3
|
281
288
|
summary: Abstracting Services in Ruby
|
282
|
-
test_files:
|
289
|
+
test_files:
|
283
290
|
- spec/client_spec.rb
|
284
291
|
- spec/debug_helper.rb
|
285
292
|
- spec/demux_spec.rb
|