bayserver-core 3.0.3 → 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 (72) 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 +101 -93
  4. data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +2 -2
  5. data/lib/baykit/bayserver/agent/letters/closed_letter.rb +2 -2
  6. data/lib/baykit/bayserver/agent/letters/connected_letter.rb +2 -2
  7. data/lib/baykit/bayserver/agent/letters/error_letter.rb +2 -2
  8. data/lib/baykit/bayserver/agent/letters/letter.rb +7 -3
  9. data/lib/baykit/bayserver/agent/letters/read_letter.rb +2 -2
  10. data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +2 -2
  11. data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +20 -22
  12. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +44 -31
  13. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
  14. data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +4 -4
  15. data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +2 -3
  16. data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +113 -59
  17. data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +22 -17
  18. data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +17 -13
  19. data/lib/baykit/bayserver/bay_log.rb +20 -16
  20. data/lib/baykit/bayserver/bayserver.rb +8 -15
  21. data/lib/baykit/bayserver/common/cities.rb +1 -1
  22. data/lib/baykit/bayserver/common/inbound_ship.rb +1 -1
  23. data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
  24. data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +43 -7
  25. data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
  26. data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +1 -3
  27. data/lib/baykit/bayserver/common/warp_ship.rb +4 -3
  28. data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +1 -3
  29. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
  30. data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
  31. data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
  32. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
  33. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +42 -26
  34. data/lib/baykit/bayserver/docker/harbor.rb +14 -0
  35. data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
  36. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
  37. data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
  38. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
  39. data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
  40. data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
  41. data/lib/baykit/bayserver/mem_usage.rb +2 -0
  42. data/lib/baykit/bayserver/protocol/packet.rb +2 -1
  43. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +5 -5
  44. data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
  45. data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
  46. data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
  47. data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
  48. data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
  49. data/lib/baykit/bayserver/tours/tour.rb +1 -6
  50. data/lib/baykit/bayserver/tours/tour_req.rb +4 -8
  51. data/lib/baykit/bayserver/tours/tour_res.rb +1 -8
  52. data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
  53. data/lib/baykit/bayserver/util/headers.rb +2 -2
  54. data/lib/baykit/bayserver/util/http_status.rb +7 -0
  55. data/lib/baykit/bayserver/util/http_util.rb +16 -0
  56. data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
  57. data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
  58. data/lib/baykit/bayserver/util/selector.rb +43 -80
  59. data/lib/baykit/bayserver/util/simple_buffer.rb +1 -1
  60. data/lib/baykit/bayserver/version.rb +1 -1
  61. metadata +16 -20
  62. data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
  63. data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
  64. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
  65. data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
  66. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
  67. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
  68. data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
  69. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
  70. data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
  71. data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
  72. data/lib/baykit/bayserver/watercraft/yacht.rb +0 -42
@@ -15,6 +15,7 @@ module Baykit
15
15
 
16
16
  include Baykit::BayServer::Rudders
17
17
  include Baykit::BayServer::Util
18
+ include Baykit::BayServer::Common
18
19
 
19
20
  def initialize(agt, anchorable)
20
21
  super
@@ -35,6 +36,7 @@ module Baykit
35
36
  end
36
37
 
37
38
  st = get_rudder_state(rd)
39
+ id = st.id
38
40
 
39
41
  Thread.new do
40
42
  begin
@@ -45,7 +47,7 @@ module Baykit
45
47
  begin
46
48
  client_skt, adr = rd.io.accept
47
49
  rescue Exception => e
48
- @agent.send_error_letter(st, e, true)
50
+ @agent.send_error_letter(id, rd, self, e, true)
49
51
  next
50
52
  end
51
53
 
@@ -54,7 +56,7 @@ module Baykit
54
56
  BayLog.error("%s Agent is not alive (close)", @agent);
55
57
  client_skt.close
56
58
  else
57
- @agent.send_accepted_letter(st, IORudder.new(client_skt), true)
59
+ @agent.send_accepted_letter(id, rd, self, IORudder.new(client_skt), true)
58
60
  end
59
61
 
60
62
  rescue Exception => e
@@ -67,20 +69,28 @@ module Baykit
67
69
 
