bayserver-core 2.3.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -2,12 +2,18 @@ require 'socket'
2
2
  require 'objspace'
3
3
 
4
4
  require 'baykit/bayserver/sink'
5
- require 'baykit/bayserver/agent/accept_handler'
6
5
  require 'baykit/bayserver/agent/command_receiver'
7
- require 'baykit/bayserver/agent/grand_agent_monitor'
8
- require 'baykit/bayserver/agent/spin_handler'
6
+ require 'baykit/bayserver/agent/letter'
7
+ require 'baykit/bayserver/agent/multiplexer/spider_multiplexer'
8
+ require 'baykit/bayserver/agent/multiplexer/spin_multiplexer'
9
+ require 'baykit/bayserver/agent/multiplexer/job_multiplexer'
10
+ require 'baykit/bayserver/agent/multiplexer/taxi_multiplexer'
11
+ require 'baykit/bayserver/agent/multiplexer/rudder_state'
12
+ require 'baykit/bayserver/agent/monitor/grand_agent_monitor'
9
13
  require 'baykit/bayserver/agent/signal/signal_agent'
10
14
 
15
+ require 'baykit/bayserver/docker/harbor'
16
+
11
17
  require 'baykit/bayserver/train/train_runner'
12
18
  require 'baykit/bayserver/taxi/taxi_runner'
13
19
 
@@ -22,6 +28,8 @@ module Baykit
22
28
  include Baykit::BayServer::Train
23
29
  include Baykit::BayServer::Taxi
24
30
  include Baykit::BayServer::Agent::Signal
31
+ include Baykit::BayServer::Agent::Multiplexer
32
+ include Baykit::BayServer::Docker
25
33
  include Baykit::BayServer::Util
26
34
 
27
35
  SELECT_TIMEOUT_SEC = 10
@@ -32,66 +40,88 @@ module Baykit
32
40
  CMD_MEM_USAGE = 3
33
41
  CMD_SHUTDOWN = 4
34
42
  CMD_ABORT = 5
43
+ CMD_CATCHUP = 6
35
44
 
36
45
  attr :agent_id
37
46
  attr :anchorable
38
- attr :non_blocking_handler
39
- attr :spin_handler
40
- attr :accept_handler
47
+ attr :net_multiplexer
48
+ attr :job_multiplexer
49
+ attr :taxi_multiplexer
50
+ attr :spin_multiplexer
51
+ attr :spider_multiplexer
52
+ attr :job_multiplexer
53
+ attr :taxi_multiplexer
54
+ attr :recipient
55
+
41
56
  attr :send_wakeup_pipe
42
- attr :select_wakeup_pipe
43
- attr :select_timeout_sec
44
57
  attr :max_inbound_ships
45
- attr :selector
46
58
  attr :unanchorable_transporters
47
59
  attr :aborted
48
60
  attr :command_receiver
49
61
  attr :timer_handlers
62
+ attr :last_timeout_check
63
+ attr :letter_queue
64
+ attr :letter_queue_lock
65
+ attr :postpone_queue
66
+ attr :postpone_queue_lock
50
67
 
51
68
  class << self
52
69
  attr :agents
53
70
  attr :listeners
54
71
  attr :agent_count
55
- attr :anchorable_port_map
56
- attr :unanchorable_port_map
57
72
  attr :max_ships
58
73
  attr :max_agent_id
59
- attr :multi_core
60
74
  end
61
75
 
62
76
  # Class variables
63
77
  @agent_count = 0
64
78
  @max_agent_id = 0
65
79
  @max_ships = 0
66
- @multi_core = false
67
80
 
68
81
  @agents = []
69
82
  @listeners = []
70
83
 
71
- @anchorable_port_map = {}
72
- @unanchorable_port_map = {}
73
84
  @finale = false
74
85
 
75
86
  def initialize (agent_id, max_ships, anchorable)
76
87
  @agent_id = agent_id
88
+ @max_inbound_ships = max_ships
77
89
  @anchorable = anchorable
78
-
79
90
  @timer_handlers = []
