asir 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
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