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 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.
@@ -119,12 +119,10 @@ class Main
119
119
  when /^taillog_([^_]+)_([^_]+)!$/
120
120
  exec "tail -f #{log_file.inspect}"
121
121
  when /^pid_([^_]+)_([^_]+)!$/
122
- pid = server_pid rescue nil
123
- alive = process_running? pid
122
+ pid = _alive?
124
123
  puts "#{pid_file} #{pid || :NA} #{alive}"
125
124
  when /^alive_([^_]+)_([^_]+)!$/
126
- pid = server_pid rescue nil
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, message | nil }
330
- transport.after_receive_message = lambda do | transport, message |
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
- true
397
+ pid
381
398
  rescue ::Errno::ESRCH
382
399
  false
383
400
  rescue ::Exception => exc
@@ -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, message)
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, message)
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, result)
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, message, result)
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
@@ -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
- message[:result_file_created] = true
30
+ result_file_created = true
32
31
  end
33
32
  end
34
33
  super
35
34
  ensure
36
- if message[:result_file_created]
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
- unless one_way || (message = state.message).one_way
54
- if result_file = message[:result_file] || self.result_file
55
- ::File.open(result_file, "a+") do | stream |
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
- message = state.message
65
- result_file = message[:result_file] || self.result_file
66
- unless one_way || message.one_way
67
- if result_file
68
- ::File.open(result_file, "r") do | stream |
69
- state.result_payload = _read(stream, state)
70
- end
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
- line = stream.readline
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}"
@@ -1,3 +1,3 @@
1
1
  module ASIR
2
- VERSION = "1.2.2"
2
+ VERSION = "1.2.3"
3
3
  end
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
- prerelease: false
5
- segments:
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
- date: 2012-12-31 00:00:00 -06:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- type: :runtime
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
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
- version_requirements: &id002 !ruby/object:Gem::Requirement
37
- requirements:
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
38
27
  - - ~>
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 2
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: *id002
47
- prerelease: false
48
- - !ruby/object:Gem::Dependency
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
- version_requirements: &id003 !ruby/object:Gem::Requirement
51
- requirements:
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
52
43
  - - ~>
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 1
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: *id003
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
- - !ruby/object:Gem::Dependency
63
- type: :development
64
- version_requirements: &id004 !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- segments:
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: *id004
75
- prerelease: false
76
- - !ruby/object:Gem::Dependency
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
- version_requirements: &id005 !ruby/object:Gem::Requirement
79
- requirements:
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
- version_requirements: &id006 !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- segments:
97
- - 0
98
- - 1
99
- version: "0.1"
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: *id006
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
- requirements:
263
- - - ">="
264
- - !ruby/object:Gem::Version
265
- segments:
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
- version: "0"
268
- required_rubygems_version: !ruby/object:Gem::Requirement
269
- requirements:
270
- - - ">="
271
- - !ruby/object:Gem::Version
272
- segments:
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
- version: "0"
282
+ hash: 418469004383493429
275
283
  requirements: []
276
-
277
284
  rubyforge_project:
278
- rubygems_version: 1.3.6
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