80
- if @anchorable
81
- @accept_handler = AcceptHandler.new(self, GrandAgent.anchorable_port_map)
82
- else
83
- @accept_handler = nil
91
+ @select_timeout_sec = SELECT_TIMEOUT_SEC
92
+ @aborted = false
93
+ @letter_queue = []
94
+ @letter_queue_lock = Mutex.new
95
+ @postpone_queue = []
96
+ @postpone_queue_lock = Mutex.new
97
+
98
+ @spider_multiplexer = SpiderMultiplexer.new(self, anchorable)
99
+ @spin_multiplexer = SpinMultiplexer.new(self)
100
+ @job_multiplexer = JobMultiplexer.new(self, anchorable)
101
+ @taxi_multiplexer = TaxiMultiplexer.new(self)
102
+
103
+ case BayServer.harbor.recipient
104
+ when Harbor::RECIPIENT_TYPE_SPIDER
105
+ @recipient = @spider_multiplexer
106
+
107
+ when Harbor::RECIPIENT_TYPE_PIPE
108
+ raise NotImplementedError.new
84
109
  end
85
110
 
86
- @spin_handler = SpinHandler.new(self)
87
- @non_blocking_handler = NonBlockingHandler.new(self)
111
+ case BayServer.harbor.net_multiplexer
112
+ when Harbor::MULTIPLEXER_TYPE_SPIDER
113
+ @net_multiplexer = @spider_multiplexer
88
114
 
89
- @select_timeout_sec = SELECT_TIMEOUT_SEC
90
- @max_inbound_ships = max_ships
91
- @selector = Selector.new()
92
- @aborted = false
93
- @unanchorable_transporters = {}
115
+ when Harbor::MULTIPLEXER_TYPE_JOB
116
+ @net_multiplexer = @job_multiplexer
117
+
118
+ when Harbor::MULTIPLEXER_TYPE_PIGEON, Harbor::MULTIPLEXER_TYPE_SPIN,
119
+ Harbor::MULTIPLEXER_TYPE_TAXI, Harbor::MULTIPLEXER_TYPE_TRAIN
94
120
 
121
+ raise Sink.new("Multiplexer not supported: %s", Harbor.get_multiplexer_type_name(BayServer.harbor.net_multiplexer))
122
+ end
123
+
124
+ @last_timeout_check = 0
95
125
  end
96
126
 
97
127
 
@@ -100,17 +130,41 @@ module Baykit
100
130
  end
101
131
 
102
132
 
103
- def inspect()
133
+ def inspect
104
134
  return to_s
105
135
  end
106
136
 
137
+ #########################################
138
+ # Custom methods
139
+ #########################################
140
+ def start
141
+ Thread.new do
142
+ run
143
+ end
144
+ end
145
+
107
146
  def run
108
147
  BayLog.info(BayMessage.get(:MSG_RUNNING_GRAND_AGENT, self))
109
- @select_wakeup_pipe = IO.pipe
110
- @selector.register(@select_wakeup_pipe[0], Selector::OP_READ)
111
- @selector.register(@command_receiver.communication_channel, Selector::OP_READ)
148
+
149
+ if @net_multiplexer.is_non_blocking
150
+ BayLog.info("rec=%s", @command_receiver)
151
+ @command_receiver.rudder.set_non_blocking
152
+ end
153
+
154
+ @net_multiplexer.req_read(@command_receiver.rudder)
155
+
156
+ if @anchorable
157
+ # Adds server socket channel of anchorable ports
158
+ BayServer.anchorable_port_map.keys.each do |rd|
159
+ if @net_multiplexer.is_non_blocking
160
+ rd.set_non_blocking
161
+ end
162
+ @net_multiplexer.add_rudder_state(rd, RudderState.new(rd))
163
+ end
164
+ end
112
165
 
113
166
  # Set up unanchorable channel
167
+ =begin
114
168
  for ch in GrandAgent.unanchorable_port_map.keys() do
115
169
  port_dkr = GrandAgent.unanchorable_port_map[ch]
116
170
  tp = port_dkr.new_transporter(self, ch)
@@ -121,124 +175,166 @@ module Baykit
121
175
  @non_blocking_handler.ask_to_read(ch)
122
176
  end
123
177
  end
178
+ =end
124
179
 
125
180
  busy = true
126
181
  begin
127
- while not @aborted
128
-
129
- count = -1
130
-
131
- if @accept_handler
132
- test_busy = @accept_handler.ch_count >= @max_inbound_ships
133
- if test_busy != busy
134
- busy = test_busy
135
- if busy
136
- @accept_handler.on_busy()
137
- else
138
- @accept_handler.on_free()
139
- end
140
- end
141
- end
182
+ while true
142
183
 
