bayserver-core 3.0.2 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
  3. data/lib/baykit/bayserver/agent/grand_agent.rb +145 -133
  4. data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +17 -0
  5. data/lib/baykit/bayserver/agent/letters/closed_letter.rb +14 -0
  6. data/lib/baykit/bayserver/agent/letters/connected_letter.rb +14 -0
  7. data/lib/baykit/bayserver/agent/letters/error_letter.rb +16 -0
  8. data/lib/baykit/bayserver/agent/letters/letter.rb +19 -0
  9. data/lib/baykit/bayserver/agent/letters/package.rb +9 -0
  10. data/lib/baykit/bayserver/agent/letters/read_letter.rb +20 -0
  11. data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +17 -0
  12. data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +49 -49
  13. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +47 -32
  14. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
  15. data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +12 -28
  16. data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +20 -5
  17. data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +125 -87
  18. data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +24 -19
  19. data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +21 -15
  20. data/lib/baykit/bayserver/bay_log.rb +20 -16
  21. data/lib/baykit/bayserver/bayserver.rb +8 -15
  22. data/lib/baykit/bayserver/common/cities.rb +1 -1
  23. data/lib/baykit/bayserver/common/inbound_ship.rb +5 -45
  24. data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
  25. data/lib/baykit/bayserver/common/multiplexer.rb +5 -1
  26. data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +42 -11
  27. data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
  28. data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +2 -4
  29. data/lib/baykit/bayserver/common/warp_ship.rb +12 -7
  30. data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +2 -4
  31. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
  32. data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
  33. data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
  34. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +1 -1
  35. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
  36. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +43 -35
  37. data/lib/baykit/bayserver/docker/harbor.rb +14 -0
  38. data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
  39. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
  40. data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
  41. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
  42. data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
  43. data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
  44. data/lib/baykit/bayserver/mem_usage.rb +2 -0
  45. data/lib/baykit/bayserver/protocol/packet.rb +2 -1
  46. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +5 -5
  47. data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
  48. data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
  49. data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
  50. data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
  51. data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
  52. data/lib/baykit/bayserver/tours/tour.rb +18 -13
  53. data/lib/baykit/bayserver/tours/tour_req.rb +13 -15
  54. data/lib/baykit/bayserver/tours/tour_res.rb +42 -19
  55. data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
  56. data/lib/baykit/bayserver/util/headers.rb +2 -2
  57. data/lib/baykit/bayserver/util/http_status.rb +7 -0
  58. data/lib/baykit/bayserver/util/http_util.rb +16 -0
  59. data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
  60. data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
  61. data/lib/baykit/bayserver/util/selector.rb +43 -80
  62. data/lib/baykit/bayserver/util/simple_buffer.rb +1 -1
  63. data/lib/baykit/bayserver/version.rb +1 -1
  64. metadata +24 -21
  65. data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
  66. data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
  67. data/lib/baykit/bayserver/agent/letter.rb +0 -30
  68. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
  69. data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
  70. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
  71. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
  72. data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
  73. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
  74. data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
  75. data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
  76. data/lib/baykit/bayserver/watercraft/yacht.rb +0 -42
@@ -14,14 +14,12 @@ module Baykit
14
14
  class << self
15
15
  attr :num_agents
16
16
  attr :cur_id
17
- attr :anchored_port_map
18
17
  attr :monitors
19
18
  attr :finale
20
19
  end
21
20
 
22
21
  @num_agents = 0
23
22
  @cur_id = 0
24
- @anchored_port_map = []
25
23
  @monitors = {}
26
24
  @finale = false
27
25
 
@@ -67,23 +65,12 @@ module Baykit
67
65
 
68
66
  end
69
67
  rescue EOFError, IOError => e
70
- BayLog.fatal("Agent terminated")
68
+ BayLog.fatal("%s Agent terminated", self)
71
69
  rescue Exception => e
72
70
  BayLog.fatal_e(e)
73
71
  end
74
- end
75
72
 
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
73
+ GrandAgentMonitor.agent_aborted @agent_id, @child_pid, @anchorable
87
74
  end
88
75
 
89
76
  def shutdown()
@@ -124,33 +111,6 @@ module Baykit
124
111
 
125
112
  end
126
113
 
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
114
  def start
155
115
  @child_thread = Thread.new do
156
116
  run()
@@ -161,9 +121,8 @@ module Baykit
161
121
  # Class methods
162
122
  ########################################
163
123
 
164
- def self.init(num_agents, anchored_port_map)
124
+ def self.init(num_agents)
165
125
  @num_agents = num_agents
166
- @anchored_port_map = anchored_port_map
167
126
  @num_agents.times do
168
127
  add(true)
169
128
  end
@@ -185,12 +144,12 @@ module Baykit
185
144
  ports = ""
186
145
 
187
146
  no_close_io = {} # Port list not to close on spawned
188
- @anchored_port_map.each_key do |ch|
189
- no_close_io[ch] = ch
147
+ BayServer.anchorable_port_map.each_key do |rd|
148
+ no_close_io[rd.key()] = rd.key()
190
149
  if ports != ""