68
70
 
69
71
  def req_connect(rd, adr)
70
- st = get_rudder_state(rd)
71
- BayLog.debug("%s reqConnect adr=%s rd=%s chState=%s", @agent, adr.canonname, rd, st)
72
+ BayLog.debug("%s reqConnect adr=%s rd=%s", @agent, adr.canonname, rd)
72
73
 
73
74
  Thread.new do
75
+ st = get_rudder_state(rd)
76
+ if st == nil
77
+ # rudder is already closed
78
+ BayLog.debug("%s Rudder is already closed: rd=%s", @agent, rd)
79
+ return
80
+ end
81
+
74
82
  begin
75
83
  rd.io.connect(adr)
76
84
  BayLog.debug("%s Connected rd=%s", @agent, rd)
77
- @agent.send_connected_letter(st, false)
85
+ @agent.send_connected_letter(st.id, rd, self, true)
78
86
  rescue Exception => e
79
- @agent.send_error_letter(st, e, false)
87
+ @agent.send_error_letter(st.id, rd, self, e, true)
80
88
  return
81
89
  end
82
90
  end
83
91
 
92
+ st = get_rudder_state(rd)
93
+ st.access
84
94
  st.connecting = true
85
95
  end
86
96
 
@@ -110,10 +120,11 @@ module Baykit
110
120
  st = get_rudder_state(rd)
111
121
  BayLog.debug("%s reqWrite st=%s", @agent, st)
112
122
 
113
- if st == nil || st.closed
114
- BayLog.warn("%s Channel is closed(callback immediately): %s", @agent, rd)
115
- lis.call()
116
- return
123
+ if st == nil
124
+ raise IOError.new("Invalid rudder")
125
+ #BayLog.warn("%s Channel is closed(callback immediately): %s", @agent, rd)
126
+ #lis.call()
127
+ #return
117
128
  end
118
129
 
119
130
  unt = WriteUnit.new(buf, adr, tag, &lis)
@@ -145,7 +156,9 @@ module Baykit
145
156
  return
146
157
  end
147
158
 
148
- Thread.new do
159
+ id = st.id
160
+
161
+ Thread.new do
149
162
  begin
150
163
  st = get_rudder_state(rd)
151
164
  if st == nil
@@ -153,8 +166,8 @@ module Baykit
153
166
  next
154
167
  end
155
168
 
156
- close_rudder(st)
157
- @agent.send_closed_letter(st, true)
169
+ close_rudder(rd)
170
+ @agent.send_closed_letter(id, rd, self, true)
158
171
  rescue Exception => e
159
172
  BayLog.fatal_e(e)
160
173
  @agent.shutdown
@@ -177,12 +190,9 @@ module Baykit
177
190
  end
178
191
 
179
192
  def next_read(st)
193
+ id = st.id
194
+
180
195
  Thread.new do
181
- if st.closed
182
- #channel is already closed
183
- BayLog.debug("%s Rudder is already closed: rd=%s", @agent, st.rudder);
184
- next
185
- end
186
196
 
187
197
  begin
188
198
  if st.handshaking
@@ -203,45 +213,48 @@ module Baykit
203
213
  end
204
214
 
205
215
  BayLog.debug("%s Try to Read (rd=%s)", @agent, st.rudder)
206
- begin
207
- n = st.rudder.read(st.read_buf, st.buf_size)
208
- rescue EOFError => e
209
- n = 0
210
- st.read_buf.clear
211
- end
216
+ n = st.rudder.read(st.read_buf, st.buf_size)
212
217
 
213
- @agent.send_read_letter(st, n, nil, true)
218
+ if get_rudder_state(st.rudder) == nil
219
+ #channel is already closed
220
+ BayLog.debug("%s Rudder is already closed: rd=%s", self, st.rudder);
221
+ next
222
+ else
223
+ @agent.send_read_letter(id, st.rudder, self, n, nil, true)
224
+ end
214
225
 
215
226
  rescue Exception => e
216
- @agent.send_error_letter(st, e, true)
227
+ @agent.send_error_letter(id, st.rudder, self, e, true)
217
228
  end
218
229
  end
219
230
  end
220
231
 