143
- if !busy && @selector.count() == 2
144
- # agent finished
145
- BayLog.debug("%s Selector has no key", self)
146
- break
184
+ test_busy = @net_multiplexer.is_busy
185
+ if test_busy != busy
186
+ busy = test_busy
187
+ if busy
188
+ @net_multiplexer.on_busy
189
+ else
190
+ @net_multiplexer.on_free
191
+ end
147
192
  end
148
193
 
149
- if !@spin_handler.empty?
150
- timeout = 0
194
+ if not @spin_multiplexer.is_empty
195
+ # If "SpinHandler" is running, the select function does not block.
196
+ received = @recipient.receive(false)
197
+ @spin_multiplexer.process_data
151
198
  else
152
- timeout = @select_timeout_sec
199
+ received = @recipient.receive(true)
153
200
  end
154
201
 
155
202
  if @aborted
156
203
  BayLog.info("%s aborted by another thread", self)
157
- break
204
+ break;
158
205
  end
159
- #@BayServer.debug("Selecting... read=" + read_list.to_s)
160
- selected_map = @selector.select(timeout)
161
- #BayLog.debug("%s selected: %s", self, selected_map)
162
206
 
163
- processed = @non_blocking_handler.register_channel_ops() > 0
164
-
165
- if @aborted
166
- BayLog.info("%s aborted by another thread", self)
167
- break
168
- end
169
-
170
- if selected_map.length == 0
171
- # No channel is selected
172
- processed |= @spin_handler.process_data()
207
+ if @spin_multiplexer.is_empty && @letter_queue.empty?
208
+ # timed out
209
+ # check per 10 seconds
210
+ if Time.now.tv_sec - @last_timeout_check >= 10
211
+ ring
212
+ end
173
213
  end
174
214
 
175
- selected_map.keys().each do |ch|
176
- if ch == @select_wakeup_pipe[0]
177
- # Waked up by ask_to_*
178
- on_waked_up(ch)
179
- elsif ch == @command_receiver.communication_channel
180
- @command_receiver.on_pipe_readable()
181
- elsif @accept_handler && @accept_handler.server_socket?(ch)
182
- @accept_handler.on_acceptable(ch)
183
- else
184
- @non_blocking_handler.handle_channel(ch, selected_map[ch])
215
+ while !@letter_queue.empty?
216
+ let = nil
217
+ @letter_queue_lock.synchronize do
218
+ let = @letter_queue.shift
185
219
  end
186
- processed = true
187
- end
188
220
 
189
- if not processed
190
- # timeout check
191
- @timer_handlers.each do |h|
192
- h.on_timer()
221
+ case let.type
222
+ when Letter::ACCEPTED
223
+ on_accept(let)
224
+ when Letter::CONNECTED
225
+ on_connect(let)
226
+ when Letter::READ
227
+ on_read(let)
228
+ when Letter::WROTE
229
+ on_wrote(let)
230
+ when Letter::CLOSEREQ
231
+ on_close_req(let)
193
232
  end
194
233
  end
195
-
196
234
  end # while
197
235
 
198
- rescue => e
236
+ rescue Exception => e
199
237
  BayLog.fatal_e(e)
200
238
  ensure
201
239
  BayLog.info("%s end", self)
202
- shutdown()
240
+ shutdown
203
241
  end
204
242
  end
205
243
 
206
- def shutdown()
207
- BayLog.info("%s shutdown", self)
208
244
 
209
- if @accept_handler != nil
210
- @accept_handler.shutdown()
211
- end
212
245
 
213
- @command_receiver.end()
214
- @non_blocking_handler.close_all()
246
+ def abort_agent
247
+ BayLog.info("%s abort", self)
215
248
 
216
- GrandAgent.listeners.each do |lis|
217
- lis.remove(self)
249
+ if BayServer.harbor.multi_core
250
+ exit(1)
218
251
  end
252
+ end
219
253
 
220
- GrandAgent.agents.delete(@agent_id)
254
+ def req_shutdown
255
+ @aborted = true
256
+ @recipient.wakeup
257
+ end
221
258
 
222
- @agent_id = -1
223
- if BayServer.harbor.multi_core
224
- exit(1)
259
+
260
+ def print_usage
261
+ # print memory usage
262
+ BayLog.info("%s MemUsage", self)
263
+ BayLog.info(" Ruby version: %s", RUBY_VERSION)
264
+ memsize = ObjectSpace.memsize_of_all
265
+ # formatted by comma
266
+ msize_comma = memsize.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse.then do |str|
267
+ str[0] == ',' ? str[1..-1] : str
225
268
  end
