bayserver-core 2.3.2 → 3.0.0

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +0 -26
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +6 -6
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +97 -38
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +444 -134
  6. data/lib/baykit/bayserver/agent/letter.rb +30 -0
  7. data/lib/baykit/bayserver/agent/lifecycle_listener.rb +9 -7
  8. data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +298 -0
  9. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +257 -0
  10. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +52 -0
  11. data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +150 -0
  12. data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +129 -0
  13. data/lib/baykit/bayserver/agent/multiplexer/rudder_state.rb +81 -0
  14. data/lib/baykit/bayserver/agent/multiplexer/secure_transporter.rb +50 -0
  15. data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +561 -0
  16. data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +311 -0
  17. data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +194 -0
  18. data/lib/baykit/bayserver/agent/multiplexer/transporter.rb +61 -0
  19. data/lib/baykit/bayserver/agent/multiplexer/write_unit.rb +30 -0
  20. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +0 -319
  21. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +2 -1
  22. data/lib/baykit/bayserver/agent/timer_handler.rb +1 -1
  23. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +7 -7
  24. data/lib/baykit/bayserver/agent/transporter/package.rb +0 -3
  25. data/lib/baykit/bayserver/agent/transporter/transporter.rb +5 -139
  26. data/lib/baykit/bayserver/bay_log.rb +1 -0
  27. data/lib/baykit/bayserver/bayserver.rb +32 -28
  28. data/lib/baykit/bayserver/{util → common}/groups.rb +1 -1
  29. data/lib/baykit/bayserver/common/inbound_handler.rb +12 -0
  30. data/lib/baykit/bayserver/{docker/base → common}/inbound_ship.rb +94 -19
  31. data/lib/baykit/bayserver/{docker/base → common}/inbound_ship_store.rb +7 -9
  32. data/lib/baykit/bayserver/common/multiplexer.rb +98 -0
  33. data/lib/baykit/bayserver/common/postpone.rb +15 -0
  34. data/lib/baykit/bayserver/common/read_only_ship.rb +42 -0
  35. data/lib/baykit/bayserver/common/recipient.rb +24 -0
  36. data/lib/baykit/bayserver/common/vehicle.rb +24 -0
  37. data/lib/baykit/bayserver/common/vehicle_runner.rb +127 -0
  38. data/lib/baykit/bayserver/{docker/warp → common}/warp_data.rb +18 -10
  39. data/lib/baykit/bayserver/common/warp_handler.rb +27 -0
  40. data/lib/baykit/bayserver/{docker/warp → common}/warp_ship.rb +107 -27
  41. data/lib/baykit/bayserver/{docker/warp → common}/warp_ship_store.rb +3 -8
  42. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +2 -2
  43. data/lib/baykit/bayserver/docker/base/port_base.rb +59 -27
  44. data/lib/baykit/bayserver/docker/{warp/warp_docker.rb → base/warp_base.rb} +43 -50
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +118 -31
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +60 -63
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +11 -10
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +13 -4
  49. data/lib/baykit/bayserver/docker/city.rb +27 -13
  50. data/lib/baykit/bayserver/docker/club.rb +8 -8
  51. data/lib/baykit/bayserver/docker/docker.rb +9 -1
  52. data/lib/baykit/bayserver/docker/harbor.rb +184 -22
  53. data/lib/baykit/bayserver/docker/permission.rb +7 -6
  54. data/lib/baykit/bayserver/docker/port.rb +39 -11
  55. data/lib/baykit/bayserver/docker/secure.rb +11 -9
  56. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +99 -4
  57. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +6 -2
  58. data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +92 -0
  59. data/lib/baykit/bayserver/docker/town.rb +31 -15
  60. data/lib/baykit/bayserver/docker/trouble.rb +17 -5
  61. data/lib/baykit/bayserver/docker/warp.rb +34 -0
  62. data/lib/baykit/bayserver/mem_usage.rb +9 -9
  63. data/lib/baykit/bayserver/protocol/command_packer.rb +1 -8
  64. data/lib/baykit/bayserver/protocol/packet_packer.rb +7 -11
  65. data/lib/baykit/bayserver/protocol/packet_store.rb +4 -4
  66. data/lib/baykit/bayserver/protocol/protocol_handler.rb +26 -8
  67. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +5 -5
  68. data/lib/baykit/bayserver/rudders/io_rudder.rb +62 -0
  69. data/lib/baykit/bayserver/rudders/rudder.rb +29 -0
  70. data/lib/baykit/bayserver/{watercraft → ships}/ship.rb +65 -41
  71. data/lib/baykit/bayserver/taxi/taxi.rb +15 -10
  72. data/lib/baykit/bayserver/taxi/taxi_runner.rb +9 -94
  73. data/lib/baykit/bayserver/tours/read_file_taxi.rb +2 -2
  74. data/lib/baykit/bayserver/tours/req_content_handler.rb +16 -13
  75. data/lib/baykit/bayserver/tours/tour.rb +2 -2
  76. data/lib/baykit/bayserver/tours/tour_handler.rb +36 -0
  77. data/lib/baykit/bayserver/tours/tour_req.rb +14 -24
  78. data/lib/baykit/bayserver/tours/tour_res.rb +5 -89
  79. data/lib/baykit/bayserver/tours/tour_store.rb +5 -5
  80. data/lib/baykit/bayserver/train/train_runner.rb +17 -13
  81. data/lib/baykit/bayserver/util/data_consume_listener.rb +1 -1
  82. data/lib/baykit/bayserver/util/executor_service.rb +11 -7
  83. data/lib/baykit/bayserver/util/ip_matcher.rb +9 -39
  84. data/lib/baykit/bayserver/util/locale.rb +1 -1
  85. data/lib/baykit/bayserver/util/selector.rb +24 -5
  86. data/lib/baykit/bayserver/util/sys_util.rb +6 -6
  87. data/lib/baykit/bayserver/version.rb +1 -1
  88. metadata +37 -18
  89. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +0 -231
  90. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +0 -55
  91. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +0 -81
  92. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +0 -42
  93. data/lib/baykit/bayserver/docker/warp/package.rb +0 -4
  94. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +0 -112
  95. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +0 -38
  96. /data/lib/baykit/bayserver/{util → common}/cities.rb +0 -0
