bayserver-core 3.0.2 → 3.3.1

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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
  3. data/lib/baykit/bayserver/agent/grand_agent.rb +145 -133
  4. data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +17 -0
  5. data/lib/baykit/bayserver/agent/letters/closed_letter.rb +14 -0
  6. data/lib/baykit/bayserver/agent/letters/connected_letter.rb +14 -0
  7. data/lib/baykit/bayserver/agent/letters/error_letter.rb +16 -0
  8. data/lib/baykit/bayserver/agent/letters/letter.rb +19 -0
  9. data/lib/baykit/bayserver/agent/letters/package.rb +9 -0
  10. data/lib/baykit/bayserver/agent/letters/read_letter.rb +20 -0
  11. data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +17 -0
  12. data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +49 -49
  13. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +47 -32
  14. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
  15. data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +12 -28
  16. data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +20 -5
  17. data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +125 -87
  18. data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +24 -19
  19. data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +21 -15
  20. data/lib/baykit/bayserver/bay_log.rb +20 -16
  21. data/lib/baykit/bayserver/bayserver.rb +8 -15
  22. data/lib/baykit/bayserver/common/cities.rb +1 -1
  23. data/lib/baykit/bayserver/common/inbound_ship.rb +5 -45
  24. data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
  25. data/lib/baykit/bayserver/common/multiplexer.rb +5 -1
  26. data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +42 -11
  27. data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
  28. data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +2 -4
  29. data/lib/baykit/bayserver/common/warp_ship.rb +12 -7
  30. data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +2 -4
  31. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
  32. data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
  33. data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
  34. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +1 -1
  35. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
  36. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +43 -35
  37. data/lib/baykit/bayserver/docker/harbor.rb +14 -0
  38. data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
  39. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
  40. data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
  41. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
  42. data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
  43. data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
  44. data/lib/baykit/bayserver/mem_usage.rb +2 -0
  45. data/lib/baykit/bayserver/protocol/packet.rb +2 -1
  46. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +5 -5
  47. data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
  48. data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
  49. data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
  50. data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
  51. data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
  52. data/lib/baykit/bayserver/tours/tour.rb +18 -13
  53. data/lib/baykit/bayserver/tours/tour_req.rb +13 -15
  54. data/lib/baykit/bayserver/tours/tour_res.rb +42 -19
  55. data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
  56. data/lib/baykit/bayserver/util/headers.rb +2 -2
  57. data/lib/baykit/bayserver/util/http_status.rb +7 -0
  58. data/lib/baykit/bayserver/util/http_util.rb +16 -0
  59. data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
  60. data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
  61. data/lib/baykit/bayserver/util/selector.rb +43 -80
  62. data/lib/baykit/bayserver/util/simple_buffer.rb +1 -1
  63. data/lib/baykit/bayserver/version.rb +1 -1
  64. metadata +24 -21
  65. data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
  66. data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
  67. data/lib/baykit/bayserver/agent/letter.rb +0 -30
  68. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
  69. data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
  70. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
  71. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
  72. data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
  73. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
  74. data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
  75. data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
  76. data/lib/baykit/bayserver/watercraft/yacht.rb +0 -42
@@ -1,11 +1,13 @@
1
1
  require 'baykit/bayserver/common/recipient'
2
+ require 'baykit/bayserver/common/write_unit'
2
3
  require 'baykit/bayserver/rudders/rudder'
4
+
3
5
  require 'baykit/bayserver/rudders/io_rudder'
4
6
 
5
7
  require 'baykit/bayserver/agent/multiplexer/multiplexer_base'
6
- require 'baykit/bayserver/agent/multiplexer/write_unit'
7
8
  require 'baykit/bayserver/agent/timer_handler'
8
9
 
10
+
9
11
  module Baykit
10
12
  module BayServer
11
13
  module Agent
@@ -17,20 +19,19 @@ module Baykit
17
19
 
18
20
  include Baykit::BayServer::Rudders
19
21
  include Baykit::BayServer::Util
22
+ include Baykit::BayServer::Common
20
23
 
21
24
  class ChannelOperation
22
25
 
23
26
  attr :rudder
24
27
  attr_accessor :op
25
28
  attr_accessor :to_connect
26
- attr_accessor :to_close
27
29
 