269
+ BayLog.info(" Total object size: %s bytes", msize_comma)
270
+ MemUsage.get(@agent_id).print_usage(1)
226
271
  end
227
272
 
228
- def abort_agent()
229
- BayLog.info("%s abort", self)
273
+
274
+ def add_timer_handler(handler)
275
+ @timer_handlers << handler
276
+ end
277
+
278
+ def remove_timer_handler(handler)
279
+ @timer_handlers.delete(handler)
280
+ end
281
+
282
+ def add_command_receiver(rd)
283
+ @command_receiver = CommandReceiver.new()
284
+ com_transporter = PlainTransporter.new(@net_multiplexer, @command_receiver, true, 8, false)
285
+ @command_receiver.init(@agent_id, rd, com_transporter)
286
+ @net_multiplexer.add_rudder_state(@command_receiver.rudder, RudderState.new(@command_receiver.rudder, com_transporter))
287
+ BayLog.info("ComRec=%s", @command_receiver)
288
+ end
289
+
290
+ def send_accepted_letter(st, client_rd, e, wakeup)
291
+ send_letter(Letter.new(Letter::ACCEPTED, st, client_rd, -1, nil, e), wakeup)
292
+ end
293
+
294
+ def send_connected_letter(st, e, wakeup)
295
+ send_letter(Letter.new(Letter::CONNECTED, st, nil, -1, nil, e), wakeup)
296
+ end
297
+ def send_read_letter(st, n, adr, e, wakeup)
298
+ send_letter(Letter.new(Letter::READ, st, nil, n, adr, e), wakeup)
299
+ end
300
+
301
+ def send_wrote_letter(st, n, e, wakeup)
302
+ send_letter(Letter.new(Letter::WROTE, st, nil, n, nil, e), wakeup)
303
+ end
304
+
305
+ def send_close_req_letter(st, wakeup)
306
+ send_letter(Letter.new(Letter::CLOSEREQ, st, nil, -1, nil, nil), wakeup)
307
+ end
308
+
309
+ def shutdown
310
+ BayLog.info("%s shutdown", self)
311
+ if @aborted
312
+ return
313
+ end
314
+
315
+ @aborted = true
316
+ BayLog.debug("%s shutdown netMultiplexer", self)
317
+ @net_multiplexer.shutdown()
318
+
319
+ GrandAgent.listeners.each do |lis|
320
+ lis.remove(@agent_id)
321
+ end
322
+ @command_receiver.end()
323
+ GrandAgent.agents.delete(@agent_id)
230
324
 
231
325
  if BayServer.harbor.multi_core
326
+ BayLog.debug("%s exit", self)
232
327
  exit(1)
233
328
  end
329
+ @agent_id = -1
234
330
  end
235
331
 
236
- def req_shutdown()
237
- @aborted = true
238
- wakeup()
332
+ def abort
333
+ BayLog.fatal("%s abort", self)
239
334
  end
240
335
 
241
- def reload_cert()
336
+
337
+ def reload_cert
242
338
  GrandAgent.anchorable_port_map.values().each do |port|
243
339
  if port.secure()
244
340
  begin
@@ -250,53 +346,265 @@ module Baykit
250
346
  end
251
347
  end
252
348
 
253
- def print_usage()
254
- # print memory usage
255
- BayLog.info("%s MemUsage", self)
256
- BayLog.info(" Ruby version: %s", RUBY_VERSION)
257
- memsize = ObjectSpace.memsize_of_all
258
- # formatted by comma
259
- msize_comma = memsize.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse.then do |str|
260
- str[0] == ',' ? str[1..-1] : str
349
+ def add_postpone(p)
350
+ @postpone_queue_lock.synchronize do
351
+ @postpone_queue << p
261
352
  end
262
- BayLog.info(" Total object size: %s bytes", msize_comma)
263
- MemUsage.get(@agent_id).print_usage(1)
264
353
  end
265
354
 
266
- def wakeup
267
- #BayLog.debug("%s wakeup", self)
268
- IOUtil.write_int32(@select_wakeup_pipe[1], 0)
355
+ def count_postpone
356
+ return @postpone_queue.length
269
357
  end
270
358
 
271
- def run_command_receiver(com_channel)
272
- @command_receiver = CommandReceiver.new(self, com_channel)
359
+ def req_catch_up
360
+ BayLog.debug("%s Req catchUp", self)
361
+ if count_postpone > 0
362
+ catch_up
363
+ else
364
+ begin
365
+ @command_receiver.send_command_to_monitor(self, CMD_CATCHUP, false)
366
+ rescue IOError => e
367
+ BayLog.error_e(e)
368
+ abort
369
+ end
370
+ end
273
371
  end
