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.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +145 -133
- data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +17 -0
- data/lib/baykit/bayserver/agent/letters/closed_letter.rb +14 -0
- data/lib/baykit/bayserver/agent/letters/connected_letter.rb +14 -0
- data/lib/baykit/bayserver/agent/letters/error_letter.rb +16 -0
- data/lib/baykit/bayserver/agent/letters/letter.rb +19 -0
- data/lib/baykit/bayserver/agent/letters/package.rb +9 -0
- data/lib/baykit/bayserver/agent/letters/read_letter.rb +20 -0
- data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +17 -0
- data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +49 -49
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +47 -32
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
- data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +12 -28
- data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +20 -5
- data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +125 -87
- data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +24 -19
- data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +21 -15
- data/lib/baykit/bayserver/bay_log.rb +20 -16
- data/lib/baykit/bayserver/bayserver.rb +8 -15
- data/lib/baykit/bayserver/common/cities.rb +1 -1
- data/lib/baykit/bayserver/common/inbound_ship.rb +5 -45
- data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
- data/lib/baykit/bayserver/common/multiplexer.rb +5 -1
- data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +42 -11
- data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
- data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +2 -4
- data/lib/baykit/bayserver/common/warp_ship.rb +12 -7
- data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +2 -4
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
- data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
- data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +1 -1
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +43 -35
- data/lib/baykit/bayserver/docker/harbor.rb +14 -0
- data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
- data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
- data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
- data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
- data/lib/baykit/bayserver/mem_usage.rb +2 -0
- data/lib/baykit/bayserver/protocol/packet.rb +2 -1
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +5 -5
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
- data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
- data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
- data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
- data/lib/baykit/bayserver/tours/tour.rb +18 -13
- data/lib/baykit/bayserver/tours/tour_req.rb +13 -15
- data/lib/baykit/bayserver/tours/tour_res.rb +42 -19
- data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
- data/lib/baykit/bayserver/util/headers.rb +2 -2
- data/lib/baykit/bayserver/util/http_status.rb +7 -0
- data/lib/baykit/bayserver/util/http_util.rb +16 -0
- data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
- data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
- data/lib/baykit/bayserver/util/selector.rb +43 -80
- data/lib/baykit/bayserver/util/simple_buffer.rb +1 -1
- data/lib/baykit/bayserver/version.rb +1 -1
- metadata +24 -21
- data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
- data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
- data/lib/baykit/bayserver/agent/letter.rb +0 -30
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
- data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
- data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
- 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
|
|
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
|
-
|
|
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.
|
|
90
|
+
rd.io.connect_nonblock(adr)
|
|
79
91
|
rescue IO::WaitWritable => e
|
|
80
|
-
#
|
|
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
|
|
118
|
+
BayLog.debug("%s reqWrite st=%s tag=%s", @agent, st, tag)
|
|
101
119
|
|
|
102
|
-
if st == nil
|
|
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.
|
|
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
|
-
|
|
137
|
-
|
|
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(
|
|
180
|
-
@selector.unregister(
|
|
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
|
|
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
|
|
259
|
-
@agent, self.class.op_mode(ch_op.op), ch_op.to_connect, ch_op.
|
|
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,
|
|
265
|
-
@operations << ChannelOperation.new(rd, op, to_connect
|
|
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.
|
|
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.
|
|
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?
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
518
|
-
|
|
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
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
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.
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
147
|
+
def req_write(rd, buf, adr, tag, &lis)
|
|
145
148
|
st = get_rudder_state(rd)
|
|
146
149
|
if st == nil
|
|
147
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
291
|
-
BayLog.debug("remove: %s",
|
|
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 ==
|
|
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
|
|
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.
|
|
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
|
-
|
|
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(
|
|
157
|
-
st
|
|
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,
|
|
167
|
+
@agent.send_read_letter(st.id, rd, self, len, nil, true)
|
|
164
168
|
|
|
165
169
|
rescue Exception => e
|
|
166
|
-
@agent.
|
|
170
|
+
@agent.send_error_letter(st.id, rd, self, e, true)
|
|
167
171
|
end
|
|
168
172
|
end
|
|
169
173
|
|
|
170
|
-
def do_next_write(
|
|
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,
|
|
190
|
+
@agent.send_wrote_letter(st.id, rd, self, len, true)
|
|
185
191
|
|
|
186
192
|
rescue Exception => e
|
|
187
|
-
@agent.
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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:"
|