28
30
 
29
- def initialize(rd, op, to_connect, to_close)
31
+ def initialize(rd, op, to_connect)
30
32
  @rudder = rd
31
33
  @op = op
32
34
  @to_connect = to_connect
33
- @to_close = to_close
34
35
  end
35
36
  end
36
37
 
@@ -46,7 +47,18 @@ module Baykit
46
47
  @anchorable = anchorable
47
48
  @operations = []
48
49
  @operations_lock = Mutex.new
49
- @selector = Selector.new
50
+
51
+ begin
52
+ require "nio4r" # gem: nio4r
53
+ require 'baykit/bayserver/util/nio_selector'
54
+ @selector = NioSelector.new
55
+ rescue LoadError => e
56
+ BayLog.debug_e(e, "nio4r gem is not installed. Use Selector instead.")
57
+ require 'baykit/bayserver/util/rb_selector'
58
+ @selector = RbSelector.new
59
+ end
60
+
61
+
50
62
  @select_wakeup_pipe = IO.pipe
51
63
  @selector.register(@select_wakeup_pipe[0], Selector::OP_READ)
52
64
 
@@ -75,9 +87,15 @@ module Baykit
75
87
  rd.set_non_blocking
76
88
 
77
89
  begin
78
- rd.io.connect(adr)
90
+ rd.io.connect_nonblock(adr)
79
91
  rescue IO::WaitWritable => e
80
- #BayLog.error_e(e)
92
+ # In non-blocking mode, connect_nonblock raises IO::WaitWritable by design
93
+ # to signal an in-progress connection (this is expected and not an error).
94
+ rescue Errno::EISCONN
95
+ # Connection has been successfully established
96
+ rescue SystemCallError => e
97
+ @agent.send_error_letter(st.id, rd, self, e, false)
98
+ return
81
99
  end
82
100
 
83
101
  st.connecting = true
@@ -95,17 +113,18 @@ module Baykit
95
113
  end
96
114
  end
97
115
 
98
- def req_write(rd, buf,adr, tag, lis)
116
+ def req_write(rd, buf,adr, tag, &lis)
99
117
  st = get_rudder_state(rd)
100
- BayLog.debug("%s req write st=%s tag=%s", @agent, st, tag)
118
+ BayLog.debug("%s reqWrite st=%s tag=%s", @agent, st, tag)
101
119
 
102
- if st == nil || st.closed
120
+ if st == nil
103
121
  BayLog.warn("%s Channel is closed: %s", @agent, rd)
122
+ lis.call()
104
123
  return
105
124
  end
106
125
 
107
- unt = WriteUnit.new(buf, adr, tag, lis)
108
- st.writing_lock.synchronize do
126
+ unt = WriteUnit.new(buf, adr, tag, &lis)
127
+ st.write_queue_lock.synchronize do
109
128
  st.write_queue << unt
110
129
  end
111
130
 
@@ -133,8 +152,8 @@ module Baykit
133
152
  return
134
153
  end
135
154
 
136
- st.closing = true
137
- add_operation(rd, Selector::OP_WRITE, false, true)
155
+ close_rudder(rd)
156
+ @agent.send_closed_letter(st.id, rd, self, false)
138
157
 
139
158
  st.access
140
159
  end
@@ -158,6 +177,10 @@ module Baykit
158
177
  end
159
178
 
160
179
  def cancel_write(st)
180
+ if st.rudder.closed?
181
+ return
182
+ end
183
+
161
184
  op = @selector.get_op(st.rudder.io) & ~Selector::OP_WRITE
162
185
  # Write OP off
163
186
  if op != Selector::OP_READ
@@ -176,8 +199,8 @@ module Baykit
176
199
  def next_write(st)
177
200
  end
178
201
 
179
- def close_rudder(st)
180
- @selector.unregister(st.rudder.io)
202
+ def close_rudder(rd)
203
+ @selector.unregister(rd.io)
181
204
  super
182
205
  end
183
206
 
@@ -246,23 +269,22 @@ module Baykit
246
269
  end
247
270
 
248
271
  private
249
- def add_operation(rd, op, to_connect=false, to_close=false)
272
+ def add_operation(rd, op, to_connect=false)
250
273
  @operations_lock.synchronize do
251
274
  found = false