274
372
 
275
- def add_timer_handler(handler)
276
- @timer_handlers << handler
373
+ def catch_up
374
+ BayLog.debug("%s catchUp", self)
375
+ @postpone_queue_lock.synchronize do
376
+ if not @postpone_queue.empty?
377
+ r = @postpone_queue.shift
378
+ r.run()
379
+ end
380
+ end
277
381
  end
278
382
 
279
- def remove_timer_handler(handler)
280
- @timer_handlers.delete(handler)
383
+ #########################################
384
+ # Private methods
385
+ #########################################
386
+ private
387
+ def ring
388
+ BayLog.trace("%s Ring", self)
389
+ # timeout check
390
+ @timer_handlers.each do |h|
391
+ h.on_timer
392
+ end
393
+ @last_timeout_check = Time.now.tv_sec
281
394
  end
282
395
 
283
- private
284
- def on_waked_up(pipe_fd)
285
- #BayLog.debug("%s waked up", self)
286
- val = IOUtil.read_int32(pipe_fd)
396
+ def send_letter(let, wakeup)
397
+ @letter_queue_lock.synchronize do
398
+ @letter_queue << let
399
+ end
400
+
401
+ if wakeup
402
+ @recipient.wakeup
403
+ end
404
+ end
405
+
406
+ def on_accept(let)
407
+ begin
408
+ if let.err != nil
409
+ raise let.err
410
+ end
411
+
412
+ p = BayServer::anchorable_port_map[let.state.rudder]
413
+ p.on_connected(@agent_id, let.client_rudder)
414
+ rescue IOError => e
415
+ BayLog.error_e(e)
416
+ next_action(let.state, NextSocketAction::CLOSE, false)
417
+ rescue HttpException => e
418
+ BayLog.error_e(e)
419
+ let.client_rudder.close
420
+ end
421
+
422
+ if !@net_multiplexer.is_busy
423
+ let.state.multiplexer.next_accept(let.state)
424
+ end
287
425
  end
288
426
 
