bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9553fc51408c4fdcf0cfdab84dedbfe4787dfb635c6d80fb35f8ed8931d45e94
4
+ data.tar.gz: 1621adc0afcd182c88d92334c5492573c7832a1d4fdd32ad446e69715546a534
5
+ SHA512:
6
+ metadata.gz: 9e2f3c03c747fa755ac913a8036afd5269310f1933ff10331d533b778fcf06f0e68003e79bba992d02cb3595264433901bdc9779b4845d4c883832811eb0a208
7
+ data.tar.gz: a43916c531db4c6c7a473de166c91079386b6e6ac88071db6eaf2a23cb7637351c97ea7a8cbf8ea96390244775859246faf3cc357bdc4164589b223e18419af7
@@ -0,0 +1,97 @@
1
+ require 'fcntl'
2
+
3
+ require 'baykit/bayserver/util/selector'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Agent
8
+ class AcceptHandler
9
+ include Baykit::BayServer::Agent
10
+ include Baykit::BayServer::Util
11
+
12
+ attr :agent
13
+ attr :port_map
14
+
15
+ attr :is_shutdown
16
+ attr :ch_count
17
+
18
+ def initialize(agent, port_map)
19
+ @agent = agent
20
+ @port_map = port_map
21
+ @ch_count = 0
22
+ @is_shutdown = false
23
+ end
24
+
25
+ def on_acceptable(server_skt)
26
+ port_dkr = @port_map[server_skt]
27
+
28
+ begin
29
+ client_skt, = server_skt.accept_nonblock
30
+ rescue IO::WaitReadable
31
+ # Maybe another agent get socket
32
+ BayLog.debug("Accept failed (must wait readable)")
33
+ return
34
+ end
35
+
36
+ BayLog.debug("Accepted: skt=%d", client_skt.fileno)
37
+
38
+ begin
39
+ port_dkr.check_admitted(client_skt)
40
+ rescue => e
41
+ BayLog.error_e(e)
42
+ client_skt.close()
43
+ return
44
+ end
45
+
46
+ client_skt.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
47
+
48
+ tp = port_dkr.new_transporter(@agent, client_skt)
49
+ @agent.non_blocking_handler.ask_to_start(client_skt)
50
+ @agent.non_blocking_handler.ask_to_read(client_skt)
51
+ @ch_count += 1
52
+ end
53
+
54
+ def on_closed()
55
+ @ch_count -= 1
56
+ end
57
+
58
+ def on_busy()
59
+ BayLog.debug("%s AcceptHandler:onBusy", @agent)
60
+ @port_map.keys().each do |ch|
61
+ @agent.selector.unregister(ch)
62
+ end
63
+ end
64
+
65
+ def on_free()
66
+ BayLog.debug("%s AcceptHandler:onFree isShutdown=%s", @agent, @is_shutdown)
67
+ if @is_shutdown
68
+ return
69
+ end
70
+
71
+ @port_map.keys().each do |ch|
72
+ @agent.selector.register(ch, Selector::OP_READ)
73
+ end
74
+ end
75
+
76
+ def server_socket?(skt)
77
+ return @port_map.key?(skt)
78
+ end
79
+
80
+ def close_all()
81
+ @port_map.keys.each do |skt|
82
+ BayLog.debug("%s Close server Socket: %s", @agent, skt)
83
+ skt.close()
84
+ end
85
+ end
86
+
87
+ def shutdown()
88
+ @is_shutdown = true
89
+ on_busy()
90
+ @agent.wakeup()
91
+ end
92
+
93
+ end
94
+ end
95
+ end
96
+ end
97
+
@@ -0,0 +1,35 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Agent
5
+ module ChannelListener # interface
6
+
7
+ def on_readable(chk_ch)
8
+ raise NotImplementedError()
9
+ end
10
+
11
+ def on_writable(chk_ch)
12
+ raise NotImplementedError()
13
+ end
14
+
15
+ def on_connectable(chk_ch)
16
+ raise NotImplementedError()
17
+ end
18
+
19
+ def on_error(chk_ch, e)
20
+ raise NotImplementedError()
21
+ end
22
+
23
+ def on_closed(chk_ch)
24
+ raise NotImplementedError()
25
+ end
26
+
27
+ def check_timeout(chk_ch, duration)
28
+ raise NotImplementedError()
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,75 @@
1
+
2
+
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Agent
7
+ #
8
+ # CommandReceiver receives commands from GrandAgentMonitor
9
+ #
10
+ class CommandReceiver
11
+ include Baykit::BayServer::Util
12
+ attr :agent
13
+ attr :communication_channel
14
+ attr :aborted
15
+
16
+ def initialize(agent, com_ch)
17
+ @agent = agent
18
+ @communication_channel = com_ch
19
+ @aborted = false
20
+ end
21
+
22
+ def to_s()
23
+ return "ComReceiver##{@agent.agent_id}"
24
+ end
25
+
26
+ def on_pipe_readable()
27
+ cmd = IOUtil.read_int32(@communication_channel)
28
+ if cmd == nil
29
+ BayLog.debug("%s pipe closed: %d", self, @communication_channel)
30
+ @agent.abort_agent()
31
+ else
32
+ BayLog.debug("%s receive command %d pipe=%d", self, cmd, @communication_channel)
33
+ begin
34
+ case cmd
35
+ when GrandAgent::CMD_RELOAD_CERT
36
+ @agent.reload_cert()
37
+ when GrandAgent::CMD_MEM_USAGE
38
+ @agent.print_usage()
39
+ when GrandAgent::CMD_SHUTDOWN
40
+ @agent.shutdown()
41
+ @aborted = true
42
+ when GrandAgent::CMD_ABORT
43
+ IOUtil.write_int32(@communication_channel, GrandAgent::CMD_OK)
44
+ @agent.abort_agent()
45
+ return
46
+ else
47
+ BayLog.error("Unknown command: %d", cmd)
48
+ end
49
+ IOUtil.write_int32(@communication_channel, GrandAgent::CMD_OK)
50
+ rescue IOError => e
51
+ BayLog.debug("%s Read failed (maybe agent shut down): %s", self, e)
52
+ ensure
53
+ BayLog.debug("%s Command ended", self)
54
+ end
55
+ end
56
+ end
57
+
58
+ def end()
59
+ BayLog.debug("%s end", self)
60
+ begin
61
+ IOUtil.write_int32(@communication_channel, GrandAgent::CMD_CLOSE)
62
+ rescue => e
63
+ BayLog.error_e(e, "%s Write error", @agent);
64
+ end
65
+ close()
66
+ end
67
+
68
+ def close()
69
+ @communication_channel.close()
70
+ end
71
+
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,319 @@
1
+ require 'socket'
2
+
3
+ require 'baykit/bayserver/sink'
4
+ require 'baykit/bayserver/agent/accept_handler'
5
+ require 'baykit/bayserver/agent/command_receiver'
6
+ require 'baykit/bayserver/agent/grand_agent_monitor'
7
+ require 'baykit/bayserver/agent/spin_handler'
8
+ require 'baykit/bayserver/agent/signal/signal_agent'
9
+
10
+ require 'baykit/bayserver/train/train_runner'
11
+ require 'baykit/bayserver/taxi/taxi_runner'
12
+
13
+ require 'baykit/bayserver/util/io_util'
14
+ require 'baykit/bayserver/util/selector'
15
+
16
+ module Baykit
17
+ module BayServer
18
+ module Agent
19
+ class GrandAgent
20
+ include Baykit::BayServer
21
+ include Baykit::BayServer::Train
22
+ include Baykit::BayServer::Taxi
23
+ include Baykit::BayServer::Agent::Signal
24
+ include Baykit::BayServer::Util
25
+
26
+ module GrandAgentLifecycleListener
27
+ #
28
+ # interface
29
+ #
30
+ # void add(int agentId);
31
+ # void remove(int agentId);
32
+ #
33
+ end
34
+
35
+ SELECT_TIMEOUT_SEC = 10
36
+
37
+ CMD_OK = 0
38
+ CMD_CLOSE = 1
39
+ CMD_RELOAD_CERT = 2
40
+ CMD_MEM_USAGE = 3
41
+ CMD_SHUTDOWN = 4
42
+ CMD_ABORT = 5
43
+
44
+ attr :agent_id
45
+ attr :anchorable
46
+ attr :non_blocking_handler
47
+ attr :spin_handler
48
+ attr :accept_handler
49
+ attr :send_wakeup_pipe
50
+ attr :select_wakeup_pipe
51
+ attr :select_timeout_sec
52
+ attr :max_inbound_ships
53
+ attr :selector
54
+ attr :unanchorable_transporters
55
+ attr :aborted
56
+ attr :command_receiver
57
+
58
+ class << self
59
+ attr :agents
60
+ attr :listeners
61
+ attr :agent_count
62
+ attr :anchorable_port_map
63
+ attr :unanchorable_port_map
64
+ attr :max_ships
65
+ attr :max_agent_id
66
+ attr :multi_core
67
+ end
68
+
69
+ # Class variables
70
+ @agent_count = 0
71
+ @max_agent_id = 0
72
+ @max_ships = 0
73
+ @multi_core = false
74
+
75
+ @agents = []
76
+ @listeners = []
77
+
78
+ @anchorable_port_map = {}
79
+ @unanchorable_port_map = {}
80
+ @finale = false
81
+
82
+ def initialize (agent_id, max_ships, anchorable)
83
+ @agent_id = agent_id
84
+ @anchorable = anchorable
85
+
86
+ if @anchorable
87
+ @accept_handler = AcceptHandler.new(self, GrandAgent.anchorable_port_map)
88
+ else
89
+ @accept_handler = nil
90
+ end
91
+
92
+ @spin_handler = SpinHandler.new(self)
93
+ @non_blocking_handler = NonBlockingHandler.new(self)
94
+
95
+ @select_timeout_sec = SELECT_TIMEOUT_SEC
96
+ @max_inbound_ships = max_ships
97
+ @selector = Selector.new()
98
+ @aborted = false
99
+ @unanchorable_transporters = {}
100
+
101
+ end
102
+
103
+
104
+ def to_s()
105
+ return "Agt#" + @agent_id.to_s
106
+ end
107
+
108
+
109
+ def inspect()
110
+ return to_s
111
+ end
112
+
113
+ def run
114
+ BayLog.info(BayMessage.get(:MSG_RUNNING_GRAND_AGENT, self))
115
+ @select_wakeup_pipe = IO.pipe
116
+ @selector.register(@select_wakeup_pipe[0], Selector::OP_READ)
117
+ @selector.register(@command_receiver.communication_channel, Selector::OP_READ)
118
+
119
+ # Set up unanchorable channel
120
+ for ch in GrandAgent.unanchorable_port_map.keys() do
121
+ port_dkr = GrandAgent.unanchorable_port_map[ch]
122
+ tp = port_dkr.new_transporter(self, ch)
123
+ @unanchorable_transporters[ch] = tp
124
+ @non_blocking_handler.add_channel_listener(ch, tp)
125
+ @non_blocking_handler.ask_to_start(ch)
126
+ if !@anchorable
127
+ @non_blocking_handler.ask_to_read(ch)
128
+ end
129
+ end
130
+
131
+ busy = true
132
+ begin
133
+ while not @aborted
134
+ begin
135
+ count = -1
136
+
137
+ if @accept_handler
138
+ test_busy = @accept_handler.ch_count >= @max_inbound_ships
139
+ if test_busy != busy
140
+ busy = test_busy
141
+ if busy
142
+ @accept_handler.on_busy()
143
+ else
144
+ @accept_handler.on_free()
145
+ end
146
+ end
147
+ end
148
+
149
+ if !busy && @selector.count() == 2
150
+ # agent finished
151
+ BayLog.debug("%s Selector has no key", self)
152
+ break
153
+ end
154
+
155
+ if !@spin_handler.empty?
156
+ timeout = 0
157
+ else
158
+ timeout = @select_timeout_sec
159
+ end
160
+
161
+ #@BayServer.debug("Selecting... read=" + read_list.to_s)
162
+ selected_map = @selector.select(timeout)
163
+ #BayLog.debug("%s selected: %s", self, selected_map)
164
+
165
+ processed = @non_blocking_handler.register_channel_ops() > 0
166
+
167
+ if selected_map.length == 0
168
+ # No channel is selected
169
+ processed |= @spin_handler.process_data()
170
+ end
171
+
172
+ selected_map.keys().each do |ch|
173
+ if ch == @select_wakeup_pipe[0]
174
+ # Waked up by ask_to_*
175
+ on_waked_up(ch)
176
+ elsif ch == @command_receiver.communication_channel
177
+ @command_receiver.on_pipe_readable()
178
+ elsif @accept_handler && @accept_handler.server_socket?(ch)
179
+ @accept_handler.on_acceptable(ch)
180
+ else
181
+ @non_blocking_handler.handle_channel(ch, selected_map[ch])
182
+ end
183
+ processed = true
184
+ end
185
+
186
+ if not processed
187
+ # timeout check
188
+ @non_blocking_handler.close_timeout_sockets()
189
+ @spin_handler.stop_timeout_spins()
190
+ end
191
+
192
+ rescue => e
193
+ raise e
194
+ end
195
+ end # while
196
+
197
+ rescue => e
198
+ BayLog.error_e(e)
199
+ raise e
200
+ ensure
201
+ BayLog.info("%s end", self)
202
+ abort_agent(nil, 0)
203
+ end
204
+ end
205
+
206
+ def shutdown()
207
+ BayLog.debug("%s shutdown", self)
208
+ if @accept_handler != nil
209
+ @accept_handler.shutdown()
210
+ end
211
+ @aborted = true
212
+ wakeup()
213
+ end
214
+
215
+ def abort_agent(err = nil, status = 1)
216
+ if err
217
+ BayLog.fatal("%s abort", self)
218
+ BayLog.fatal_e(err)
219
+ end
220
+
221
+ @command_receiver.end()
222
+ GrandAgent.listeners.each do |lis|
223
+ lis.remove(self)
224
+ end
225
+
226
+ GrandAgent.agents.delete(@agent_id)
227
+
228
+ if BayServer.harbor.multi_core
229
+ exit(1)
230
+ else
231
+ clean()
232
+ end
233
+
234
+ @aborted = true
235
+ end
236
+
237
+ def reload_cert()
238
+ GrandAgent.anchorable_port_map.values().each do |port|
239
+ if port.secure()
240
+ begin
241
+ port.secure_docker.reload_cert()
242
+ rescue => e
243
+ BayLog.error_e(e)
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ def print_usage()
250
+ # print memory usage
251
+ BayLog.info("Agent#%d MemUsage", @agent_id);
252
+ MemUsage.get(@agent_id).print_usage(1);
253
+ end
254
+
255
+ def wakeup
256
+ #BayLog.debug("%s wakeup", self)
257
+ IOUtil.write_int32(@select_wakeup_pipe[1], 0)
258
+ end
259
+
260
+ def run_command_receiver(com_channel)
261
+ @command_receiver = CommandReceiver.new(self, com_channel)
262
+ end
263
+
264
+ private
265
+ def on_waked_up(pipe_fd)
266
+ #BayLog.debug("%s waked up", self)
267
+ val = IOUtil.read_int32(pipe_fd)
268
+ end
269
+
270
+ def clean()
271
+ @non_blocking_handler.close_all()
272
+ @agent_id = -1
273
+ end
274
+
275
+ ######################################################
276
+ # class methods
277
+ ######################################################
278
+ def GrandAgent.init(agt_ids, anchorable_port_map, unanchorable_port_map, max_ships, multi_core)
279
+ @agent_count = agt_ids.length
280
+ @anchorable_port_map = anchorable_port_map
281
+ @unanchorable_port_map = unanchorable_port_map != nil ? unanchorable_port_map : {}
282
+ @max_ships = max_ships
283
+ @multi_core = multi_core
284
+
285
+ if(BayServer.harbor.multi_core?)
286
+ agt_ids.each do | agt_id |
287
+ add(agt_id, true)
288
+ end
289
+ end
290
+ end
291
+
292
+ def GrandAgent.get(agt_id)
293
+ return @agents[agt_id]
294
+ end
295
+
296
+ def self.add(agt_id, anchorable)
297
+ if agt_id == -1
298
+ agt_id = @max_agent_id + 1
299
+ end
300
+ BayLog.debug("Add agent: id=%d", agt_id)
301
+ if agt_id > @max_agent_id
302
+ @max_agent_id = agt_id
303
+ end
304
+
305
+ agt = GrandAgent.new(agt_id, @max_ships, anchorable)
306
+ @agents[agt_id] = agt
307
+
308
+ @listeners.each do |lis|
309
+ lis.add(agt)
310
+ end
311
+ end
312
+
313
+ def GrandAgent.add_lifecycle_listener(lis)
314
+ @listeners.append(lis)
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end