252
275
  @operations.each do |ch_op|
253
276
  if ch_op.rudder == rd
254
277
  ch_op.op |= op
255
- ch_op.to_close = (ch_op.to_close or to_close)
256
278
  ch_op.to_connect = (ch_op.to_connect or to_connect)
257
279
  found = true
258
- BayLog.trace("%s Update operation: %s con=%s close=%s ch=%s",
259
- @agent, self.class.op_mode(ch_op.op), ch_op.to_connect, ch_op.to_close, ch_op.rudder.inspect())
280
+ BayLog.trace("%s Update operation: %s con=%s ch=%s",
281
+ @agent, self.class.op_mode(ch_op.op), ch_op.to_connect, ch_op.rudder.inspect())
260
282
  end
261
283
  end
262
284
 
263
285
  if not found
264
- BayLog.trace("%s New operation: %d con=%s close=%s ch=%s", @agent, op, to_connect, to_close, rd.inspect)
265
- @operations << ChannelOperation.new(rd, op, to_connect, to_close)
286
+ BayLog.trace("%s New operation: %d con=%s close=%s ch=%s", @agent, op, to_connect, rd.inspect)
287
+ @operations << ChannelOperation.new(rd, op, to_connect)
266
288
  end
267
289
  end
268
290
 
@@ -303,12 +325,6 @@ module Baykit
303
325
  st.connecting = true
304
326
  end
305
327
 
306
- elsif rd_op.to_close
307
- if st == nil
308
- BayLog.warn("%s chState=%s register close but ChannelState", self.agent);
309
- else
310
- st.closing = true
311
- end
312
328
  end
313
329
 
314
330
  rescue => e
@@ -327,17 +343,14 @@ module Baykit
327
343
  #BayLog.info("%s handle_channel io=%s op=%d", self, io, op)
328
344
  st = find_rudder_state_by_key(io)
329
345
  if st == nil
330
- BayLog.error("Cannot find fd state (Maybe file is closed)")
346
+ BayLog.debug("Cannot find fd state (Maybe file is closed)")
331
347
  @selector.unregister(io)
332
348
  return
333
349
  end
334
350
 
335
351
  begin
336
352
 
337
- if st.closing
338
- on_close_req(st)
339
-
340
- elsif st.connecting
353
+ if st.connecting
341
354
  on_connectable(st)
342
355
 
343
356
  st.connecting = false
@@ -394,9 +407,7 @@ module Baykit
394
407
  raise e
395
408
 
396
409
  rescue => e
397
- if e.kind_of? EOFError
398
- BayLog.debug("%s Socket closed by peer: skt=%s", @agent, st.rudder.inspect)
399
- elsif e.kind_of? SystemCallError
410
+ if e.kind_of? SystemCallError
400
411
  BayLog.debug("%s O/S error: %s (skt=%s)", @agent, e.message, st.rudder.inspect)
401
412
  elsif e.kind_of? IOError
402
413
  BayLog.debug("%s IO error: %s (skt=%s)", @agent, e.message, st.rudder.inspect)
@@ -408,7 +419,7 @@ module Baykit
408
419
  end
409
420
  # Cannot handle Exception any more
410
421
  BayLog.error_e(e)
411
- next_action = NextSocketAction::CLOSE
422
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
412
423
  end
413
424
 
414
425
  st.access()
@@ -429,7 +440,7 @@ module Baykit
429
440
  client_rd.set_non_blocking
430
441
  #client_skt.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
431
442
 
432
- @agent.send_accepted_letter(st, client_rd, nil, false)
443
+ @agent.send_accepted_letter(st.id, st.rudder, self, client_rd, false)
433
444
 
434
445
  end
435
446
 
@@ -437,16 +448,18 @@ module Baykit
437
448
  BayLog.trace("%s onConnectable", self)
438
449
 
439
450
  # check connected
440
- begin
441
- buf = ""
442
- st.rudder.io.syswrite(buf)
443
- rescue => e
444
- BayLog.error("Connect failed: %s", e)
445
- @agent.send_connected_letter(st, e, false)
446
- return
451
+ err = st.rudder.io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).int
452
+ if err != 0
453
+ BayLog.error("Connect failed: errno=%d", err)
454
+ begin
455
+ raise SystemCallError.new("connect", err)
456
+ rescue SystemCallError => e
457
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
458
+ end
459
+ else
460
+ @agent.send_connected_letter(st.id, st.rudder, self, false)
447
461
  end