191
150
  ports +=","
192
151
  end
193
- ports += ch.fileno.to_s
152
+ ports += rd.key().fileno.to_s
194
153
  end
195
154
  new_argv << "-ports=" + ports
196
155
 
@@ -241,11 +200,52 @@ module Baykit
241
200
 
242
201
  end
243
202
 
203
+ def self.agent_aborted(agt_id, pid, anchorable)
204
+ BayLog.info(BayMessage.get(:MSG_GRAND_AGENT_SHUTDOWN, agt_id))
205
+
206
+ if pid != nil
207
+ begin
208
+ Process.kill("TERM", pid)
209
+ rescue => e
210
+ BayLog.debug_e(e, "Error on killing process")
211
+ end
212
+ Process.wait(pid)
213
+ end
214
+ @monitors.delete(agt_id)
215
+
216
+ if not @finale
217
+ if @monitors.length < @num_agents
218
+ begin
219
+ if !BayServer.harbor.multi_core
220
+ GrandAgent.add(-1, @anchorable)
221
+ end
222
+ self.add(@anchorable)
223
+ rescue => e
224
+ BayLog.error_e(e)
225
+ end
226
+ end
227
+ end
228
+ end
229
+
244
230
  def self.join
245
231
  while !@monitors.empty?
232
+ err = nil
246
233
  @monitors.values.each do |mon|
247
- mon.child_thread.join
248
- mon.agent_aborted
234
+ begin
235
+ mon.child_thread.join
236
+ sleep 5
237
+ rescue Interrupt => e
238
+ err = e
239
+ BayLog.error("%s Interrupted! Kill child: %d", mon, mon.child_pid)
240
+ begin
241
+ Process.kill("INT", mon.child_pid)
242
+ rescue SystemCallError => e
243
+ BayLog.error("%s Failed to kill child: %s", mon, e)
244
+ end
245
+ end
246
+ end
247
+ if err
248
+ raise err
249
249
  end
250
250
  end
251
251
  end
@@ -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_accepted_letter(st, nil, 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), nil, 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, nil, false)
85
+ @agent.send_connected_letter(st.id, rd, self, true)
78
86
  rescue Exception => e
79
- @agent.send_connected_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
 
@@ -106,17 +116,19 @@ module Baykit
106
116
  st.access
107
117
  end
108
118
 
109
- def req_write(rd, buf, adr, tag, lis)
119
+ def req_write(rd, buf, adr, tag, &lis)
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: %s", @agent, rd)
115
- 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
116
128
  end
117
129
 
118
- unt = WriteUnit.new(buf, adr, tag, lis)
119
- st.writing_lock.synchronize do
130
+ unt = WriteUnit.new(buf, adr, tag, &lis)
131
+ st.write_queue_lock.synchronize do
120
132
  st.write_queue << unt
121
133
  end
122
134
 
@@ -144,7 +156,9 @@ module Baykit
144
156
  return
145
157
  end
146
158
 
147
- Thread.new do
159
+ id = st.id
160
+
161
+ Thread.new do
148
162
  begin
149
163
  st = get_rudder_state(rd)
150
164
  if st == nil
@@ -152,7 +166,8 @@ module Baykit
152
166
  next
153
167
  end
154
168
 
155
- close_rudder(st)
169
+ close_rudder(rd)
170
+ @agent.send_closed_letter(id, rd, self, true)
156
171
  rescue Exception => e
157
172
  BayLog.fatal_e(e)
158
173
  @agent.shutdown
@@ -175,12 +190,9 @@ module Baykit
175
190
  end
176
191
 
177
192
  def next_read(st)
193
+ id = st.id
194
+
178
195
  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
196
 
185
197
  begin
186
198
  if st.handshaking
@@ -201,45 +213,48 @@ module Baykit
201
213
  end
202
214
 
203
215
  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
216
+ n = st.rudder.read(st.read_buf, st.buf_size)
210
217
 
211
- @agent.send_read_letter(st, n, nil, 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
212
225
 
213
226
  rescue Exception => e
214
- @agent.send_read_letter(st, -1, nil, e, true)
227
+ @agent.send_error_letter(id, st.rudder, self, e, true)
215
228
  end
216
229
  end
217
230
  end
218
231
 
219
232
  def next_write(st)
233
+ id = st.id
234
+
220
235
  Thread.new do
221
236
  BayLog.debug("%s next write st=%s", @agent, st)
222
237
 
223
- if st == nil || st.closed
238
+ if st == nil
224
239
  BayLog.warn("%s Channel is closed: %s", @agent, st.rudder)
225
240
  next
226
241
  end
227
242
 
228
243
  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);
244
+ BayLog.debug("%s Try to write: pkt=%s buflen=%d", self, u.tag, u.buf.length)
230
245
 
231
246
  n = 0
232
247
  begin
233
- if !st.closed && u.buf.length > 0
248
+ if u.buf.length > 0
234
249
  n = st.rudder.write(u.buf)
235
250
  u.buf.slice!(0, n)
236
251
  end
