bayserver-core 2.2.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.
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