448
462
 
449
- @agent.send_connected_letter(st, nil, false)
450
463
  end
451
464
 
452
465
  def on_readable(st)
@@ -456,28 +469,9 @@ module Baykit
456
469
 
457
470
  begin
458
471
  if st.handshaking
459
- begin
460
- # Calls accept API for client socket
461
- st.rudder.io.accept_nonblock
472
+ if handshake(st)
462
473
  st.handshaking = false
463
-
464
- BayLog.debug("%s Handshake done (rd=%s)", self, st.rudder)
465
- app_protocols = st.rudder.io.context.alpn_protocols
466
-
467
- # HELP ME
468
- # This code does not work!
469
- # We cannot get application protocol name
470
- proto = nil
471
- if app_protocols != nil && app_protocols.length > 0
472
- proto = app_protocols[0]
473
- end
474
-
475
- rescue IO::WaitReadable => e
476
- BayLog.debug("%s Handshake status: read more st=%s", self, st)
477
- return NextSocketAction::CONTINUE
478
- rescue IO::WaitWritable => e
479
- BayLog.debug("%s Handshake status: write more st=%s", self, st)
480
- req_write(st.rudder, "", nil, nil, nil)
474
+ else
481
475
  return NextSocketAction::CONTINUE
482
476
  end
483
477
  end
@@ -491,49 +485,66 @@ module Baykit
491
485
  BayLog.debug("%s Read status: write more", self)
492
486
  @channel_handler.ask_to_write(@ch)
493
487
  return NextSocketAction::CONTINUE
494
- rescue EOFError => e
495
- BayLog.debug("%s EOF", self)
496
- len = 0
497
488
  end
498
489
 
499
490
  BayLog.debug("%s read %d bytes", self, len)
500
- @agent.send_read_letter(st, len, nil, nil, false)
491
+ @agent.send_read_letter(st.id, st.rudder, self, len, nil, false)
501
492
 
502
493
  rescue Exception => e
503
494
  BayLog.debug_e(e, "%s Unhandled error", self)
504
- @agent.send_read_letter(st, -1, nil, e, false)
495
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
505
496
  return
506
497
  end
507
498
  end
508
499
 
509
500
  def on_writable(st)
510
501
  begin
502
+ if st.handshaking
503
+ if handshake(st)
504
+ st.handshaking = false
505
+ else
506
+ return NextSocketAction::CONTINUE
507
+ end
508
+ end
509
+
511
510
  if st.write_queue.empty?
512
- raise IOError.new(@agent.to_s + " No data to write: " + st.rudder.to_s)
511
+ #raise IOError.new(@agent.to_s + " No data to write: " + st.rudder.to_s)
512
+ BayLog.debug("%s No data to write: tp=%s rd=%s", self, st.transporter, st.rudder)
513
+ return
513
514
  end
514
515
 
515
- wunit = st.write_queue[0]
516
+ st.write_queue.length.times do |i|
517
+ wunit = st.write_queue[i]
518
+
519
+ BayLog.debug("%s Try to write: rd=%s pkt=%s len=%d adr=%s",
520
+ self, st.rudder, wunit.tag, wunit.buf.length, wunit.adr)
521
+ #BayLog.debug(this + " " + new String(wUnit.buf.array(), 0, wUnit.buf.limit()));
522
+
523
+ begin
524
+ n = st.rudder.write(wunit.buf)
525
+ rescue OpenSSL::SSL::SSLErrorWaitWritable, IO::WaitWritable => e
526
+ BayLog.debug_e(e, "%s Cannot write data", self)
527
+ n = 0
528
+ end
529
+
530
+ #BayLog.debug("%s Wrote: rd=%s len=%d",self, st.rudder, n);
531
+ @agent.send_wrote_letter(st.id, st.rudder, self, n, false)
516
532
 
517
- BayLog.debug("%s Try to write: rd=%s pkt=%s len=%d closed=%s adr=%s",
518
- self, st.rudder, wunit.tag, wunit.buf.length, st.closed, wunit.adr);
519
- #BayLog.debug(this + " " + new String(wUnit.buf.array(), 0, wUnit.buf.limit()));
533
+ len = wunit.buf.length
534
+ wunit.buf.slice!(0, n)
520
535
 