221
232
  def next_write(st)
233
+ id = st.id
234
+
222
235
  Thread.new do
223
236
  BayLog.debug("%s next write st=%s", @agent, st)
224
237
 
225
- if st == nil || st.closed
238
+ if st == nil
226
239
  BayLog.warn("%s Channel is closed: %s", @agent, st.rudder)
227
240
  next
228
241
  end
229
242
 
230
243
  u = st.write_queue[0]
231
- BayLog.debug("%s Try to write: pkt=%s buflen=%d closed=%s", self, u.tag, u.buf.length, st.closed);
244
+ BayLog.debug("%s Try to write: pkt=%s buflen=%d", self, u.tag, u.buf.length)
232
245
 
233
246
  n = 0
234
247
  begin
235
- if !st.closed && u.buf.length > 0
248
+ if u.buf.length > 0
236
249
  n = st.rudder.write(u.buf)
237
250
  u.buf.slice!(0, n)
238
251
  end
239
252
  rescue Exception => e
240
- @agent.send_error_letter(st, e, true)
253
+ @agent.send_error_letter(id, st.rudder, self, e, true)
241
254
  next
242
255
  end
243
256
 
244
- @agent.send_wrote_letter(st, n, true)
257
+ @agent.send_wrote_letter(id, st.rudder, self, n, true)
245
258
  end
246
259
  end
247
260
 
@@ -26,7 +26,12 @@ module Baykit
26
26
  close_all()
27
27
  end
28
28
 
29
+ def on_busy()
30
+ BayLog.debug("%s onBusy (ignore)", self)
31
+ end
32
+
29
33
  def on_free()
34
+ BayLog.debug("%s onFree", self)
30
35
  if @agent.aborted
31
36
  return
32
37
  end
@@ -63,11 +63,11 @@ module Baykit
63
63
  return true
64
64
  end
65
65
 
66
- def close_rudder(st)
67
- BayLog.debug("%s closeRd %s state=%s closed=%s", agent, st.rudder, st, st.closed)
66
+ def close_rudder(rd)
67
+ BayLog.debug("%s closeRd %s", agent, rd)
68
68
 
69
69
  begin
70
- st.rudder.close()
70
+ rd.close()
71
71
  rescue IOError => e
72
72
  Baylog.error_e(e)
73
73
  end
@@ -123,7 +123,7 @@ module Baykit
123
123
  end
124
124
  copied.each do |st|
125
125
  if st.rudder != @agent.command_receiver.rudder
126
- close_rudder(st)
126
+ close_rudder(st.rudder)
127
127
  end
128
128
  end
129
129
  end
@@ -1,4 +1,4 @@
1
- require 'baykit/bayserver/agent/multiplexer/transporter'
1
+ require 'baykit/bayserver/common/transporter'
2
2
  require 'baykit/bayserver/protocol/protocol_exception'
3
3
  require 'baykit/bayserver/agent/next_socket_action'
4
4
 
@@ -7,7 +7,7 @@ module Baykit
7
7
  module Agent
8
8
  module Multiplexer
9
9
  class PlainTransporter
10
- include Transporter # Implements
10
+ include Baykit::BayServer::Common::Transporter # Implements
11
11
  include Baykit::BayServer::Agent
12
12
  include Baykit::BayServer::Protocol
13
13
  include Baykit::BayServer::Util
@@ -45,7 +45,6 @@ module Baykit
45
45
  check_rudder rd
46
46
 
47
47
  return @ship.notify_connect
48
- ;
49
48
  end
50
49
 
51
50
  def on_read(rd, buf, adr)
@@ -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,6 +19,7 @@ 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
 
@@ -44,7 +47,18 @@ module Baykit
44
47
  @anchorable = anchorable
45
48
  @operations = []
46
49
  @operations_lock = Mutex.new
47
- @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
+
48
62
  @select_wakeup_pipe = IO.pipe
49
63
  @selector.register(@select_wakeup_pipe[0], Selector::OP_READ)
50
64
 
@@ -73,9 +87,15 @@ module Baykit
73
87
  rd.set_non_blocking
74
88
 
75
89
  begin