237
252
  rescue Exception => e
238
- @agent.send_wrote_letter(st, -1, e, true)
253
+ @agent.send_error_letter(id, st.rudder, self, e, true)
239
254
  next
240
255
  end
241
256
 
242
- @agent.send_wrote_letter(st, n, nil, true)
257
+ @agent.send_wrote_letter(id, st.rudder, self, n, true)
243
258
  end
244
259
  end
245
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
@@ -36,6 +36,13 @@ module Baykit
36
36
  st.access()
37
37
  end
38
38
 
39
+ def remove_rudder_state(rd)
40
+ @rudders_lock.synchronize do
41
+ @rudders.delete(rd.key())
42
+ end
43
+ @channel_count -= 1
44
+ end
45
+
39
46
  def get_rudder_state(rd)
40
47
  return find_rudder_state_by_key(rd.key)
41
48
  end
@@ -56,31 +63,15 @@ module Baykit
56
63
  return true
57
64
  end
58
65
 
59
- def close_rudder(st)
60
- BayLog.debug("%s closeRd %s state=%s closed=%s", agent, st.rudder, st, st.closed)
61
-
62
- @lock.synchronize do
63
- if st.closed
64
- return
65
- end
66
- st.closed = true
67
- end
68
-
69
- remove_rudder_state(st.rudder)
66
+ def close_rudder(rd)
67
+ BayLog.debug("%s closeRd %s", agent, rd)
70
68
 
71
69
  begin
72
- st.rudder.close()
70
+ rd.close()
73
71
  rescue IOError => e
74
72
  Baylog.error_e(e)
75
73
  end
76
74
 
77
- while consume_oldest_unit(st) do
78
-
79
- end
80
-
81
- if st.transporter != nil
82
- st.transporter.on_closed(st.rudder)
83
- end
84
75
  end
85
76
 
86
77
  def is_busy()
@@ -98,13 +89,6 @@ module Baykit
98
89
  end
99
90
  end
100
91
 
101
- def remove_rudder_state(rd)
102
- @rudders_lock.synchronize do
103
- @rudders.delete(rd.key())
104
- end
105
- @channel_count -= 1
106
- end
107
-
108
92
  def close_timeout_sockets
109
93
  if @rudders.empty?
110
94
  return
@@ -128,7 +112,7 @@ module Baykit
128
112
  end
129
113
 
130
114
  close_list.each do |st|
131
- close_rudder(st)
115
+ req_close(st.rudder)
132
116
  end
133
117
  end
134
118
 
@@ -139,7 +123,7 @@ module Baykit
139
123
  end
140
124
  copied.each do |st|
141
125
  if st.rudder != @agent.command_receiver.rudder
142
- close_rudder(st)
126
+ close_rudder(st.rudder)
143
127
  end
144
128
  end
145
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
@@ -40,15 +40,16 @@ module Baykit
40
40
 
41
41
  end
42
42
 
43
- def on_connect(rd)
43
+ def on_connected(rd)
44
44
  BayLog.trace("%s onConnect", self)
45
+ check_rudder rd
45
46
 
46
47
  return @ship.notify_connect
47
- ;
48
48
  end
49
49
 
50
50
  def on_read(rd, buf, adr)
51
51
  BayLog.debug("%s onRead", self)
52
+ check_rudder rd
52
53
 
53
54
  if buf.length == 0
54
55
  return @ship.notify_eof
@@ -78,31 +79,38 @@ module Baykit
78
79
  end
79
80
 
80
81
  def on_error(rd, e)
82
+ check_rudder rd
81
83
  @ship.notify_error(e)
82
84
  end
83
85
 
84
86
  def on_closed(rd)
87
+ check_rudder rd
85
88
  @ship.notify_close
86
89
  end
87
90
 
88
91
  def req_connect(rd, adr)
92
+ check_rudder rd
89
93
  @multiplexer.req_connect(rd, adr)
90
94
  end
91
95
 
92
96
  def req_read(rd)
97
+ check_rudder rd
93
98
  @multiplexer.req_read(rd)
94
99
  end
95
100
 
96
101
  def req_write(rd, buf, adr, tag, &lis)
97
- @multiplexer.req_write(rd, buf, adr, tag, lis)
102
+ check_rudder rd
103
+ @multiplexer.req_write(rd, buf, adr, tag, &lis)
98
104
  end
99
105
 
100
106
  def req_close(rd)
107
+ check_rudder rd
101
108
  @closed = true
102
109
  @multiplexer.req_close(rd)
103
110
  end
104
111
 
105
112
  def check_timeout(rd, duration_sec)
113
+ check_rudder rd
106
114
  return @ship.check_timeout(duration_sec)
107
115
  end
108
116
 
@@ -120,6 +128,13 @@ module Baykit
120
128
  def secure()
121
129
  return false
122
130
  end
131
+
132
+ private
133
+ def check_rudder(rd)
134
+ if rd != @ship.rudder
135
+ raise Sink.new("Invalid rudder: %s", rd)
136
+ end
137
+ end
123
138
  end
124
139
  end
125
140
  end