521
- n = st.rudder.write(wunit.buf)
522
- #BayLog.debug("%s Wrote: rd=%s len=%d",self, st.rudder, n);
523
- wunit.buf.slice!(0, n)
524
- @agent.send_wrote_letter(st, n, nil, false)
536
+ if n < len
537
+ BayLog.debug("%s Wrote %d bytes (Data remains)", self, n)
538
+ break
539
+ end
540
+ end
525
541
 
526
542
  rescue SystemCallError, IOError => e
527
543
  BayLog.debug_e(e, "%s IO error", self)
528
- @agent.send_wrote_letter(st, -1, e, false)
544
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
529
545
  end
530
546
  end
531
547
 
532
- def on_close_req(st)
533
- BayLog.debug("%s onCloseReq: rd=%s", self, st.rudder)
534
- @agent.send_close_req_letter(st, false)
535
- end
536
-
537
548
  def on_waked_up
538
549
  #BayLog.debug("%s waked up", self)
539
550
  val = IOUtil.read_int32(@select_wakeup_pipe[0])
@@ -554,6 +565,33 @@ module Baykit
554
565
 
555
566
  return mode_str
556
567
  end
568
+
569
+ def handshake(st)
570
+ begin
571
+ # Calls accept API for client socket
572
+ st.rudder.io.accept_nonblock
573
+
574
+ BayLog.debug("%s Handshake done (rd=%s)", self, st.rudder)
575
+ app_protocols = st.rudder.io.context.alpn_protocols
576
+
577
+ # HELP ME
578
+ # This code does not work!
579
+ # We cannot get application protocol name
580
+ proto = nil
581
+ if app_protocols != nil && app_protocols.length > 0
582
+ proto = app_protocols[0]
583
+ end
584
+
585
+ return true
586
+ rescue IO::WaitReadable => e
587
+ BayLog.debug("%s Handshake status: read more st=%s", self, st)
588
+ return false
589
+ rescue IO::WaitWritable => e
590
+ BayLog.debug("%s Handshake status: write more st=%s", self, st)
591
+ req_write(st.rudder, "", nil, nil)
592
+ return false
593
+ end
594
+ end
557
595
  end
558
596
  end
559
597
  end
@@ -14,14 +14,19 @@ module Baykit
14
14
 
15
15
  include Baykit::BayServer::Rudders
16
16
  include Baykit::BayServer::Util
17
+ include Baykit::BayServer::Common
17
18
 
18
19
  class Lapper # abstract class
19
20
 
21
+ attr :multiplexer
22
+ attr :state_id
20
23
  attr :state
21
24
  attr :last_access
22
25
 
23
- def initialize(state)
26
+ def initialize(mpx, state)
27
+ @multiplexer = mpx
24
28
  @state = state
29
+ @state_id = state.id
25
30
  access
26
31
  end
27
32
 
@@ -46,8 +51,8 @@ module Baykit
46
51
 
47
52
  attr :agent
48
53
 
49
- def initialize(agt, st)
50
- super(st)
54
+ def initialize(mpx, agt, st)
55
+ super(mpx, st)
51
56
  @agent = agt
52
57
  st.rudder.set_non_blocking
53
58
  end
@@ -61,10 +66,9 @@ module Baykit
61
66
 
62
67
  begin
63
68
  n = @state.rudder.read(@state.read_buf, @state.buf_size)
64
- #infile.sysread(@state.buf_size, @state.read_buf)
65
- rescue EOFError => e
66
- @state.read_buf.clear
67
- eof = true
69
+ if n == 0
70
+ eof = true
71
+ end
68
72
  rescue Errno::EAGAIN => e
69
73
  BayLog.debug("%s %s", @agent, e)
70
74
  return true
@@ -78,12 +82,11 @@ module Baykit
78
82
  end
79
83
  end
80
84
 
81
- @agent.send_read_letter(@state, @state.read_buf.length, nil, nil, false)
85
+ @agent.send_read_letter(@state_id, @state.rudder, @multiplexer, @state.read_buf.length, nil, false)
82
86
  return false
83
87
 
84
88
  rescue Exception => e