427
+ def on_connect(let)
428
+ st = let.state
429
+ if st.closed
430
+ BayLog.debug("%s Rudder is already closed: rd=%s", self, st.rudder);
431
+ return;
432
+ end
433
+
434
+ BayLog.debug("%s connected rd=%s", self, st.rudder)
435
+ next_act = nil
436
+ begin
437
+ if let.err != nil
438
+ raise let.err
439
+ end
440
+
441
+ next_act = st.transporter.on_connect(st.rudder)
442
+ BayLog.debug("%s nextAct=%s", self, next_act)
443
+ rescue IOError => e
444
+ st.transporter.on_error(st.rudder, e)
445
+ next_act = NextSocketAction::CLOSE
446
+ end
447
+
448
+ if next_act == NextSocketAction::READ
449
+ # Read more
450
+ st.multiplexer.cancel_write(st)
451
+ end
452
+
453
+ next_action(st, next_act, false)
454
+ end
455
+
456
+ def on_read(let)
457
+ st = let.state
458
+ if st.closed
459
+ BayLog.debug("%s Rudder is already closed: rd=%s", self, st.rudder)
460
+ return
461
+ end
462
+
463
+ begin
464
+ if let.err != nil
465
+ BayLog.debug("%s error on OS read %s", self, let.err)
466
+ raise let.err
467
+ end
468
+
469
+ BayLog.debug("%s read %d bytes (rd=%s)", self, let.n_bytes, st.rudder)
470
+ st.bytes_read += let.n_bytes
471
+
472
+ if let.n_bytes <= 0
473
+ st.read_buf.clear
474
+ next_act = st.transporter.on_read(st.rudder, "", let.address)
475
+ else
476
+ next_act = st.transporter.on_read(st.rudder, st.read_buf, let.address)
477
+ end
478
+
479
+ rescue => e
480
+ st.transporter.on_error(st.rudder, e)
481
+ next_act = NextSocketAction::CLOSE
482
+ end
483
+
484
+ next_action(st, next_act, true)
485
+ end
486
+
487
+ def on_wrote(let)
488
+ st = let.state
489
+ if st.closed
490
+ BayLog.debug("%s Rudder is already closed: rd=%s", self, st.rudder)
491
+ return
492
+ end
493
+
494
+ begin
495
+ if let.err != nil
496
+ BayLog.debug("%s error on OS write %s", self, let.err)
497
+ raise let.err
498
+ end
499
+
500
+ BayLog.debug("%s wrote %d bytes rd=%s qlen=%d", self, let.n_bytes, st.rudder, st.write_queue.length)
501
+ st.bytes_wrote += let.n_bytes
502
+
503
+ if st.write_queue.empty?
504
+ raise Sink("%s Write queue is empty: rd=%s", self, st.rudder)
505
+ end
506
+
507
+ unit = st.write_queue[0]
508
+ if unit.buf.length > 0
509
+ BayLog.debug("Could not write enough data buf_len=%d", unit.buf.length)
510
+ else
511
+ st.multiplexer.consume_oldest_unit(st)
512
+ end
513
+
514
+ write_more = true
515
+
516
+ st.writing_lock.synchronize do
517
+ if st.write_queue.empty?
518
+ write_more = false
519
+ st.writing = false
520
+ end
521
+ end
522
+
523
+ if write_more
524
+ st.multiplexer.next_write(st)
525
+ else
526
+ if st.finale
527
+ # close
528
+ BayLog.debug("%s finale return Close", self)
529
+ next_action(st, NextSocketAction::CLOSE, false)
530
+ else
531
+ # Write off
532
+ st.multiplexer.cancel_write(st)
533
+ end
534
+ end
535
+ rescue SystemCallError, IOError => e
536
+ BayLog.debug("%s IO error on wrote", self)
537
+ st.transporter.on_error(st.rudder, e)
538
+ next_action(st, NextSocketAction::CLOSE, false)
539
+ end
540
+ end
541
+
542
+ def on_close_req(let)
543
+ st = let.state
544
+ BayLog.debug("%s reqClose rd=%s", self, st.rudder)
545
+ if st.closed
546
+ BayLog.debug("%s Rudder is already closed: rd=%s", self, st.rudder)
547
+ return
548
+ end
549
+
550
+ st.multiplexer.close_rudder(st)
551
+ st.access
552
+ end
553
+
554
+ def next_action(st, act, reading)
555
+ BayLog.debug("%s next action: %s (reading=%s)", self, act, reading)
556
+ cancel = false
557
+
558
+ case(act)
559
+ when NextSocketAction::CONTINUE
560
+ if reading
561
+ st.multiplexer.next_read(st)
562
+ end
563
+
564
+ when NextSocketAction::READ
565
+ st.multiplexer.next_read(st)
566
+
567
+ when NextSocketAction::WRITE
568
+ if reading
569
+ cancel = true
570
+ end
571
+
572
+ when NextSocketAction::CLOSE
573
+ if reading
574
+ cancel = true
575
+ end
576
+ st.multiplexer.close_rudder(st)
577
+
578
+ when NextSocketAction::SUSPEND
579
+ if reading
580
+ cancel = true
581
+ end
582
+
583
+ else
584
+ raise ArgumentError.new("Invalid action: #{act}")
585
+
586
+ end
587
+
588
+ if cancel
589
+ st.multiplexer.cancel_read(st)
590
+ st.reading_lock.synchronize do
591
+ BayLog.debug("%s Reading off %s", self, st.rudder)
592
+ st.reading = false
593
+ end
594
+ end
595
+
596
+ st.access
597
+ end
598
+
599
+
289
600
  ######################################################
290
601
  # class methods
291
602
  ######################################################
292
- def GrandAgent.init(agt_ids, anchorable_port_map, unanchorable_port_map, max_ships, multi_core)
603
+ def GrandAgent.init(agt_ids, max_ships)
293
604
  @agent_count = agt_ids.length
294
- @anchorable_port_map = anchorable_port_map
295
- @unanchorable_port_map = unanchorable_port_map != nil ? unanchorable_port_map : {}
296
605
  @max_ships = max_ships
297
- @multi_core = multi_core
298
606
 
299
- if(BayServer.harbor.multi_core?)
607
+ if BayServer.harbor.multi_core
300
608
  agt_ids.each do | agt_id |
301
609
  add(agt_id, true)
302
610
  end
@@ -320,8 +628,10 @@ module Baykit
320
628
  @agents[agt_id] = agt
321
629
 
322
630
  @listeners.each do |lis|
323
- lis.add(agt)
631
+ lis.add(agt.agent_id)
324
632
  end
633
+
634
+ return agt
325
635
  end
326
636
 
327
637
  def GrandAgent.add_lifecycle_listener(lis)