bayserver-core 2.3.2 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/agent/accept_handler.rb +0 -26
- data/lib/baykit/bayserver/agent/channel_listener.rb +6 -6
- data/lib/baykit/bayserver/agent/command_receiver.rb +97 -38
- data/lib/baykit/bayserver/agent/grand_agent.rb +444 -134
- data/lib/baykit/bayserver/agent/letter.rb +30 -0
- data/lib/baykit/bayserver/agent/lifecycle_listener.rb +9 -7
- data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +298 -0
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +257 -0
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +52 -0
- data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +150 -0
- data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +129 -0
- data/lib/baykit/bayserver/agent/multiplexer/rudder_state.rb +81 -0
- data/lib/baykit/bayserver/agent/multiplexer/secure_transporter.rb +50 -0
- data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +561 -0
- data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +311 -0
- data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +194 -0
- data/lib/baykit/bayserver/agent/multiplexer/transporter.rb +61 -0
- data/lib/baykit/bayserver/agent/multiplexer/write_unit.rb +30 -0
- data/lib/baykit/bayserver/agent/non_blocking_handler.rb +0 -319
- data/lib/baykit/bayserver/agent/signal/signal_agent.rb +2 -1
- data/lib/baykit/bayserver/agent/timer_handler.rb +1 -1
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +7 -7
- data/lib/baykit/bayserver/agent/transporter/package.rb +0 -3
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +5 -139
- data/lib/baykit/bayserver/bay_log.rb +1 -0
- data/lib/baykit/bayserver/bayserver.rb +32 -28
- data/lib/baykit/bayserver/{util → common}/groups.rb +1 -1
- data/lib/baykit/bayserver/common/inbound_handler.rb +12 -0
- data/lib/baykit/bayserver/{docker/base → common}/inbound_ship.rb +94 -19
- data/lib/baykit/bayserver/{docker/base → common}/inbound_ship_store.rb +7 -9
- data/lib/baykit/bayserver/common/multiplexer.rb +98 -0
- data/lib/baykit/bayserver/common/postpone.rb +15 -0
- data/lib/baykit/bayserver/common/read_only_ship.rb +42 -0
- data/lib/baykit/bayserver/common/recipient.rb +24 -0
- data/lib/baykit/bayserver/common/vehicle.rb +24 -0
- data/lib/baykit/bayserver/common/vehicle_runner.rb +127 -0
- data/lib/baykit/bayserver/{docker/warp → common}/warp_data.rb +18 -10
- data/lib/baykit/bayserver/common/warp_handler.rb +27 -0
- data/lib/baykit/bayserver/{docker/warp → common}/warp_ship.rb +107 -27
- data/lib/baykit/bayserver/{docker/warp → common}/warp_ship_store.rb +3 -8
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +2 -2
- data/lib/baykit/bayserver/docker/base/port_base.rb +59 -27
- data/lib/baykit/bayserver/docker/{warp/warp_docker.rb → base/warp_base.rb} +43 -50
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +118 -31
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +60 -63
- data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +11 -10
- data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +13 -4
- data/lib/baykit/bayserver/docker/city.rb +27 -13
- data/lib/baykit/bayserver/docker/club.rb +8 -8
- data/lib/baykit/bayserver/docker/docker.rb +9 -1
- data/lib/baykit/bayserver/docker/harbor.rb +184 -22
- data/lib/baykit/bayserver/docker/permission.rb +7 -6
- data/lib/baykit/bayserver/docker/port.rb +39 -11
- data/lib/baykit/bayserver/docker/secure.rb +11 -9
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +99 -4
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +6 -2
- data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +92 -0
- data/lib/baykit/bayserver/docker/town.rb +31 -15
- data/lib/baykit/bayserver/docker/trouble.rb +17 -5
- data/lib/baykit/bayserver/docker/warp.rb +34 -0
- data/lib/baykit/bayserver/mem_usage.rb +9 -9
- data/lib/baykit/bayserver/protocol/command_packer.rb +1 -8
- data/lib/baykit/bayserver/protocol/packet_packer.rb +7 -11
- data/lib/baykit/bayserver/protocol/packet_store.rb +4 -4
- data/lib/baykit/bayserver/protocol/protocol_handler.rb +26 -8
- data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +5 -5
- data/lib/baykit/bayserver/rudders/io_rudder.rb +62 -0
- data/lib/baykit/bayserver/rudders/rudder.rb +29 -0
- data/lib/baykit/bayserver/{watercraft → ships}/ship.rb +65 -41
- data/lib/baykit/bayserver/taxi/taxi.rb +15 -10
- data/lib/baykit/bayserver/taxi/taxi_runner.rb +9 -94
- data/lib/baykit/bayserver/tours/read_file_taxi.rb +2 -2
- data/lib/baykit/bayserver/tours/req_content_handler.rb +16 -13
- data/lib/baykit/bayserver/tours/tour.rb +2 -2
- data/lib/baykit/bayserver/tours/tour_handler.rb +36 -0
- data/lib/baykit/bayserver/tours/tour_req.rb +14 -24
- data/lib/baykit/bayserver/tours/tour_res.rb +5 -89
- data/lib/baykit/bayserver/tours/tour_store.rb +5 -5
- data/lib/baykit/bayserver/train/train_runner.rb +17 -13
- data/lib/baykit/bayserver/util/data_consume_listener.rb +1 -1
- data/lib/baykit/bayserver/util/executor_service.rb +11 -7
- data/lib/baykit/bayserver/util/ip_matcher.rb +9 -39
- data/lib/baykit/bayserver/util/locale.rb +1 -1
- data/lib/baykit/bayserver/util/selector.rb +24 -5
- data/lib/baykit/bayserver/util/sys_util.rb +6 -6
- data/lib/baykit/bayserver/version.rb +1 -1
- metadata +37 -18
- data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +0 -231
- data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +0 -55
- data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +0 -81
- data/lib/baykit/bayserver/docker/base/inbound_handler.rb +0 -42
- data/lib/baykit/bayserver/docker/warp/package.rb +0 -4
- data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +0 -112
- data/lib/baykit/bayserver/docker/warp/warp_handler.rb +0 -38
- /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/
|
8
|
-
require 'baykit/bayserver/agent/
|
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 :
|
39
|
-
attr :
|
40
|
-
attr :
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
87
|
-
|
111
|
+
case BayServer.harbor.net_multiplexer
|
112
|
+
when Harbor::MULTIPLEXER_TYPE_SPIDER
|
113
|
+
@net_multiplexer = @spider_multiplexer
|
88
114
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
110
|
-
@
|
111
|
-
|
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
|
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
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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
|
150
|
-
|
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
|
-
|
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
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
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
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
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
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
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
|
-
|
214
|
-
|
246
|
+
def abort_agent
|
247
|
+
BayLog.info("%s abort", self)
|
215
248
|
|
216
|
-
|
217
|
-
|
249
|
+
if BayServer.harbor.multi_core
|
250
|
+
exit(1)
|
218
251
|
end
|
252
|
+
end
|
219
253
|
|
220
|
-
|
254
|
+
def req_shutdown
|
255
|
+
@aborted = true
|
256
|
+
@recipient.wakeup
|
257
|
+
end
|
221
258
|
|
222
|
-
|
223
|
-
|
224
|
-
|
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
|
-
|
229
|
-
|
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
|
237
|
-
|
238
|
-
wakeup()
|
332
|
+
def abort
|
333
|
+
BayLog.fatal("%s abort", self)
|
239
334
|
end
|
240
335
|
|
241
|
-
|
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
|
254
|
-
|
255
|
-
|
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
|
267
|
-
|
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
|
272
|
-
|
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
|
276
|
-
|
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
|
-
|
280
|
-
|
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
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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,
|
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
|
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)
|