85
- BayLog.error_e(e, "%s Error", @agent)
86
- @agent.send_close_req_letter(@state, false)
89
+ @agent.send_error_letter(@state_id, @state.rudder, @multiplexer, e, false)
87
90
  return false
88
91
  end
89
92
  end
@@ -141,13 +144,14 @@ module Baykit
141
144
  end
142
145
  end
143
146
 
144
- def req_write(rd, buf, len, adr, tag, lis)
147
+ def req_write(rd, buf, adr, tag, &lis)
145
148
  st = get_rudder_state(rd)
146
149
  if st == nil
147
- raise IOError("Invalid rudder")
150
+ BayLog.warn("Invalid rudder")
151
+ lis.call()
148
152
  end
149
153
 
150
- unt = WriteUnit.new(buf, adr, tag, lis)
154
+ unt = WriteUnit.new(buf, adr, tag, &lis)
151
155
  st.write_queue_lock.synchronize do
152
156
  st.write_queue << unt
153
157
  end
@@ -174,7 +178,8 @@ module Baykit
174
178
  def req_close(rd)
175
179
  st = get_rudder_state(rd)
176
180
  st.closing = true
177
- @agent.send_close_req_letter(st, false)
181
+ close_rudder(rd)
182
+ @agent.send_closed_letter(st.id, st.rudder, self, false)
178
183
  end
179
184
 
180
185
 
@@ -206,7 +211,7 @@ module Baykit
206
211
  end
207
212
 
208
213
  def next_read(st)
209
- lpr = ReadIOLapper.new(@agent, st)
214
+ lpr = ReadIOLapper.new(self, @agent, st)
210
215
  lpr.next
211
216
 
212
217
  add_to_running_list(lpr)
@@ -266,7 +271,7 @@ module Baykit
266
271
  spun = lpr.lap
267
272
  st.access
268
273
 
269
- all_spun = all_spun & spun
274
+ all_spun = all_spun && spun
270
275
  end
271
276
 
272
277
  if all_spun
@@ -287,11 +292,11 @@ module Baykit
287
292
  #########################################
288
293
  private
289
294
 
290
- def remove_from_running_list(st)
291
- BayLog.debug("remove: %s", st.rudder)
295
+ def remove_from_running_list(rd)
296
+ BayLog.debug("remove: %s", rd)
292
297
  @running_list_lock.synchronize do
293
298
  @running_list.delete_if do |lpr |
294
- lpr.state == st
299
+ lpr.state.rudder == rd
295
300
  end
296
301
  end
297
302
  end
@@ -21,9 +21,9 @@ module Baykit
21
21
  end
22
22
  def depart
23
23
  if @for_read
24
- @rudder_state.multiplexer.do_next_read(@rudder_state)
24
+ @rudder_state.multiplexer.do_next_read(@rudder_state.rudder)
25
25
  else
26
- @rudder_state.multiplexer.do_next_write(@rudder_state)
26
+ @rudder_state.multiplexer.do_next_write(@rudder_state.rudder)
27
27
  end
28
28
  end
29
29
 
@@ -40,6 +40,7 @@ module Baykit
40
40
  include Baykit::BayServer::Rudders
41
41
  include Baykit::BayServer::Util
42
42
  include Baykit::BayServer::Taxi
43
+ include Baykit::BayServer::Common
43
44
 
44
45
  def initialize(agt)
45
46
  super
@@ -83,17 +84,18 @@ module Baykit
83
84
  st.access
84
85
  end
85
86
 
86
- def req_write(rd, buf, adr, tag, lis)
87
+ def req_write(rd, buf, adr, tag, &lis)
87
88
  st = get_rudder_state(rd)
88
89
  BayLog.debug("%s reqWrite st=%s", @agent, st)
89
90
 
90
- if st == nil || st.closed
91
+ if st == nil
91
92
  BayLog.warn("%s Channel is closed: %s", @agent, rd)
93
+ lis.call
92
94
  return
93
95
  end
94
96
 
95
- unt = WriteUnit.new(buf, adr, tag, lis)
96
- st.writing_lock.synchronize do
97
+ unt = WriteUnit.new(buf, adr, tag, &lis)
98
+ st.write_queue_lock.synchronize do
97
99
  st.write_queue << unt
