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.
- 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)
|