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.
- checksums.yaml +7 -0
- data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
- data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
- data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
- data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
- data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
- data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
- data/lib/baykit/bayserver/agent/package.rb +3 -0
- data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
- data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
- data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
- data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
- data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
- data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
- data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
- data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
- data/lib/baykit/bayserver/bay_dockers.rb +60 -0
- data/lib/baykit/bayserver/bay_exception.rb +12 -0
- data/lib/baykit/bayserver/bay_log.rb +148 -0
- data/lib/baykit/bayserver/bay_message.rb +20 -0
- data/lib/baykit/bayserver/bayserver.rb +529 -0
- data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
- data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
- data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
- data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
- data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
- data/lib/baykit/bayserver/bcf/package.rb +6 -0
- data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
- data/lib/baykit/bayserver/config_exception.rb +25 -0
- data/lib/baykit/bayserver/constants.rb +8 -0
- data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
- data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
- data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
- data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
- data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
- data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
- data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
- data/lib/baykit/bayserver/docker/city.rb +22 -0
- data/lib/baykit/bayserver/docker/club.rb +45 -0
- data/lib/baykit/bayserver/docker/docker.rb +8 -0
- data/lib/baykit/bayserver/docker/harbor.rb +34 -0
- data/lib/baykit/bayserver/docker/log.rb +17 -0
- data/lib/baykit/bayserver/docker/package.rb +12 -0
- data/lib/baykit/bayserver/docker/permission.rb +18 -0
- data/lib/baykit/bayserver/docker/port.rb +39 -0
- data/lib/baykit/bayserver/docker/reroute.rb +17 -0
- data/lib/baykit/bayserver/docker/secure.rb +22 -0
- data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
- data/lib/baykit/bayserver/docker/town.rb +30 -0
- data/lib/baykit/bayserver/docker/trouble.rb +17 -0
- data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
- data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
- data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
- data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
- data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
- data/lib/baykit/bayserver/http_exception.rb +33 -0
- data/lib/baykit/bayserver/mem_usage.rb +104 -0
- data/lib/baykit/bayserver/protocol/command.rb +21 -0
- data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
- data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
- data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
- data/lib/baykit/bayserver/protocol/package.rb +15 -0
- data/lib/baykit/bayserver/protocol/packet.rb +63 -0
- data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
- data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
- data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
- data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
- data/lib/baykit/bayserver/sink.rb +22 -0
- data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
- data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
- data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
- data/lib/baykit/bayserver/tours/package.rb +4 -0
- data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
- data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
- data/lib/baykit/bayserver/tours/tour.rb +195 -0
- data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
- data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
- data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
- data/lib/baykit/bayserver/train/train.rb +54 -0
- data/lib/baykit/bayserver/train/train_runner.rb +32 -0
- data/lib/baykit/bayserver/util/byte_array.rb +54 -0
- data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
- data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
- data/lib/baykit/bayserver/util/char_util.rb +22 -0
- data/lib/baykit/bayserver/util/cities.rb +45 -0
- data/lib/baykit/bayserver/util/class_util.rb +17 -0
- data/lib/baykit/bayserver/util/counter.rb +23 -0
- data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
- data/lib/baykit/bayserver/util/executor_service.rb +81 -0
- data/lib/baykit/bayserver/util/groups.rb +110 -0
- data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
- data/lib/baykit/bayserver/util/headers.rb +194 -0
- data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
- data/lib/baykit/bayserver/util/http_status.rb +60 -0
- data/lib/baykit/bayserver/util/http_util.rb +157 -0
- data/lib/baykit/bayserver/util/io_util.rb +32 -0
- data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
- data/lib/baykit/bayserver/util/key_val.rb +15 -0
- data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
- data/lib/baykit/bayserver/util/locale.rb +30 -0
- data/lib/baykit/bayserver/util/md5_password.rb +24 -0
- data/lib/baykit/bayserver/util/message.rb +56 -0
- data/lib/baykit/bayserver/util/mimes.rb +27 -0
- data/lib/baykit/bayserver/util/object_factory.rb +13 -0
- data/lib/baykit/bayserver/util/object_store.rb +74 -0
- data/lib/baykit/bayserver/util/postman.rb +35 -0
- data/lib/baykit/bayserver/util/reusable.rb +13 -0
- data/lib/baykit/bayserver/util/selector.rb +141 -0
- data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
- data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
- data/lib/baykit/bayserver/util/string_util.rb +73 -0
- data/lib/baykit/bayserver/util/sys_util.rb +138 -0
- data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
- data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
- data/lib/baykit/bayserver/util/valve.rb +15 -0
- data/lib/baykit/bayserver/version.rb +7 -0
- data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
- data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
- data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
- metadata +189 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/next_socket_action'
|
|
2
|
+
require 'baykit/bayserver/agent/transporter/data_listener'
|
|
3
|
+
require 'baykit/bayserver/docker/warp/warp_ship'
|
|
4
|
+
require 'baykit/bayserver/tours/tour'
|
|
5
|
+
require 'baykit/bayserver/util/counter'
|
|
6
|
+
require 'baykit/bayserver/util/http_status'
|
|
7
|
+
|
|
8
|
+
module Baykit
|
|
9
|
+
module BayServer
|
|
10
|
+
module Docker
|
|
11
|
+
module Warp
|
|
12
|
+
class WarpDataListener
|
|
13
|
+
|
|
14
|
+
include Baykit::BayServer::Agent::Transporter::DataListener # implements
|
|
15
|
+
|
|
16
|
+
include Baykit::BayServer::Agent
|
|
17
|
+
include Baykit::BayServer::Util
|
|
18
|
+
include Baykit::BayServer::Tours
|
|
19
|
+
|
|
20
|
+
attr :ship
|
|
21
|
+
|
|
22
|
+
def initialize(sip)
|
|
23
|
+
@ship = sip
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s()
|
|
27
|
+
return @ship.to_s
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
######################################################
|
|
31
|
+
# Implements DataListener
|
|
32
|
+
######################################################
|
|
33
|
+
|
|
34
|
+
def notify_handshake_done(protocol)
|
|
35
|
+
@ship.protocol_handler.verify_protocol(protocol)
|
|
36
|
+
|
|
37
|
+
# Send pending packet
|
|
38
|
+
@ship.agent.non_blocking_handler.ask_to_write(@ship.socket)
|
|
39
|
+
NextSocketAction::CONTINUE
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def notify_connect
|
|
43
|
+
@ship.connected = true
|
|
44
|
+
@ship.tour_map.values.each do |pair|
|
|
45
|
+
tur = pair[1]
|
|
46
|
+
tur.check_tour_id pair[0]
|
|
47
|
+
WarpData.get(tur).start
|
|
48
|
+
end
|
|
49
|
+
NextSocketAction::CONTINUE
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def notify_read(buf, adr)
|
|
53
|
+
return @ship.protocol_handler.bytes_received(buf)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def notify_eof
|
|
57
|
+
BayLog.debug("%s EOF detected", self)
|
|
58
|
+
|
|
59
|
+
if @ship.tour_map.empty?
|
|
60
|
+
BayLog.debug("%s No warp tours. only close", self)
|
|
61
|
+
return NextSocketAction::CLOSE
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
@ship.tour_map.keys.each do |warp_id|
|
|
65
|
+
pair = @ship.tour_map[warp_id]
|
|
66
|
+
tur = pair[1]
|
|
67
|
+
tur.check_tour_id pair[0]
|
|
68
|
+
|
|
69
|
+
if !tur.res.header_sent
|
|
70
|
+
BayLog.error("%s Send ServiceUnavailable: tur=%s", self, tur);
|
|
71
|
+
tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "Server closed on reading headers")
|
|
72
|
+
else
|
|
73
|
+
# NOT treat EOF as Error
|
|
74
|
+
BayLog.debug("%s EOF is not an error: tur=%s", self, tur);
|
|
75
|
+
begin
|
|
76
|
+
tur.res.end_content(Tour::TOUR_ID_NOCHECK)
|
|
77
|
+
rescue IOError => e
|
|
78
|
+
BayLog::debug_e(e, "%s end content error: tur=%s", self, tur);
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
@ship.tour_map.clear()
|
|
84
|
+
return NextSocketAction::CLOSE
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def notify_protocol_error(err)
|
|
88
|
+
BayLog.error_e(err)
|
|
89
|
+
self.ship.notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, err.message)
|
|
90
|
+
true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def check_timeout(duration_sec)
|
|
94
|
+
if @ship.is_timeout(duration_sec)
|
|
95
|
+
self.ship.notify_error_to_owner_tour(HttpStatus::GATEWAY_TIMEOUT, "#{self} server timeout")
|
|
96
|
+
true
|
|
97
|
+
else
|
|
98
|
+
false
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def notify_close()
|
|
103
|
+
BayLog.debug("%s notifyClose", self)
|
|
104
|
+
self.ship.notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, "#{self} server closed")
|
|
105
|
+
self.ship.end_ship()
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
require 'baykit/bayserver/agent/grand_agent'
|
|
4
|
+
require 'baykit/bayserver/docker/base/club_base'
|
|
5
|
+
require 'baykit/bayserver/docker/warp/warp_data'
|
|
6
|
+
require 'baykit/bayserver/docker/warp/warp_data_listener'
|
|
7
|
+
require 'baykit/bayserver/docker/warp/warp_ship_store'
|
|
8
|
+
|
|
9
|
+
module Baykit
|
|
10
|
+
module BayServer
|
|
11
|
+
module Docker
|
|
12
|
+
module Warp
|
|
13
|
+
class WarpDocker < Baykit::BayServer::Docker::Base::ClubBase
|
|
14
|
+
|
|
15
|
+
include Baykit::BayServer::Agent
|
|
16
|
+
include Baykit::BayServer::Protocol
|
|
17
|
+
include Baykit::BayServer::Bcf
|
|
18
|
+
include Baykit::BayServer::Util
|
|
19
|
+
include Baykit::BayServer::Docker::Warp
|
|
20
|
+
|
|
21
|
+
class AgentListener
|
|
22
|
+
include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener
|
|
23
|
+
|
|
24
|
+
attr :warp_docker
|
|
25
|
+
|
|
26
|
+
def initialize(dkr)
|
|
27
|
+
@warp_docker = dkr
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def add(agt)
|
|
31
|
+
@warp_docker.stores[agt.agent_id] = WarpShipStore.new(@warp_docker.max_ships);
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def remove(agt)
|
|
35
|
+
@warp_docker.stores.delete(agt.agent_id);
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class WarpShipHolder
|
|
41
|
+
attr :owner_id
|
|
42
|
+
attr :ship_id
|
|
43
|
+
attr :ship
|
|
44
|
+
|
|
45
|
+
def initialize(owner_id, ship_id, ship)
|
|
46
|
+
@owner_id = owner_id
|
|
47
|
+
@ship_id = ship_id
|
|
48
|
+
@ship = ship
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
attr :scheme
|
|
53
|
+
attr :host
|
|
54
|
+
attr :port
|
|
55
|
+
attr :warp_base
|
|
56
|
+
attr :max_ships
|
|
57
|
+
attr :cur_ships
|
|
58
|
+
attr :host_addr
|
|
59
|
+
attr :timeout_sec
|
|
60
|
+
attr :tour_list
|
|
61
|
+
attr :lock
|
|
62
|
+
|
|
63
|
+
# Agent ID => WarpShipStore
|
|
64
|
+
attr :stores
|
|
65
|
+
|
|
66
|
+
######################################################
|
|
67
|
+
# Abstract methods
|
|
68
|
+
######################################################
|
|
69
|
+
#
|
|
70
|
+
#
|
|
71
|
+
# public abstract boolean secure();
|
|
72
|
+
# protected abstract String protocol();
|
|
73
|
+
# protected abstract Transporter newTransporter(ShipAgent agent, SocketChannel ch);
|
|
74
|
+
#
|
|
75
|
+
|
|
76
|
+
def initialize
|
|
77
|
+
super
|
|
78
|
+
@scheme = nil
|
|
79
|
+
@host = nil
|
|
80
|
+
@port = 0
|
|
81
|
+
@warp_base = nil
|
|
82
|
+
@max_ships = -1
|
|
83
|
+
@cur_ships = 0
|
|
84
|
+
@host_addr = nil
|
|
85
|
+
@tour_list = []
|
|
86
|
+
@timeout_sec = -1 # -1 means "Use harbor.socketTimeoutSec"
|
|
87
|
+
@stores = {}
|
|
88
|
+
@lock = Mutex.new
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
######################################################
|
|
92
|
+
# Implements DockerBase
|
|
93
|
+
######################################################
|
|
94
|
+
|
|
95
|
+
def init(elm, parent)
|
|
96
|
+
super
|
|
97
|
+
|
|
98
|
+
if @warp_base == nil
|
|
99
|
+
@warp_base = "/"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
@host_addr = []
|
|
103
|
+
if @host && @host.start_with?(":unix:")
|
|
104
|
+
@host_addr << :UNIX
|
|
105
|
+
@host_addr << Socket.sockaddr_un(@host[6 .. -1])
|
|
106
|
+
@port = -1
|
|
107
|
+
else
|
|
108
|
+
|
|
109
|
+
if @port <= 0
|
|
110
|
+
@port = 80
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
@host_addr << :INET
|
|
114
|
+
|
|
115
|
+
begin
|
|
116
|
+
addrs = Addrinfo.getaddrinfo(@host, @port, nil, :STREAM)
|
|
117
|
+
rescue SocketError => e
|
|
118
|
+
BayLog.error_e(e)
|
|
119
|
+
raise ConfigException.new(elm.file_name, elm.line_no, "Invalid address: %s:%d", @host, @port)
|
|
120
|
+
end
|
|
121
|
+
inet4_addr = nil
|
|
122
|
+
inet6_addr = nil
|
|
123
|
+
if addrs
|
|
124
|
+
addrs.each do |adr|
|
|
125
|
+
if adr.ipv4?
|
|
126
|
+
inet4_addr = adr
|
|
127
|
+
elsif adr.ipv6?
|
|
128
|
+
inet6_addr = adr
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
if inet4_addr
|
|
134
|
+
@host_addr << inet4_addr
|
|
135
|
+
elsif inet6_addr
|
|
136
|
+
@host_addr << inet6_addr
|
|
137
|
+
else
|
|
138
|
+
raise ConfigException.new(elm.file_name, elm.line_no, "Host not found: %s", @host)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
GrandAgent.add_lifecycle_listener(AgentListener.new(self));
|
|
146
|
+
|
|
147
|
+
BayLog.info("WarpDocker[%s] host=%s port=%d adr=%s", @warp_base, @host, @port, @host_addr)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def init_key_val(kv)
|
|
151
|
+
case kv.key.downcase
|
|
152
|
+
|
|
153
|
+
when "destcity"
|
|
154
|
+
@host = kv.value
|
|
155
|
+
|
|
156
|
+
when "destport"
|
|
157
|
+
@port = kv.value.to_i
|
|
158
|
+
|
|
159
|
+
when "desttown"
|
|
160
|
+
@warp_base = kv.value
|
|
161
|
+
if !@warp_base.end_with?("/")
|
|
162
|
+
@warp_base += "/"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
when "maxships"
|
|
166
|
+
@max_ships = kv.value.to_i
|
|
167
|
+
|
|
168
|
+
when "timeout"
|
|
169
|
+
@timeout_sec = kv.value.to_i
|
|
170
|
+
|
|
171
|
+
else
|
|
172
|
+
return super
|
|
173
|
+
end
|
|
174
|
+
return true
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
######################################################
|
|
178
|
+
# Implements Club
|
|
179
|
+
######################################################
|
|
180
|
+
|
|
181
|
+
def arrive(tur)
|
|
182
|
+
agt = tur.ship.agent
|
|
183
|
+
sto = get_ship_store(agt.agent_id)
|
|
184
|
+
|
|
185
|
+
wsip = sto.rent()
|
|
186
|
+
if wsip == nil
|
|
187
|
+
BayLog.warn("%s Busy!", self)
|
|
188
|
+
raise HttpException.new HttpStatus::INTERNAL_SERVER_ERROR, "WarpDocker busy"
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
begin
|
|
192
|
+
BayLog.trace("%s got from store", wsip)
|
|
193
|
+
need_connect = false
|
|
194
|
+
|
|
195
|
+
if !wsip.initialized
|
|
196
|
+
if @host_addr[0] == :UNIX
|
|
197
|
+
skt = Socket.new(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
|
|
198
|
+
else
|
|
199
|
+
skt = Socket.new(@host_addr[1].ipv4? ? Socket::AF_INET : Socket::AF_INET6, Socket::SOCK_STREAM, 0)
|
|
200
|
+
end
|
|
201
|
+
skt.nonblock = true
|
|
202
|
+
|
|
203
|
+
tp = new_transporter(agt, skt)
|
|
204
|
+
proto_hnd = ProtocolHandlerStore.get_store(protocol(), false, agt.agent_id).rent()
|
|
205
|
+
wsip.init_warp(skt, agt, tp, self, proto_hnd)
|
|
206
|
+
tp.init(agt.non_blocking_handler, skt, WarpDataListener.new(wsip))
|
|
207
|
+
BayLog.debug("%s init warp ship", wsip)
|
|
208
|
+
BayLog.debug("%s Connect to %s:%d skt=%s", wsip, @host, @port, skt)
|
|
209
|
+
|
|
210
|
+
need_connect = true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
@lock.synchronize do
|
|
214
|
+
@tour_list.append(tur)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
wsip.start_warp_tour(tur)
|
|
218
|
+
|
|
219
|
+
if need_connect
|
|
220
|
+
agt.non_blocking_handler.add_channel_listener(wsip.socket, tp)
|
|
221
|
+
agt.non_blocking_handler.ask_to_connect(wsip.socket, @host_addr[1])
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
rescue SystemCallError => e
|
|
225
|
+
wsip.end_warp_tour(tur)
|
|
226
|
+
raise e
|
|
227
|
+
rescue HttpException => e
|
|
228
|
+
raise e
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
######################################################
|
|
236
|
+
# Implements WarpDocker
|
|
237
|
+
######################################################
|
|
238
|
+
def keep_ship(wsip)
|
|
239
|
+
BayLog.debug("%s keepShip: %s", self, wsip)
|
|
240
|
+
get_ship_store(wsip.agent.agent_id).keep(wsip)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def return_ship(wsip)
|
|
244
|
+
BayLog.debug("%s return ship: %s", self, wsip);
|
|
245
|
+
get_ship_store(wsip.agent.agent_id).Return(wsip)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def return_protocol_handler(agt, phnd)
|
|
249
|
+
BayLog.debug("%s Return protocol handler: ", phnd)
|
|
250
|
+
get_protocol_handler_store(agt.agent_id).Return(phnd)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
######################################################
|
|
254
|
+
# Other methods
|
|
255
|
+
######################################################
|
|
256
|
+
def get_ship_store(agent_id)
|
|
257
|
+
return @stores[agent_id]
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
######################################################
|
|
261
|
+
# private methods
|
|
262
|
+
######################################################
|
|
263
|
+
private
|
|
264
|
+
|
|
265
|
+
def get_protocol_handler_store(agt_id)
|
|
266
|
+
return ProtocolHandlerStore.get_store(protocol(), false, agt_id)
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Baykit
|
|
2
|
+
module BayServer
|
|
3
|
+
module Docker
|
|
4
|
+
module Warp
|
|
5
|
+
module WarpHandler # interface
|
|
6
|
+
|
|
7
|
+
def next_warp_id()
|
|
8
|
+
raise NotImplementedError()
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def new_warp_data(warp_id)
|
|
12
|
+
raise NotImplementedError()
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def post_warp_headers(tur)
|
|
16
|
+
raise NotImplementedError()
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def post_warp_contents(tur, buf, start, len, &callback)
|
|
20
|
+
raise NotImplementedError()
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def post_warp_end(tur)
|
|
24
|
+
raise NotImplementedError()
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Verify if protocol is allowed
|
|
29
|
+
#
|
|
30
|
+
def verify_protocol(protocol)
|
|
31
|
+
raise NotImplementedError()
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'baykit/bayserver/util/counter'
|
|
2
|
+
require 'baykit/bayserver/util/http_status'
|
|
3
|
+
require 'baykit/bayserver/docker/warp/warp_ship'
|
|
4
|
+
|
|
5
|
+
module Baykit
|
|
6
|
+
module BayServer
|
|
7
|
+
module Docker
|
|
8
|
+
module Warp
|
|
9
|
+
class WarpShip < Baykit::BayServer::WaterCraft::Ship
|
|
10
|
+
include Baykit::BayServer::Agent
|
|
11
|
+
include Baykit::BayServer::WaterCraft
|
|
12
|
+
include Baykit::BayServer::Tours
|
|
13
|
+
include Baykit::BayServer::Util
|
|
14
|
+
|
|
15
|
+
attr :tour_map
|
|
16
|
+
attr :docker
|
|
17
|
+
|
|
18
|
+
attr_accessor :connected
|
|
19
|
+
attr :socket_timeout_sec
|
|
20
|
+
attr :lock
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def initialize()
|
|
24
|
+
super
|
|
25
|
+
@docker = nil
|
|
26
|
+
@socket_timeout_sec = nil
|
|
27
|
+
@tour_map = {}
|
|
28
|
+
@lock = Mutex.new()
|
|
29
|
+
@connected = false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def to_s()
|
|
33
|
+
return "warp##{@ship_id}/#{@object_id}[#{protocol}]"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
######################################################
|
|
37
|
+
# Implements Reusable
|
|
38
|
+
######################################################
|
|
39
|
+
|
|
40
|
+
def reset()
|
|
41
|
+
super
|
|
42
|
+
if !@tour_map.empty?
|
|
43
|
+
BayLog.error("BUG: Some tours is active: %s", @tour_map)
|
|
44
|
+
end
|
|
45
|
+
@connected = false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
######################################################
|
|
50
|
+
# Other methods
|
|
51
|
+
######################################################
|
|
52
|
+
def init_warp(skt, agt, tp, dkr, proto_hnd)
|
|
53
|
+
init(skt, agt, tp)
|
|
54
|
+
@docker = dkr
|
|
55
|
+
@socket_timeout_sec = @docker.timeout_sec >= 0 ? @docker.timeout_sec : BayServer.harbor.socket_timeout_sec
|
|
56
|
+
set_protocol_handler(proto_hnd)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def warp_handler
|
|
60
|
+
return @protocol_handler
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def start_warp_tour(tur)
|
|
64
|
+
w_hnd = warp_handler()
|
|
65
|
+
warp_id = w_hnd.next_warp_id()
|
|
66
|
+
wdat = w_hnd.new_warp_data(warp_id)
|
|
67
|
+
BayLog.debug("%s new warp tour related to %s", wdat, tur)
|
|
68
|
+
tur.req.set_content_handler(wdat)
|
|
69
|
+
|
|
70
|
+
BayLog.debug("%s start: warpId=%d", wdat, warp_id);
|
|
71
|
+
if @tour_map.key?(warp_id)
|
|
72
|
+
raise Sink.new("warpId exists")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
@tour_map[warp_id] = [tur.id(), tur]
|
|
76
|
+
w_hnd.post_warp_headers(tur)
|
|
77
|
+
|
|
78
|
+
if @connected
|
|
79
|
+
BayLog.debug("%s is already connected. Start warp tour:%s", wdat, tur);
|
|
80
|
+
wdat.start
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def end_warp_tour(tur)
|
|
85
|
+
wdat = WarpData.get(tur)
|
|
86
|
+
BayLog.debug("%s end: started=%s ended=%s", tur, wdat.started, wdat.ended)
|
|
87
|
+
@tour_map.delete wdat.warp_id
|
|
88
|
+
@docker.keep_ship(self)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def notify_service_unavailable(msg)
|
|
92
|
+
notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, msg)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def get_tour(warp_id, must=true)
|
|
96
|
+
pair = @tour_map[warp_id]
|
|
97
|
+
if pair != nil
|
|
98
|
+
tur = pair[1]
|
|
99
|
+
tur.check_tour_id pair[0]
|
|
100
|
+
if !WarpData.get(tur).ended
|
|
101
|
+
return tur
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if must
|
|
106
|
+
raise Sink.new("%s warp tours not found: id=%d", self, warp_id)
|
|
107
|
+
else
|
|
108
|
+
nil
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def packet_unpacker
|
|
113
|
+
return @protocol_handler.packet_unpacker
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def notify_error_to_owner_tour(status, msg)
|
|
117
|
+
@lock.synchronize do
|
|
118
|
+
@tour_map.keys.each do |warp_id|
|
|
119
|
+
tur = get_tour(warp_id)
|
|
120
|
+
BayLog.debug("%s send error to owner: %s running=%s", self, tur, tur.running?)
|
|
121
|
+
if tur.running?
|
|
122
|
+
begin
|
|
123
|
+
tur.res.send_error(Tour::TOUR_ID_NOCHECK, status, msg)
|
|
124
|
+
rescue Exception => e
|
|
125
|
+
BayLog.error_e(e)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
@tour_map.clear
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def end_ship()
|
|
135
|
+
@docker.return_protocol_handler(@agent, @protocol_handler)
|
|
136
|
+
@docker.return_ship(self)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def abort(check_id)
|
|
140
|
+
check_ship_id(check_id)
|
|
141
|
+
@postman.abort
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def is_timeout(duration)
|
|
145
|
+
if @keeping
|
|
146
|
+
# warp connection never timeout in keeping
|
|
147
|
+
timeout = false
|
|
148
|
+
elsif @socket_timeout_sec <= 0
|
|
149
|
+
timeout = false
|
|
150
|
+
else
|
|
151
|
+
timeout = duration >= @socket_timeout_sec
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
BayLog.debug("%s Warp check timeout: dur=%d, timeout=%s, keeping=%s limit=%d",
|
|
155
|
+
self, duration, timeout, @keeping, @socket_timeout_sec)
|
|
156
|
+
return timeout
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def inspect
|
|
160
|
+
to_s
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'baykit/bayserver/protocol/packet_store'
|
|
2
|
+
require 'baykit/bayserver/docker/warp/package'
|
|
3
|
+
|
|
4
|
+
module Baykit
|
|
5
|
+
module BayServer
|
|
6
|
+
module Docker
|
|
7
|
+
module Warp
|
|
8
|
+
class WarpShipStore < Baykit::BayServer::Util::ObjectStore
|
|
9
|
+
include Baykit::BayServer::Protocol
|
|
10
|
+
include Baykit::BayServer::Util
|
|
11
|
+
include Baykit::BayServer::Docker::Warp
|
|
12
|
+
|
|
13
|
+
attr :keep_list
|
|
14
|
+
attr :busy_list
|
|
15
|
+
|
|
16
|
+
attr :max_ships
|
|
17
|
+
attr :lock
|
|
18
|
+
|
|
19
|
+
def initialize(max_ships)
|
|
20
|
+
super()
|
|
21
|
+
@keep_list = []
|
|
22
|
+
@busy_list = []
|
|
23
|
+
@lock = Mutex.new
|
|
24
|
+
@max_ships = max_ships
|
|
25
|
+
@factory = -> { WarpShip.new() }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def to_s
|
|
29
|
+
return "warp_ship_store"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def rent()
|
|
33
|
+
if @max_ships > 0 && count() >= @max_ships
|
|
34
|
+
return nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
if @keep_list.empty?
|
|
38
|
+
BayLog.debug("rent from Object Store")
|
|
39
|
+
|
|
40
|
+
wsip = super()
|
|
41
|
+
if wsip == nil
|
|
42
|
+
return nil
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
BayLog.trace("rent from keep list: %s", @keep_list)
|
|
46
|
+
wsip = @keep_list.delete_at(@keep_list.length - 1)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if wsip == nil
|
|
50
|
+
raise Sink.new("BUG! ship is null")
|
|
51
|
+
end
|
|
52
|
+
if wsip.postman != nil && wsip.postman.zombie?
|
|
53
|
+
raise Sink("channel is zombie: %s", wsip)
|
|
54
|
+
end
|
|
55
|
+
@busy_list.append(wsip)
|
|
56
|
+
|
|
57
|
+
BayLog.trace(" rent keepList=%s busyList=%s", @keep_list, @busy_list)
|
|
58
|
+
return wsip
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def keep(wsip)
|
|
62
|
+
BayLog.trace("keep: before keepList=%s busyList=%s", @keep_list, @busy_list)
|
|
63
|
+
|
|
64
|
+
if !@busy_list.delete(wsip)
|
|
65
|
+
BayLog.error("%s not in busy list", wsip)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@keep_list.append(wsip)
|
|
69
|
+
|
|
70
|
+
BayLog.trace("keep: after keepList=%s busyList=%s", @keep_list, @busy_list)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def Return(wsip)
|
|
74
|
+
BayLog.trace("Return: before keepList=%s busyList=%s", @keep_list, @busy_list)
|
|
75
|
+
|
|
76
|
+
removed_from_keep = @keep_list.delete(wsip)
|
|
77
|
+
removed_from_busy = @busy_list.delete(wsip)
|
|
78
|
+
if !removed_from_keep && !removed_from_busy
|
|
79
|
+
BayLog.error("%s not in both keep list and busy list", wsip)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
super
|
|
83
|
+
|
|
84
|
+
BayLog.trace("Return: after keepList=%s busyList=%s", @keep_list, @busy_list)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def count()
|
|
88
|
+
@keep_list.length + @busy_list.length
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def print_usage(indent)
|
|
92
|
+
BayLog.info("%sWarpShipStore Usage:", StringUtil.indent(indent))
|
|
93
|
+
BayLog.info("%skeepList: %d", StringUtil.indent(indent+1), @keep_list.length())
|
|
94
|
+
if BayLog.debug_mode?
|
|
95
|
+
@keep_list.each do |obj|
|
|
96
|
+
BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
BayLog.info("%sbusyList: %d", StringUtil.indent(indent+1), @busy_list.length())
|
|
100
|
+
if BayLog.debug_mode?
|
|
101
|
+
@busy_list.each do |obj|
|
|
102
|
+
BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
super
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|