76
- rd.io.connect(adr)
90
+ rd.io.connect_nonblock(adr)
77
91
  rescue IO::WaitWritable => e
78
- #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
79
99
  end
80
100
 
81
101
  st.connecting = true
@@ -95,9 +115,9 @@ module Baykit
95
115
 
96
116
  def req_write(rd, buf,adr, tag, &lis)
97
117
  st = get_rudder_state(rd)
98
- BayLog.debug("%s req write st=%s tag=%s", @agent, st, tag)
118
+ BayLog.debug("%s reqWrite st=%s tag=%s", @agent, st, tag)
99
119
 
100
- if st == nil || st.closed
120
+ if st == nil
101
121
  BayLog.warn("%s Channel is closed: %s", @agent, rd)
102
122
  lis.call()
103
123
  return
@@ -132,8 +152,8 @@ module Baykit
132
152
  return
133
153
  end
134
154
 
135
- close_rudder(st)
136
- @agent.send_closed_letter(st, false)
155
+ close_rudder(rd)
156
+ @agent.send_closed_letter(st.id, rd, self, false)
137
157
 
138
158
  st.access
139
159
  end
@@ -157,6 +177,10 @@ module Baykit
157
177
  end
158
178
 
159
179
  def cancel_write(st)
180
+ if st.rudder.closed?
181
+ return
182
+ end
183
+
160
184
  op = @selector.get_op(st.rudder.io) & ~Selector::OP_WRITE
161
185
  # Write OP off
162
186
  if op != Selector::OP_READ
@@ -175,8 +199,8 @@ module Baykit
175
199
  def next_write(st)
176
200
  end
177
201
 
178
- def close_rudder(st)
179
- @selector.unregister(st.rudder.io)
202
+ def close_rudder(rd)
203
+ @selector.unregister(rd.io)
180
204
  super
181
205
  end
182
206
 
@@ -383,9 +407,7 @@ module Baykit
383
407
  raise e
384
408
 
385
409
  rescue => e
386
- if e.kind_of? EOFError
387
- BayLog.debug("%s Socket closed by peer: skt=%s", @agent, st.rudder.inspect)
388
- elsif e.kind_of? SystemCallError
410
+ if e.kind_of? SystemCallError
389
411
  BayLog.debug("%s O/S error: %s (skt=%s)", @agent, e.message, st.rudder.inspect)
390
412
  elsif e.kind_of? IOError
391
413
  BayLog.debug("%s IO error: %s (skt=%s)", @agent, e.message, st.rudder.inspect)
@@ -397,7 +419,7 @@ module Baykit
397
419
  end
398
420
  # Cannot handle Exception any more
399
421
  BayLog.error_e(e)
400
- @agent.send_error_letter(st, e, false)
422
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
401
423
  end
402
424
 
403
425
  st.access()
@@ -418,7 +440,7 @@ module Baykit
418
440
  client_rd.set_non_blocking
419
441
  #client_skt.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
420
442
 
421
- @agent.send_accepted_letter(st, client_rd, false)
443
+ @agent.send_accepted_letter(st.id, st.rudder, self, client_rd, false)
422
444
 
423
445
  end
424
446
 
@@ -426,16 +448,18 @@ module Baykit
426
448
  BayLog.trace("%s onConnectable", self)
427
449
 
428
450
  # check connected
429
- begin
430
- buf = ""
431
- st.rudder.io.syswrite(buf)
432
- rescue => e
433
- BayLog.error("Connect failed: %s", e)
434
- @agent.send_error_letter(st, e, false)
435
- 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)
436
461
  end
437
462
 
438
- @agent.send_connected_letter(st, false)
439
463
  end
440
464
 
441
465
  def on_readable(st)
@@ -445,28 +469,9 @@ module Baykit
445
469
 
446
470
  begin
447
471
  if st.handshaking
448
- begin
449
- # Calls accept API for client socket
450
- st.rudder.io.accept_nonblock
472
+ if handshake(st)
451
473
  st.handshaking = false