@@ -0,0 +1,30 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Agent
4
+ class Letter
5
+ ACCEPTED = 1
6
+ CONNECTED = 2
7
+ READ = 3
8
+ WROTE = 4
9
+ CLOSEREQ = 5
10
+
11
+ attr :type
12
+ attr :state
13
+ attr :n_bytes
14
+ attr :address
15
+ attr :err
16
+ attr :client_rudder
17
+
18
+ def initialize(type, st, client_rd, n, adr, err)
19
+ @type = type
20
+ @state = st
21
+ @client_rudder = client_rd
22
+ @n_bytes = n
23
+ @err = err
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -2,13 +2,15 @@
2
2
  module Baykit
3
3
  module BayServer
4
4
  module Agent
5
- module LifecycleListener
6
- #
7
- # interface
8
- #
9
- # void add(int agentId);
10
- # void remove(int agentId);
11
- #
5
+ module LifecycleListener # interface
6
+
7
+ def add(agent_id)
8
+ raise NotImplementedError
9
+ end
10
+
11
+ def remove(agent_id)
12
+ raise NotImplementedError
13
+ end
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,298 @@
1
+ require 'fcntl'
2
+ require 'baykit/bayserver/agent/grand_agent'
3
+ require 'baykit/bayserver/rudders/io_rudder'
4
+ require 'baykit/bayserver/util/io_util'
5
+
6
+ module Baykit
7
+ module BayServer
8
+ module Agent
9
+ module Monitor
10
+ class GrandAgentMonitor
11
+ include Baykit::BayServer::Util
12
+ include Baykit::BayServer::Rudders
13
+
14
+ class << self
15
+ attr :num_agents
16
+ attr :cur_id
17
+ attr :anchored_port_map
18
+ attr :monitors
19
+ attr :finale
20
+ end
21
+
22
+ @num_agents = 0
23
+ @cur_id = 0
24
+ @anchored_port_map = []
25
+ @monitors = {}
26
+ @finale = false
27
+
28
+ attr :agent_id
29
+ attr :anchorable
30
+ attr :rudder
31
+ attr :child_thread
32
+ attr :child_pid
33
+
34
+ def initialize(agt_id, anchorable, rd, child_thread, child_pid)
35
+ @agent_id = agt_id
36
+ @anchorable = anchorable
37
+ @rudder = rd
38
+ @child_thread = child_thread
39
+ @child_pid = child_pid
40
+ end
41
+
42
+ def to_s()
43
+ return "Monitor##{@agent_id}"
44
+ end
45
+
46
+ def run()
47
+ begin
48
+ while true do
49
+ buf = " " * 4
50
+
51
+ n = @rudder.read(buf, 4)
52
+ if n == -1
53
+ raise EOFError.new
54
+ end
55
+ if n < 4
56
+ raise IOError.new("Cannot read int: nbytes=#{n}")
57
+ end
58
+ res = buffer_to_int(buf)
59
+ if res == GrandAgent::CMD_CLOSE
60
+ BayLog.debug("%s read Close", self)
61
+ break
62
+ elsif res == GrandAgent::CMD_CATCHUP
63
+ on_read_catch_up
64
+ else
65
+ BayLog.debug("%s read OK: %d", self, res);
66
+ end
67
+
68
+ end
69
+ rescue EOFError, IOError => e
70
+ BayLog.fatal("Agent terminated")
71
+ rescue Exception => e
72
+ BayLog.fatal_e(e)
73
+ end
74
+ end
75
+
76
+ def on_readable()
77
+ begin
78
+ res = IOUtil.read_int32(@communication_channel)
79
+ if res == nil || res == GrandAgent::CMD_CLOSE
80
+ close()
81
+ else
82
+ BayLog.debug("%s read OK: %d", self, res)
83
+ end
84
+ rescue IO::WaitReadable
85
+ #BayLog.debug("%s no data", self)
86
+ end
87
+ end
88
+
89
+ def shutdown()
90
+ BayLog.debug("%s send shutdown command", self)
91
+ send(GrandAgent::CMD_SHUTDOWN)
92
+ end
93
+
94
+ def abort()
95
+ BayLog.debug("%s Send abort command", self)
96
+ send(GrandAgent::CMD_ABORT)
97
+ end
98
+
99
+ def reload_cert()
100
+ BayLog.debug("%s Send reload command", self)
101
+ send(GrandAgent::CMD_RELOAD_CERT)
102
+ end
103
+
104
+ def print_usage()
105
+ BayLog.debug("%s Send mem_usage command", self)
106
+ send(GrandAgent::CMD_MEM_USAGE)
107
+ sleep(0.5) # Lazy implementation
108
+ end
109
+
110
+ def send(cmd)
111
+ BayLog.debug("%s send command %s rd=%s", self, cmd, @rudder)
112
+ buf = GrandAgentMonitor.int_to_buffer(cmd)
113
+ @rudder.write(buf)
114
+ end
115
+
116
+ def close()
117
+ @rudder.close()
118
+ end
119
+
120
+ def on_read_catch_up()
121
+
122
+ end
123
+ def req_catch_up()
124
+
125
+ end
126
+
127
+ def agent_aborted()
128
+ BayLog.info(BayMessage.get(:MSG_GRAND_AGENT_SHUTDOWN, @agent_id))
129
+
130
+ if @child_pid != nil
131
+ begin
132
+ Process.kill("TERM", @child_pid)
133
+ rescue => e
134
+ BayLog.debug_e(e, "Error on killing process")
135
+ end
136
+ Process.wait(@child_pid)
137
+ end
138
+ GrandAgentMonitor.monitors.delete(@agent_id)
139
+
140
+ if not GrandAgentMonitor.finale
141
+ if GrandAgentMonitor.monitors.length < GrandAgentMonitor.num_agents
142
+ begin
143
+ if !BayServer.harbor.multi_core
144
+ GrandAgent.add(-1, @anchorable)
145
+ end
146
+ GrandAgentMonitor.add(@anchorable)
147
+ rescue => e
148
+ BayLog.error_e(e)
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ def start
155
+ @child_thread = Thread.new do
156
+ run()
157
+ end
158
+ end
159
+
160
+ ########################################
161
+ # Class methods
162
+ ########################################
163
+
164
+ def self.init(num_agents, anchored_port_map)
165
+ @num_agents = num_agents
166
+ @anchored_port_map = anchored_port_map
167
+ @num_agents.times do
168
+ add(true)
169
+ end
170
+ end
171
+
172
+ def self.add(anchoroable)
173
+ @cur_id = @cur_id + 1
174
+ agt_id = @cur_id
175
+ if agt_id > 100
176
+ BayLog.error("Too many agents started")
177
+ exit(1)
178
+ end
179
+
180
+ if BayServer.harbor.multi_core
181
+ new_argv = BayServer.commandline_args.dup
182
+ new_argv.insert(0, "ruby")
183
+ new_argv << "-agentid=" + agt_id.to_s
184
+
185
+ ports = ""
186
+
187
+ no_close_io = {} # Port list not to close on spawned
188
+ @anchored_port_map.each_key do |ch|
189
+ no_close_io[ch] = ch
190
+ if ports != ""
191
+ ports +=","
192
+ end
193
+ ports += ch.fileno.to_s
194
+ end
195
+ new_argv << "-ports=" + ports
196
+
197
+ server = TCPServer.open("localhost", 0)
198
+ #BayLog.info("port=%d", server.local_address.ip_port)
199
+ new_argv << "-monitor_port=" + server.local_address.ip_port.to_s
200
+
201
+ if SysUtil.run_on_windows()
202
+ child_pid = spawn(ENV, new_argv.join(" "))
203
+ else
204
+ child_pid = spawn(ENV, new_argv.join(" "), no_close_io)
205
+ end
206
+
207
+ BayLog.debug("Process spawned cmd=%s pid=%d", new_argv, child_pid)
208
+
209
+ client_socket = server.accept()
210
+ server.close()
211
+
212
+ else
213
+
214
+ if SysUtil::run_on_windows()
215
+ pair = Socket.socketpair(Socket::AF_INET, Socket::SOCK_STREAM, 0)
216
+ else
217
+ pair = Socket.socketpair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
218
+ end
219
+
220
+ client_socket = pair[0]
221
+ GrandAgent.add(agt_id, anchoroable)
222
+
223
+ # Agents run on single core (thread mode)
224
+ child_thread = Thread.new() do
225
+ agt = GrandAgent.get(agt_id)
226
+ agt.add_command_receiver(IORudder.new(pair[1]))
227
+ agt.start()
228
+ end
229
+
230
+ end
231
+
232
+ mon =
233
+ GrandAgentMonitor.new(
234
+ agt_id,
235
+ anchoroable,
236
+ IORudder.new(client_socket),
237
+ child_thread,
238
+ child_pid)
239
+ @monitors[agt_id] = mon
240
+ mon.start
241
+
242
+ end
243
+
244
+ def self.join
245
+ while !@monitors.empty?
246
+ @monitors.values.each do |mon|
247
+ mon.child_thread.join
248
+ mon.agent_aborted
249
+ end
250
+ end
251
+ end
252
+ def self.reload_cert_all()
253
+ @monitors.values.each { |mon| mon.reload_cert() }
254
+ end
255
+
256
+ def self.restart_all()
257
+ old_monitors = @monitors.dup()
258
+
259
+ #@agent_count.times {add()}
260
+
261
+ old_monitors.values.each { |mon| mon.shutdown() }
262
+ end
263
+
264
+ def self.shutdown_all()
265
+ @finale = true
266
+ @monitors.dup().values.each do |mon|
267
+ mon.shutdown()
268
+ end
269
+ end
270
+
271
+ def self.abort_all()
272
+ @finale = true
273
+ @monitors.dup().values.each do |mon|
274
+ mon.abort()
275
+ end
276
+ exit(1)
277
+ end
278
+
279
+ def self.print_usage_all()
280
+ @monitors.values.each do |mon|
281
+ mon.print_usage()
282
+ end
283
+ end
284
+
285
+ def self.buffer_to_int(buf)
286
+ return buf.unpack("N").first
287
+ end
288
+
289
+ def self.int_to_buffer(val)
290
+ return [val].pack("N")
291
+ end
292
+
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
298
+
@@ -0,0 +1,257 @@
1
+ require 'baykit/bayserver/rudders/io_rudder'
2
+
3
+ require 'baykit/bayserver/agent/multiplexer/multiplexer_base'
4
+ require 'baykit/bayserver/agent/multiplexer/job_multiplexer_base'
5
+
6
+
7
+ module Baykit
8
+ module BayServer
9
+ module Agent
10
+ module Multiplexer
11
+ class JobMultiplexer < JobMultiplexerBase
12
+ include Baykit::BayServer::Agent::TimerHandler #implements
13
+ include Baykit::BayServer::Common::Recipient # implements
14
+ include Baykit::BayServer::Agent::Multiplexer
15
+
16
+ include Baykit::BayServer::Rudders
17
+ include Baykit::BayServer::Util
18
+
19
+ def initialize(agt, anchorable)
20
+ super
21
+ end
22
+ def to_s
23
+ return "JobMpx[#{@agent}]"
24
+ end
25
+
26
+
27
+ #########################################
28
+ # Implements Multiplexer
29
+ #########################################
30
+
31
+ def req_accept(rd)
32
+ BayLog.debug("%s reqAccept isShutdown=%s", @agent, @agent.aborted)
33
+ if @agent.aborted
34
+ return
35
+ end
36
+
37
+ st = get_rudder_state(rd)
38
+
39
+ Thread.new do
40
+ begin
41
+ if @agent.aborted
42
+ next
43
+ end
44
+
45
+ begin
46
+ client_skt, adr = rd.io.accept
47
+ rescue Exception => e
48
+ @agent.send_accepted_letter(st, nil, e, true)
49
+ next
50
+ end
51
+
52
+ BayLog.debug("%s Accepted skt=%s", @agent, client_skt)
53
+ if agent.aborted
54
+ BayLog.error("%s Agent is not alive (close)", @agent);
55
+ client_skt.close
56
+ else
57
+ @agent.send_accepted_letter(st, IORudder.new(client_skt), nil, true)
58
+ end
59
+
60
+ rescue Exception => e
61
+ BayLog.fatal_e(e)
62
+ @agent.shutdown
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+
69
+ 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
+
73
+ Thread.new do
74
+ begin
75
+ rd.io.connect(adr)
76
+ BayLog.debug("%s Connected rd=%s", @agent, rd)
77
+ @agent.send_connected_letter(st, nil, false)
78
+ rescue Exception => e
79
+ @agent.send_connected_letter(st, e, false)
80
+ return
81
+ end
82
+ end
83
+
84
+ st.connecting = true
85
+ end
86
+
87
+ def req_read(rd)
88
+ st = get_rudder_state(rd)
89
+ if st == nil
90
+ return
91
+ end
92
+
93
+ BayLog.debug("%s reqRead rd=%s state=%s", @agent, st.rudder, st);
94
+ need_read = false
95
+ st.reading_lock.synchronize do
96
+ if !st.reading
97
+ need_read = true
98
+ st.reading = true
99
+ end
100
+ end
101
+
102
+ if need_read
103
+ next_read(st)
104
+ end
105
+
106
+ st.access
107
+ end
108
+
109
+ def req_write(rd, buf, adr, tag, lis)
110
+ st = get_rudder_state(rd)
111
+ BayLog.debug("%s reqWrite st=%s", @agent, st)
112
+
113
+ if st == nil || st.closed
114
+ BayLog.warn("%s Channel is closed: %s", @agent, rd)
115
+ return
116
+ end
117
+
118
+ unt = WriteUnit.new(buf, adr, tag, lis)
119
+ st.writing_lock.synchronize do
120
+ st.write_queue << unt
121
+ end
122
+
123
+ need_write = false
124
+ st.writing_lock.synchronize do
125
+ if !st.writing
126
+ need_write = true
127
+ st.writing = true
128
+ end
129
+ end
130
+
131
+ if need_write
132
+ next_write(st)
133
+ end
134
+
135
+ st.access
136
+ end
137
+
138
+ def req_close(rd)
139
+ st = get_rudder_state(rd)
140
+ BayLog.debug("%s reqClose st=%s", @agent, st);
141
+
142
+ if st == nil
143
+ BayLog.warn("%s channel state not found: %s", @agent, rd)
144
+ return
145
+ end
146
+
147
+ Thread.new do
148
+ begin
149
+ st = get_rudder_state(rd)
150
+ if st == nil
151
+ BayLog.debug("%s Rudder is already closed: rd=%s", @agent, rd)
152
+ next
153
+ end
154
+
155
+ close_rudder(st)
156
+ rescue Exception => e
157
+ BayLog.fatal_e(e)
158
+ @agent.shutdown
159
+ end
160
+ end
161
+
162
+ st.access
163
+ end
164
+
165
+ def cancel_read(st)
166
+
167
+ end
168
+
169
+ def cancel_write(st)
170
+
171
+ end
172
+
173
+ def next_accept(st)
174
+ req_accept(st.rudder)
175
+ end
176
+
177
+ def next_read(st)
178
+ Thread.new do
179
+ if st.closed
180
+ #channel is already closed
181
+ BayLog.debug("%s Rudder is already closed: rd=%s", @agent, st.rudder);
182
+ next
183
+ end
184
+
185
+ begin
186
+ if st.handshaking
187
+ # Calls accept API for client socket
188
+ st.rudder.io.accept
189
+ st.handshaking = false
190
+
191
+ BayLog.debug("%s Handshake done (rd=%s)", self, st.rudder)
192
+ app_protocols = st.rudder.io.context.alpn_protocols
193
+
194
+ # HELP ME
195
+ # This code does not work!
196
+ # We cannot get application protocol name
197
+ proto = nil
198
+ if app_protocols != nil && app_protocols.length > 0
199
+ proto = app_protocols[0]
200
+ end
201
+ end
202
+
203
+ BayLog.debug("%s Try to Read (rd=%s)", @agent, st.rudder)
204
+ begin
205
+ n = st.rudder.read(st.read_buf, st.buf_size)
206
+ rescue EOFError => e
207
+ n = 0
208
+ st.read_buf.clear
209
+ end
210
+
211
+ @agent.send_read_letter(st, n, nil, nil, true)
212
+
213
+ rescue Exception => e
214
+ @agent.send_read_letter(st, -1, nil, e, true)
215
+ end
216
+ end
217
+ end
218
+
219
+ def next_write(st)
220
+ Thread.new do
221
+ BayLog.debug("%s next write st=%s", @agent, st)
222
+
223
+ if st == nil || st.closed
224
+ BayLog.warn("%s Channel is closed: %s", @agent, st.rudder)
225
+ next
226
+ end
227
+
228
+ u = st.write_queue[0]
229
+ BayLog.debug("%s Try to write: pkt=%s buflen=%d closed=%s", self, u.tag, u.buf.length, st.closed);
230
+
231
+ n = 0
232
+ begin
233
+ if !st.closed && u.buf.length > 0
234
+ n = st.rudder.write(u.buf)
235
+ u.buf.slice!(0, n)
236
+ end
237
+ rescue Exception => e
238
+ @agent.send_wrote_letter(st, -1, e, true)
239
+ next
240
+ end
241
+
242
+ @agent.send_wrote_letter(st, n, nil, true)
243
+ end
244
+ end
245
+
246
+ def is_non_blocking()
247
+ return false
248
+ end
249
+
250
+ def use_async_api()
251
+ return false
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,52 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Agent
5
+ module Multiplexer
6
+ class JobMultiplexerBase < MultiplexerBase
7
+ include TimerHandler
8
+
9
+ attr :anchorable
10
+ attr :pipe
11
+
12
+ def initialize(agt, anchorable)
13
+ super(agt)
14
+
15
+ @anchorable = anchorable
16
+ @agent.add_timer_handler(self)
17
+
18
+ @pipe = IO::pipe
19
+ end
20
+
21
+ #########################################
22
+ # Implements Multiplexer
23
+ #########################################
24
+
25
+ def shutdown()
26
+ close_all()
27
+ end
28
+
29
+ def on_free()
30
+ if @agent.aborted
31
+ return
32
+ end
33
+
34
+ if @anchorable
35
+ BayServer::anchorable_port_map.keys.each do |rd|
36
+ req_accept(rd)
37
+ end
38
+ end
39
+ end
40
+
41
+ #########################################
42
+ # Implements TimerHandler
43
+ #########################################
44
+
45
+ def on_timer()
46
+ close_timeout_sockets()
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end