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.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +101 -93
- data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/letters/closed_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/letters/connected_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/letters/error_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/letters/letter.rb +7 -3
- data/lib/baykit/bayserver/agent/letters/read_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +2 -2
- data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +20 -22
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +44 -31
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
- data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +4 -4
- data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +2 -3
- data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +113 -59
- data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +22 -17
- data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +17 -13
- 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 +1 -1
- data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
- data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +43 -7
- data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
- data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +1 -3
- data/lib/baykit/bayserver/common/warp_ship.rb +4 -3
- data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +1 -3
- 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_harbor_docker.rb +25 -2
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +42 -26
- 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 +1 -6
- data/lib/baykit/bayserver/tours/tour_req.rb +4 -8
- data/lib/baykit/bayserver/tours/tour_res.rb +1 -8
- 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 +16 -20
- 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/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
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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,
|
|
85
|
+
@agent.send_connected_letter(st.id, rd, self, true)
|
|
78
86
|
rescue Exception => e
|
|
79
|
-
@agent.send_error_letter(st, e,
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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(
|
|
157
|
-
@agent.send_closed_letter(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
|
@@ -63,11 +63,11 @@ module Baykit
|
|
|
63
63
|
return true
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
def close_rudder(
|
|
67
|
-
BayLog.debug("%s closeRd %s
|
|
66
|
+
def close_rudder(rd)
|
|
67
|
+
BayLog.debug("%s closeRd %s", agent, rd)
|
|
68
68
|
|
|
69
69
|
begin
|
|
70
|
-
|
|
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/
|
|
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
|
-
|
|
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.
|
|
90
|
+
rd.io.connect_nonblock(adr)
|
|
77
91
|
rescue IO::WaitWritable => e
|
|
78
|
-
#
|
|
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
|
|
118
|
+
BayLog.debug("%s reqWrite st=%s tag=%s", @agent, st, tag)
|
|
99
119
|
|
|
100
|
-
if st == nil
|
|
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(
|
|
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(
|
|
179
|
-
@selector.unregister(
|
|
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?
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
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
|
-
|
|
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
|
-
|
|
516
|
+
st.write_queue.length.times do |i|
|
|
517
|
+
wunit = st.write_queue[i]
|
|
505
518
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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
|
-
|
|
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,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,
|
|
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
|
-
|
|
177
|
-
|
|
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
|
|
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
|