452
-
453
- BayLog.debug("%s Handshake done (rd=%s)", self, st.rudder)
454
- app_protocols = st.rudder.io.context.alpn_protocols
455
-
456
- # HELP ME
457
- # This code does not work!
458
- # We cannot get application protocol name
459
- proto = nil
460
- if app_protocols != nil && app_protocols.length > 0
461
- proto = app_protocols[0]
462
- end
463
-
464
- rescue IO::WaitReadable => e
465
- BayLog.debug("%s Handshake status: read more st=%s", self, st)
466
- return NextSocketAction::CONTINUE
467
- rescue IO::WaitWritable => e
468
- BayLog.debug("%s Handshake status: write more st=%s", self, st)
469
- req_write(st.rudder, "", nil, nil)
474
+ else
470
475
  return NextSocketAction::CONTINUE
471
476
  end
472
477
  end
@@ -480,41 +485,63 @@ module Baykit
480
485
  BayLog.debug("%s Read status: write more", self)
481
486
  @channel_handler.ask_to_write(@ch)
482
487
  return NextSocketAction::CONTINUE
483
- rescue EOFError => e
484
- BayLog.debug("%s EOF", self)
485
- len = 0
486
488
  end
487
489
 
488
490
  BayLog.debug("%s read %d bytes", self, len)
489
- @agent.send_read_letter(st, len, nil, false)
491
+ @agent.send_read_letter(st.id, st.rudder, self, len, nil, false)
490
492
 
491
493
  rescue Exception => e
492
494
  BayLog.debug_e(e, "%s Unhandled error", self)
493
- @agent.send_error_letter(st, e, false)
495
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
494
496
  return
495
497
  end
496
498
  end
497
499
 
498
500
  def on_writable(st)
499
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
+
500
510
  if st.write_queue.empty?
501
- 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
502
514
  end
503
515
 
504
- wunit = st.write_queue[0]
516
+ st.write_queue.length.times do |i|
517
+ wunit = st.write_queue[i]
505
518
 
506
- BayLog.debug("%s Try to write: rd=%s pkt=%s len=%d closed=%s adr=%s",
507
- self, st.rudder, wunit.tag, wunit.buf.length, st.closed, wunit.adr);
508
- #BayLog.debug(this + " " + new String(wUnit.buf.array(), 0, wUnit.buf.limit()));
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
509
529
 
510
- n = st.rudder.write(wunit.buf)
511
- #BayLog.debug("%s Wrote: rd=%s len=%d",self, st.rudder, n);
512
- wunit.buf.slice!(0, n)
513
- @agent.send_wrote_letter(st, n, false)
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)
532
+
533
+ len = wunit.buf.length
534
+ wunit.buf.slice!(0, n)
535
+
536
+ if n < len
537
+ BayLog.debug("%s Wrote %d bytes (Data remains)", self, n)
538
+ break
539
+ end
540
+ end
514
541
 
515
542
  rescue SystemCallError, IOError => e
516
543
  BayLog.debug_e(e, "%s IO error", self)
517
- @agent.send_error_letter(st, e, false)
544
+ @agent.send_error_letter(st.id, st.rudder, self, e, false)
518
545
  end
519
546
  end
520
547
 
@@ -538,6 +565,33 @@ module Baykit
538
565
 
539
566
  return mode_str
540
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
541
595
  end
542
596
  end
543
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,11 +82,11 @@ module Baykit
78
82
  end
79
83
  end
80
84
 
81
- @agent.send_read_letter(@state, @state.read_buf.length, 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
- @agent.send_error_letter(@state, e, false)
89
+ @agent.send_error_letter(@state_id, @state.rudder, @multiplexer, e, false)
86
90
  return false
87
91
  end
88
92
  end
@@ -140,7 +144,7 @@ module Baykit
140
144
  end
141
145
  end
142
146
 
143
- def req_write(rd, buf, len, adr, tag, &lis)
147
+ def req_write(rd, buf, adr, tag, &lis)
144
148
  st = get_rudder_state(rd)
145
149
  if st == nil
146
150
  BayLog.warn("Invalid rudder")
@@ -173,8 +177,9 @@ module Baykit
173
177
 
174
178
  def req_close(rd)
175
179
  st = get_rudder_state(rd)
176
- close_rudder(st)
177
- @agent.send_closed_letter(st, false)
180
+ st.closing = true
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