98
100
  end
99
101
 
@@ -113,9 +115,10 @@ module Baykit
113
115
  end
114
116
 
115
117
  def req_close(rd)
118
+ BayLog.debug("%s reqClose rd=%s", @agent, rd);
119
+ close_rudder(rd)
116
120
  st = get_rudder_state(rd)
117
- BayLog.debug("%s reqClose st=%s", @agent, st);
118
- close_rudder(st)
121
+ @agent.send_closed_letter(st.id, rd, self, true)
119
122
  st.access
120
123
  end
121
124
 
@@ -153,22 +156,25 @@ module Baykit
153
156
  TaxiRunner.post(@agent.agent_id, TaxiForMpx.new(st, for_read))
154
157
  end
155
158
 
156
- def do_next_read(st)
157
- st.access
159
+ def do_next_read(rd)
160
+ st = get_rudder_state(rd)
161
+
158
162
  begin
159
163
  len = st.rudder.read(st.read_buf, st.buf_size)
160
164
  if len <= 0
161
165
  len = 0
162
166
  end
163
- @agent.send_read_letter(st, len, nil, nil, true)
167
+ @agent.send_read_letter(st.id, rd, self, len, nil, true)
164
168
 
165
169
  rescue Exception => e
166
- @agent.send_read_letter(st, -1, nil, e, true)
170
+ @agent.send_error_letter(st.id, rd, self, e, true)
167
171
  end
168
172
  end
169
173
 
170
- def do_next_write(st)
174
+ def do_next_write(rd)
175
+ st = get_rudder_state(rd)
171
176
  st.access
177
+
172
178
  begin
173
179
  if st.write_queue.empty?
174
180
  raise Sink("%s write queue is empty", self)
@@ -181,10 +187,10 @@ module Baykit
181
187
  len = st.rudder.write(u.buf)
182
188
  u.buf.slice!(0, len)
183
189
  end
184
- @agent.send_wrote_letter(st, len, nil, true)
190
+ @agent.send_wrote_letter(st.id, rd, self, len, true)
185
191
 
186
192
  rescue Exception => e
187
- @agent.send_wrote_letter(st, -1, e, true)
193
+ @agent.send_error_letter(st.id, rd, self, e, true)
188
194
  end
189
195
  end
190
196
  end
@@ -81,6 +81,10 @@ module Baykit
81
81
  end
82
82
 
83
83
  def self.log(lvl, stack_idx, err, fmt, args)
84
+ if lvl < @log_level
85
+ return
86
+ end
87
+
84
88
  #pos = caller[1].split("/")[-1]
85
89
  apos = parse_caller(caller[1])
86
90
  if(!@full_path)
@@ -90,22 +94,20 @@ module Baykit
90
94
  #pos = caller[1]
91
95
 
92
96
  if fmt != nil
93
- if lvl >= @log_level
94
- begin
95
- if args == nil || args.length == 0
96
- msg = sprintf("%s", fmt)
97
- else
98
- msg = sprintf(fmt, *args)
99
- end
100
- rescue => e
101
- puts(e.class)
102
- puts(e.message + " " + pos)
103
- print_exception(e)
104
- msg = fmt
97
+ begin
98
+ if args == nil || args.length == 0
99
+ msg = sprintf("%s", fmt)
100
+ else
101
+ msg = sprintf(fmt, *args)
105
102
  end
106
-
107
- print("[#{Time.now}] #{LOG_LEVEL_NAME[lvl]}. #{msg} (at #{pos})\n")
103
+ rescue => e
104
+ puts(e.class)
105
+ puts(e.message + " " + pos)
106
+ print_exception(e)
107
+ msg = fmt
108
108
  end
109
+
110
+ print("[#{Time.now}] #{LOG_LEVEL_NAME[lvl]}. #{msg} (at #{pos})\n")
109
111
  end
110
112
 
111
113
  if err != nil
@@ -129,8 +131,10 @@ module Baykit
129
131
  end
130
132
 
131
133
  def self.print_exception err
132
- for s in err.backtrace
133
- puts "\t" + s
134
+ if err.backtrace != nil
135
+ for s in err.backtrace
136
+ puts "\t" + s
137
+ end
134
138
  end
135
139
  if err.cause
136
140
  puts "Caused by:"