bayserver-docker-cgi 2.3.2 → 3.0.1
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/docker/cgi/cgi_docker.rb +44 -95
- data/lib/baykit/bayserver/docker/cgi/cgi_req_content_handler.rb +142 -31
- data/lib/baykit/bayserver/docker/cgi/{cgi_std_err_yacht.rb → cgi_std_err_ship.rb} +18 -18
- data/lib/baykit/bayserver/docker/cgi/{cgi_std_out_yacht.rb → cgi_std_out_ship.rb} +19 -18
- data/lib/baykit/bayserver/docker/cgi/cgi_train.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3cdbebe5e23bcc71ecc34c6f585d4b4db8c6132e321e06aff783910ee9d3a35
|
4
|
+
data.tar.gz: 1af83a4e9402e3ebd2e2e21831dd6076f913490de153622969f0a144f1130adc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56827d267b1638ee77a8f2577ec7a34b75a6e2926b8da19e088ecd43a8a48969acbdbca3ace6769b5391e598be9eaaad54f1762674c2f1e306b4fce4ea3af50a
|
7
|
+
data.tar.gz: bc7313412fc64ddeb0bff010dbc5d64ce1926a8361bdea873faef984b2ae8fe7091af53cef3831c8ff449f565654dc2ab4730298714ff22767c83e7f3f5966c3
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'baykit/bayserver/bcf/package'
|
2
|
-
require 'baykit/bayserver/agent/
|
2
|
+
require 'baykit/bayserver/agent/multiplexer/plain_transporter'
|
3
3
|
require 'baykit/bayserver/agent/transporter/spin_read_transporter'
|
4
4
|
require 'baykit/bayserver/tours/tour'
|
5
5
|
require 'baykit/bayserver/tours/read_file_taxi'
|
6
6
|
require 'baykit/bayserver/docker/base/club_base'
|
7
7
|
require 'baykit/bayserver/docker/harbor'
|
8
8
|
require 'baykit/bayserver/docker/cgi/cgi_req_content_handler'
|
9
|
-
require 'baykit/bayserver/docker/cgi/
|
10
|
-
require 'baykit/bayserver/docker/cgi/
|
9
|
+
require 'baykit/bayserver/docker/cgi/cgi_std_out_ship'
|
10
|
+
require 'baykit/bayserver/docker/cgi/cgi_std_err_ship'
|
11
11
|
require 'baykit/bayserver/docker/cgi/cgi_message'
|
12
12
|
require 'baykit/bayserver/taxi/taxi_runner'
|
13
13
|
require 'baykit/bayserver/util/http_status'
|
@@ -22,30 +22,33 @@ module Baykit
|
|
22
22
|
include Baykit::BayServer::Bcf
|
23
23
|
include Baykit::BayServer::Util
|
24
24
|
include Baykit::BayServer::Agent
|
25
|
-
include Baykit::BayServer::Agent::
|
25
|
+
include Baykit::BayServer::Agent::Multiplexer
|
26
26
|
include Baykit::BayServer::Docker
|
27
27
|
include Baykit::BayServer::Docker::Cgi
|
28
28
|
include Baykit::BayServer::Tours
|
29
29
|
include Baykit::BayServer::Taxi
|
30
|
+
include Baykit::BayServer::Rudders
|
30
31
|
|
31
|
-
DEFAULT_PROC_READ_METHOD = Harbor::FILE_SEND_METHOD_TAXI
|
32
32
|
DEFAULT_TIMEOUT_SEC = 0
|
33
33
|
|
34
34
|
attr :interpreter
|
35
35
|
attr :script_base
|
36
36
|
attr :doc_root
|
37
37
|
attr :timeout_sec
|
38
|
+
attr :max_processes
|
39
|
+
attr :process_count
|
40
|
+
attr :wait_count
|
38
41
|
|
39
|
-
# Method to read stdin/stderr
|
40
|
-
attr :proc_read_method
|
41
42
|
|
42
43
|
def initialize()
|
43
44
|
super
|
44
45
|
@interpreter = nil
|
45
46
|
@script_base = nil
|
46
47
|
@doc_root = nil
|
47
|
-
@proc_read_method = CgiDocker::DEFAULT_PROC_READ_METHOD
|
48
48
|
@timeout_sec = CgiDocker::DEFAULT_TIMEOUT_SEC
|
49
|
+
@max_processes = -1
|
50
|
+
@process_count = 0
|
51
|
+
@wait_count = 0
|
49
52
|
end
|
50
53
|
|
51
54
|
######################################################
|
@@ -54,16 +57,6 @@ module Baykit
|
|
54
57
|
|
55
58
|
def init(elm, parent)
|
56
59
|
super
|
57
|
-
|
58
|
-
if @proc_read_method == Harbor::FILE_SEND_METHOD_SELECT and !SysUtil.support_select_pipe()
|
59
|
-
BayLog.warn(BayMessage.get(:CGI_PROC_READ_METHOD_SELECT_NOT_SUPPORTED))
|
60
|
-
@proc_read_method = Harbor::FILE_SEND_METHOD_TAXI
|
61
|
-
end
|
62
|
-
|
63
|
-
if @proc_read_method == Harbor::FILE_SEND_METHOD_SPIN and !SysUtil.support_nonblock_pipe_read()
|
64
|
-
BayLog.warn(BayMessage.get(:CGI_PROC_READ_METHOD_SPIN_NOT_SUPPORTED))
|
65
|
-
@proc_read_method = Harbor::FILE_SEND_METHOD_TAXI
|
66
|
-
end
|
67
60
|
end
|
68
61
|
|
69
62
|
|
@@ -82,25 +75,12 @@ module Baykit
|
|
82
75
|
when "docroot"
|
83
76
|
@doc_root = kv.value
|
84
77
|
|
85
|
-
when "processreadmethod"
|
86
|
-
case kv.value.downcase()
|
87
|
-
|
88
|
-
when "select"
|
89
|
-
@proc_read_method = Harbor::FILE_SEND_METHOD_SELECT
|
90
|
-
|
91
|
-
when "spin"
|
92
|
-
@proc_read_method = Harbor::FILE_SEND_METHOD_SPIN
|
93
|
-
|
94
|
-
when "taxi"
|
95
|
-
@proc_read_method = Harbor::FILE_SEND_METHOD_TAXI
|
96
|
-
|
97
|
-
else
|
98
|
-
raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PARAMETER_VALUE, kv.value))
|
99
|
-
end
|
100
|
-
|
101
78
|
when "timeout"
|
102
79
|
@timeout_sec = kv.value.to_i
|
103
80
|
|
81
|
+
when "maxprocesses"
|
82
|
+
@max_processes = kv.value.to_i
|
83
|
+
|
104
84
|
else
|
105
85
|
return super
|
106
86
|
end
|
@@ -137,7 +117,7 @@ module Baykit
|
|
137
117
|
end
|
138
118
|
|
139
119
|
env = CgiUtil.get_env_hash(tur.town.name, root, base, tur)
|
140
|
-
if BayServer.harbor.trace_header
|
120
|
+
if BayServer.harbor.trace_header
|
141
121
|
env.keys.each do |name|
|
142
122
|
value = env[name]
|
143
123
|
BayLog.info("%s cgi: env: %s=%s", tur, name, value)
|
@@ -149,67 +129,9 @@ module Baykit
|
|
149
129
|
raise HttpException.new(HttpStatus::NOT_FOUND, file_name)
|
150
130
|
end
|
151
131
|
|
152
|
-
|
153
|
-
handler = CgiReqContentHandler.new(self, tur)
|
132
|
+
handler = CgiReqContentHandler.new(self, tur, env)
|
154
133
|
tur.req.set_content_handler(handler)
|
155
|
-
handler.
|
156
|
-
fname = "cgi#"
|
157
|
-
|
158
|
-
out_yat = CgiStdOutYacht.new()
|
159
|
-
err_yat = CgiStdErrYacht.new()
|
160
|
-
|
161
|
-
case(@proc_read_method)
|
162
|
-
when Harbor::FILE_SEND_METHOD_SELECT
|
163
|
-
out_tp = PlainTransporter.new(false, bufsize)
|
164
|
-
out_yat.init(tur, out_tp, handler)
|
165
|
-
out_tp.init(tur.ship.agent.non_blocking_handler, handler.std_out[0], out_yat)
|
166
|
-
out_tp.open_valve()
|
167
|
-
|
168
|
-
err_tp = PlainTransporter.new(false, bufsize)
|
169
|
-
err_yat.init(tur, handler)
|
170
|
-
err_tp.init(tur.ship.agent.non_blocking_handler, handler.std_err[0], err_yat)
|
171
|
-
err_tp.open_valve()
|
172
|
-
|
173
|
-
when Harbor::FILE_SEND_METHOD_SPIN
|
174
|
-
|
175
|
-
def eof_checker()
|
176
|
-
begin
|
177
|
-
pid = Process.wait(handler.pid, Process::WNOHANG)
|
178
|
-
return pid != nil
|
179
|
-
rescue Errno::ECHILD => e
|
180
|
-
BayLog.error_e(e)
|
181
|
-
return true
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
out_tp = SpinReadTransporter.new(bufsize)
|
186
|
-
out_yat.init(tur, out_tp, handler)
|
187
|
-
out_tp.init(tur.ship.agent.spin_handler, out_yat, handler.std_out[0], -1, @timeout_sec, eof_checker)
|
188
|
-
out_tp.open_valve()
|
189
|
-
|
190
|
-
err_tp = SpinReadTransporter.new(bufsize)
|
191
|
-
err_yat.init(tur, handler)
|
192
|
-
err_tp.init(tur.ship.agent.spin_handler, err_yat, handler.std_out[0], -1, @timeout_sec, eof_checker)
|
193
|
-
err_tp.open_valve()
|
194
|
-
|
195
|
-
when Harbor::FILE_SEND_METHOD_TAXI
|
196
|
-
out_txi = ReadFileTaxi.new(tur.ship.agent.agent_id, bufsize)
|
197
|
-
out_yat.init(tur, out_txi, handler)
|
198
|
-
out_txi.init(handler.std_out[0], out_yat)
|
199
|
-
if !TaxiRunner.post(tur.ship.agent.agent_id, out_txi)
|
200
|
-
raise HttpException.new(HttpStatus.SERVICE_UNAVAILABLE, "Taxi is busy!")
|
201
|
-
end
|
202
|
-
|
203
|
-
err_txi = ReadFileTaxi.new(tur.ship.agent.agent_id, bufsize)
|
204
|
-
err_yat.init(tur, handler)
|
205
|
-
err_txi.init(handler.std_err[0], err_yat)
|
206
|
-
if !TaxiRunner.post(tur.ship.agent.agent_id, err_txi)
|
207
|
-
raise HttpException.new(HttpStatus.SERVICE_UNAVAILABLE, "Taxi is busy!")
|
208
|
-
end
|
209
|
-
|
210
|
-
else
|
211
|
-
raise Sink.new();
|
212
|
-
end
|
134
|
+
handler.req_start_tour()
|
213
135
|
end
|
214
136
|
|
215
137
|
def create_command(env)
|
@@ -221,6 +143,33 @@ module Baykit
|
|
221
143
|
end
|
222
144
|
command
|
223
145
|
end
|
146
|
+
|
147
|
+
######################################################
|
148
|
+
# Other methods
|
149
|
+
######################################################
|
150
|
+
|
151
|
+
def get_wait_count
|
152
|
+
@wait_count
|
153
|
+
end
|
154
|
+
|
155
|
+
def add_process_count
|
156
|
+
if @max_processes <= 0 || @process_count < @max_processes
|
157
|
+
@process_count += 1
|
158
|
+
BayLog.debug("%s Process count: %d", self, @process_count)
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
|
162
|
+
@wait_count += 1
|
163
|
+
return false
|
164
|
+
end
|
165
|
+
|
166
|
+
def sub_process_count
|
167
|
+
return @process_count -= 1
|
168
|
+
end
|
169
|
+
|
170
|
+
def sub_wait_count
|
171
|
+
return @wait_count -= 1
|
172
|
+
end
|
224
173
|
end
|
225
174
|
end
|
226
175
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'baykit/bayserver/agent/grand_agent'
|
2
|
+
require 'baykit/bayserver/agent/multiplexer/plain_transporter'
|
3
|
+
require 'baykit/bayserver/common/postpone'
|
1
4
|
require 'baykit/bayserver/train/train'
|
2
5
|
require 'baykit/bayserver/tours/req_content_handler'
|
3
6
|
|
7
|
+
require 'baykit/bayserver/rudders/io_rudder'
|
4
8
|
require 'baykit/bayserver/util/string_util'
|
5
9
|
require 'baykit/bayserver/util/http_status'
|
6
10
|
|
@@ -10,10 +14,13 @@ module Baykit
|
|
10
14
|
module Cgi
|
11
15
|
class CgiReqContentHandler
|
12
16
|
include Baykit::BayServer::Tours::ReqContentHandler # implements
|
17
|
+
include Baykit::BayServer::Common::Postpone # implements
|
13
18
|
|
14
19
|
include Baykit::BayServer::Agent
|
20
|
+
include Baykit::BayServer::Agent::Multiplexer
|
15
21
|
include Baykit::BayServer::Train
|
16
22
|
include Baykit::BayServer::Tours
|
23
|
+
include Baykit::BayServer::Rudders
|
17
24
|
include Baykit::BayServer::Util
|
18
25
|
|
19
26
|
READ_CHUNK_SIZE = 8192
|
@@ -23,50 +30,67 @@ module Baykit
|
|
23
30
|
attr :tour_id
|
24
31
|
attr :available
|
25
32
|
attr :pid
|
26
|
-
attr :
|
27
|
-
attr :
|
28
|
-
attr :
|
33
|
+
attr :std_in_rd
|
34
|
+
attr :std_out_rd
|
35
|
+
attr :std_err_rd
|
29
36
|
attr :std_out_closed
|
30
37
|
attr :std_err_closed
|
31
38
|
attr :last_access
|
39
|
+
attr_accessor :multiplexer
|
40
|
+
attr :env
|
32
41
|
|
33
|
-
def initialize(cgi_docker, tur)
|
42
|
+
def initialize(cgi_docker, tur, env)
|
34
43
|
@cgi_docker = cgi_docker
|
35
44
|
@tour = tur
|
36
45
|
@tour_id = tur.tour_id
|
46
|
+
@env = env
|
37
47
|
@std_out_closed = true
|
38
48
|
@std_err_closed = true
|
39
49
|
end
|
40
50
|
|
51
|
+
######################################################
|
52
|
+
# Implements Postpone
|
53
|
+
######################################################
|
54
|
+
def run
|
55
|
+
@cgi_docker.sub_wait_count
|
56
|
+
BayLog.info("%s challenge postponed tour", @tour, @cgi_docker.get_wait_count)
|
57
|
+
req_start_tour
|
58
|
+
end
|
59
|
+
|
41
60
|
######################################################
|
42
61
|
# Implements ReqContentHandler
|
43
62
|
######################################################
|
44
63
|
|
45
|
-
def
|
64
|
+
def on_read_req_content(tur, buf, start, len, &callback)
|
46
65
|
BayLog.debug("%s CGI:onReadReqContent: len=%d", tur, len)
|
47
66
|
|
48
|
-
wrote_len = @
|
67
|
+
wrote_len = @std_in_rd.write(buf[start, len])
|
49
68
|
BayLog.debug("%s CGI:onReadReqContent: wrote=%d", tur, wrote_len)
|
50
|
-
tur.req.consumed(Tour::TOUR_ID_NOCHECK, len)
|
69
|
+
tur.req.consumed(Tour::TOUR_ID_NOCHECK, len, &callback)
|
51
70
|
access()
|
52
71
|
end
|
53
72
|
|
54
|
-
def
|
73
|
+
def on_end_req_content(tur)
|
55
74
|
BayLog.trace("%s CGI:endReqContent", tur)
|
56
75
|
access()
|
57
76
|
end
|
58
77
|
|
59
|
-
def
|
78
|
+
def on_abort_req(tur)
|
60
79
|
BayLog.debug("%s CGI:abortReq", tur)
|
80
|
+
|
61
81
|
if !@std_out_closed
|
62
|
-
@
|
82
|
+
@multiplexer.req_close(@std_out_rd)
|
63
83
|
end
|
64
84
|
if !@std_err_closed
|
65
|
-
@
|
85
|
+
@multiplexer.req_close(@std_err_rd)
|
66
86
|
end
|
67
87
|
|
68
|
-
|
69
|
-
|
88
|
+
if @pid == nil
|
89
|
+
BayLog.warn("%s Cannot kill process (pid is null)", tur)
|
90
|
+
else
|
91
|
+
BayLog.debug("%s KILL PROCESS!: %d", tur, @pid)
|
92
|
+
Process.kill('KILL', @pid)
|
93
|
+
end
|
70
94
|
|
71
95
|
return false # not aborted immediately
|
72
96
|
end
|
@@ -75,29 +99,110 @@ module Baykit
|
|
75
99
|
# Other methods
|
76
100
|
######################################################
|
77
101
|
|
78
|
-
def
|
102
|
+
def req_start_tour
|
103
|
+
if @cgi_docker.add_process_count
|
104
|
+
BayLog.info("%s start tour: wait count=%d", @tour, @cgi_docker.get_wait_count)
|
105
|
+
start_tour
|
106
|
+
else
|
107
|
+
BayLog.warn("%s Cannot start tour: wait count=%d", @tour, @cgi_docker.get_wait_count)
|
108
|
+
agt = GrandAgent.get(@tour.ship.agent_id)
|
109
|
+
agt.add_postpone(self)
|
110
|
+
end
|
111
|
+
access()
|
112
|
+
end
|
113
|
+
|
114
|
+
def start_tour
|
79
115
|
@available = false
|
80
116
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
117
|
+
std_in = IO.pipe()
|
118
|
+
std_out = IO.pipe()
|
119
|
+
std_err = IO.pipe()
|
120
|
+
std_in[1].set_encoding("ASCII-8BIT")
|
121
|
+
std_out[0].set_encoding("ASCII-8BIT")
|
122
|
+
std_err[0].set_encoding("ASCII-8BIT")
|
87
123
|
|
88
|
-
command = @cgi_docker.create_command(env)
|
124
|
+
command = @cgi_docker.create_command(@env)
|
89
125
|
BayLog.debug("%s Spawn: %s", @tour, command)
|
90
|
-
@pid = Process.spawn(env, command, :in =>
|
126
|
+
@pid = Process.spawn(env, command, :in => std_in[0], :out => std_out[1], :err => std_err[1])
|
91
127
|
BayLog.debug("%s created process; %s", @tour, @pid)
|
92
128
|
|
93
|
-
|
94
|
-
|
95
|
-
|
129
|
+
std_in[0].close()
|
130
|
+
std_out[1].close()
|
131
|
+
std_err[1].close()
|
132
|
+
|
133
|
+
@std_in_rd = IORudder.new(std_in[1])
|
134
|
+
@std_out_rd = IORudder.new(std_out[0])
|
135
|
+
@std_err_rd = IORudder.new(std_err[0])
|
96
136
|
BayLog.debug("#{@tour} PID: #{pid}")
|
97
137
|
|
98
138
|
@std_out_closed = false
|
99
139
|
@std_err_closed = false
|
100
|
-
|
140
|
+
|
141
|
+
bufsize = 8192
|
142
|
+
|
143
|
+
agt = GrandAgent.get(@tour.ship.agent_id)
|
144
|
+
|
145
|
+
case(BayServer.harbor.cgi_multiplexer)
|
146
|
+
when Harbor::MULTIPLEXER_TYPE_SPIDER
|
147
|
+
mpx = agt.spider_multiplexer
|
148
|
+
@std_out_rd.set_non_blocking
|
149
|
+
@std_err_rd.set_non_blocking
|
150
|
+
|
151
|
+
when Harbor::MULTIPLEXER_TYPE_SPIN
|
152
|
+
|
153
|
+
def eof_checker()
|
154
|
+
begin
|
155
|
+
pid = Process.wait(handler.pid, Process::WNOHANG)
|
156
|
+
return pid != nil
|
157
|
+
rescue Errno::ECHILD => e
|
158
|
+
BayLog.error_e(e)
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
mpx = agt.spin_multiplexer
|
163
|
+
@std_out_rd.set_non_blocking
|
164
|
+
@std_err_rd.set_non_blocking
|
165
|
+
|
166
|
+
when Harbor::MULTIPLEXER_TYPE_TAXI
|
167
|
+
mpx = agt.taxi_multiplexer
|
168
|
+
|
169
|
+
when Harbor::MULTIPLEXER_TYPE_JOB
|
170
|
+
mpx = agt.job_multiplexer
|
171
|
+
|
172
|
+
else
|
173
|
+
raise Sink.new();
|
174
|
+
end
|
175
|
+
|
176
|
+
if mpx != nil
|
177
|
+
@multiplexer = mpx
|
178
|
+
out_ship = CgiStdOutShip.new
|
179
|
+
out_tp = PlainTransporter.new(agt.net_multiplexer, out_ship, false, bufsize, false)
|
180
|
+
|
181
|
+
out_ship.init_std_out(@std_out_rd, @tour.ship.agent_id, @tour, out_tp, self)
|
182
|
+
|
183
|
+
mpx.add_rudder_state(
|
184
|
+
@std_out_rd,
|
185
|
+
RudderState.new(@std_out_rd, out_tp)
|
186
|
+
)
|
187
|
+
|
188
|
+
ship_id = @tour.ship.ship_id
|
189
|
+
@tour.res.set_consume_listener do |len, resume|
|
190
|
+
if resume
|
191
|
+
out_ship.resume_read(ship_id)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
err_ship = CgiStdErrShip.new
|
196
|
+
err_tp = PlainTransporter.new(agt.net_multiplexer, err_ship, false, bufsize, false)
|
197
|
+
err_ship.init_std_err(@std_err_rd, @tour.ship.agent_id, self)
|
198
|
+
mpx.add_rudder_state(
|
199
|
+
@std_err_rd,
|
200
|
+
RudderState.new(@std_err_rd, err_tp)
|
201
|
+
)
|
202
|
+
|
203
|
+
mpx.req_read(@std_out_rd)
|
204
|
+
mpx.req_read(@std_err_rd)
|
205
|
+
end
|
101
206
|
end
|
102
207
|
|
103
208
|
def std_out_closed()
|
@@ -115,7 +220,7 @@ module Baykit
|
|
115
220
|
end
|
116
221
|
|
117
222
|
def access()
|
118
|
-
@last_access = Time.now.
|
223
|
+
@last_access = Time.now.tv_sec
|
119
224
|
end
|
120
225
|
|
121
226
|
def timed_out()
|
@@ -123,7 +228,7 @@ module Baykit
|
|
123
228
|
return false
|
124
229
|
end
|
125
230
|
|
126
|
-
duration_sec = Time.now.
|
231
|
+
duration_sec = Time.now.tv_sec - @last_access
|
127
232
|
BayLog.debug("%s Check CGI timeout: dur=%d, timeout=%d", @tour, duration_sec, @cgi_docker.timeout_sec)
|
128
233
|
return duration_sec > @cgi_docker.timeout_sec
|
129
234
|
end
|
@@ -132,9 +237,8 @@ module Baykit
|
|
132
237
|
BayLog.debug("%s CGI Process finished: pid=%s", @tour, @pid)
|
133
238
|
|
134
239
|
pid, stat = Process.wait2(@pid)
|
135
|
-
print(stat)
|
136
|
-
|
137
240
|
BayLog.debug("%s CGI Process finished: pid=%s code=%s", @tour, pid, stat.exitstatus)
|
241
|
+
agt_id = @tour.ship.agent_id
|
138
242
|
|
139
243
|
begin
|
140
244
|
if stat.exitstatus != 0
|
@@ -142,11 +246,18 @@ module Baykit
|
|
142
246
|
BayLog.error("%s CGI Invalid exit status pid=%d code=%s", @tour, @pid, stat.exitstatus)
|
143
247
|
@tour.res.send_error(@tour_id, HttpStatus::INTERNAL_SERVER_ERROR, "Invalid exit Status")
|
144
248
|
else
|
145
|
-
@tour.res.
|
249
|
+
@tour.res.end_res_content(@tour_id)
|
146
250
|
end
|
147
251
|
rescue IOError => e
|
148
252
|
BayLog.error_e(e)
|
149
253
|
end
|
254
|
+
|
255
|
+
@cgi_docker.sub_process_count
|
256
|
+
if @cgi_docker.get_wait_count > 0
|
257
|
+
BayLog.warn("agt#%d Catch up postponed process: process wait count=%d", agt_id, @cgi_docker.get_wait_count)
|
258
|
+
agt = GrandAgent.get(agt_id)
|
259
|
+
agt.req_catch_up
|
260
|
+
end
|
150
261
|
end
|
151
262
|
end
|
152
263
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'baykit/bayserver/agent/next_socket_action'
|
2
|
-
require 'baykit/bayserver/
|
2
|
+
require 'baykit/bayserver/common/read_only_ship'
|
3
3
|
require 'baykit/bayserver/util/string_util'
|
4
4
|
require 'baykit/bayserver/util/reusable'
|
5
5
|
|
@@ -7,13 +7,11 @@ module Baykit
|
|
7
7
|
module BayServer
|
8
8
|
module Docker
|
9
9
|
module Cgi
|
10
|
-
class
|
10
|
+
class CgiStdErrShip < Baykit::BayServer::Common::ReadOnlyShip
|
11
11
|
|
12
12
|
include Baykit::BayServer::Agent
|
13
13
|
include Baykit::BayServer::Util
|
14
14
|
|
15
|
-
attr :tour
|
16
|
-
attr :tour_id
|
17
15
|
attr :handler
|
18
16
|
|
19
17
|
def initialize
|
@@ -21,8 +19,13 @@ module Baykit
|
|
21
19
|
reset()
|
22
20
|
end
|
23
21
|
|
22
|
+
def init_std_err(rd, agt_id, handler)
|
23
|
+
init(agt_id, rd, nil)
|
24
|
+
@handler = handler
|
25
|
+
end
|
26
|
+
|
24
27
|
def to_s()
|
25
|
-
return "
|
28
|
+
return "agt#{@agent_id} err_ship#{@ship_id}/#{@object_id}";
|
26
29
|
end
|
27
30
|
|
28
31
|
######################################################
|
@@ -30,16 +33,15 @@ module Baykit
|
|
30
33
|
######################################################
|
31
34
|
|
32
35
|
def reset()
|
33
|
-
|
34
|
-
@tour_id = 0
|
36
|
+
super
|
35
37
|
@handler = nil
|
36
38
|
end
|
37
39
|
|
38
40
|
######################################################
|
39
|
-
# implements
|
41
|
+
# implements ReadOnlyShip
|
40
42
|
######################################################
|
41
43
|
|
42
|
-
def notify_read(buf
|
44
|
+
def notify_read(buf)
|
43
45
|
|
44
46
|
BayLog.debug("%s CGI StdErr %d bytesd", self, buf.length)
|
45
47
|
if(buf.length() > 0)
|
@@ -50,14 +52,18 @@ module Baykit
|
|
50
52
|
|
51
53
|
end
|
52
54
|
|
55
|
+
def notify_error(e)
|
56
|
+
BayLog.debug_e(e)
|
57
|
+
end
|
58
|
+
|
53
59
|
def notify_eof()
|
54
|
-
BayLog.debug("
|
60
|
+
BayLog.debug("agt#%d CGI stderr EOF\\(^o^)/", @agent_id)
|
55
61
|
return NextSocketAction::CLOSE
|
56
62
|
end
|
57
63
|
|
58
64
|
def notify_close()
|
59
|
-
BayLog.debug("
|
60
|
-
@
|
65
|
+
BayLog.debug("agt#%d CGI stderr notifyClose", @agent_id)
|
66
|
+
@handler.std_err_closed()
|
61
67
|
end
|
62
68
|
|
63
69
|
def check_timeout(duration_sec)
|
@@ -69,12 +75,6 @@ module Baykit
|
|
69
75
|
# Custom methods
|
70
76
|
######################################################
|
71
77
|
|
72
|
-
def init(tur, handler)
|
73
|
-
init_yacht()
|
74
|
-
@tour = tur
|
75
|
-
@tour_id = tur.tour_id
|
76
|
-
@handler = handler
|
77
|
-
end
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'baykit/bayserver/agent/next_socket_action'
|
2
|
-
require 'baykit/bayserver/
|
2
|
+
require 'baykit/bayserver/common/read_only_ship'
|
3
3
|
require 'baykit/bayserver/util/string_util'
|
4
4
|
require 'baykit/bayserver/util/reusable'
|
5
5
|
|
@@ -7,7 +7,7 @@ module Baykit
|
|
7
7
|
module BayServer
|
8
8
|
module Docker
|
9
9
|
module Cgi
|
10
|
-
class
|
10
|
+
class CgiStdOutShip < Baykit::BayServer::Common::ReadOnlyShip
|
11
11
|
|
12
12
|
include Baykit::BayServer::Agent
|
13
13
|
include Baykit::BayServer::Util
|
@@ -26,8 +26,16 @@ module Baykit
|
|
26
26
|
reset()
|
27
27
|
end
|
28
28
|
|
29
|
+
def init_std_out(rd, agent_id, tur, tp, handler)
|
30
|
+
init(agent_id, rd, tp)
|
31
|
+
@handler = handler
|
32
|
+
@tour = tur
|
33
|
+
@tour_id = tur.tour_id
|
34
|
+
@header_reading = true
|
35
|
+
end
|
36
|
+
|
29
37
|
def to_s()
|
30
|
-
return "
|
38
|
+
return "agt##{@agent_id} out_ship#{@ship_id}/#{@object_id}";
|
31
39
|
end
|
32
40
|
|
33
41
|
######################################################
|
@@ -44,10 +52,10 @@ module Baykit
|
|
44
52
|
end
|
45
53
|
|
46
54
|
######################################################
|
47
|
-
# implements
|
55
|
+
# implements ReadOnlyShip
|
48
56
|
######################################################
|
49
57
|
|
50
|
-
def notify_read(buf
|
58
|
+
def notify_read(buf)
|
51
59
|
@file_wrote_len += buf.length
|
52
60
|
BayLog.trace("%s read file %d bytes: total=%d", self, buf.length, @file_wrote_len)
|
53
61
|
|
@@ -110,7 +118,7 @@ module Baykit
|
|
110
118
|
@remain += buf[pos .. -1]
|
111
119
|
else
|
112
120
|
if buf.length - pos > 0
|
113
|
-
available = @tour.res.
|
121
|
+
available = @tour.res.send_res_content(@tour_id, buf, pos, buf.length - pos);
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
@@ -123,6 +131,10 @@ module Baykit
|
|
123
131
|
|
124
132
|
end
|
125
133
|
|
134
|
+
def notify_error(e)
|
135
|
+
BayLog.debug_e(e, "%s CGI notifyError", self)
|
136
|
+
end
|
137
|
+
|
126
138
|
def notify_eof()
|
127
139
|
BayLog.debug("%s stdout EOF(^o^)", @tour)
|
128
140
|
return NextSocketAction::CLOSE
|
@@ -130,7 +142,7 @@ module Baykit
|
|
130
142
|
|
131
143
|
def notify_close()
|
132
144
|
BayLog.debug("%s stdout notifyClose", @tour)
|
133
|
-
@
|
145
|
+
@handler.std_out_closed()
|
134
146
|
end
|
135
147
|
|
136
148
|
def check_timeout(duration_sec)
|
@@ -150,17 +162,6 @@ module Baykit
|
|
150
162
|
# Custom methods
|
151
163
|
######################################################
|
152
164
|
|
153
|
-
def init(tur, valve, handler)
|
154
|
-
init_yacht()
|
155
|
-
@handler = handler
|
156
|
-
@tour = tur
|
157
|
-
@tour_id = tur.tour_id
|
158
|
-
tur.res.set_consume_listener do |len, resume|
|
159
|
-
if resume
|
160
|
-
valve.open_valve();
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
165
|
end
|
165
166
|
end
|
166
167
|
end
|
@@ -64,7 +64,7 @@ module Baykit
|
|
64
64
|
# Handle StdOut
|
65
65
|
HttpUtil.parse_message_headers(@std_out[0], @tour.res.headers)
|
66
66
|
|
67
|
-
if BayServer.harbor.trace_header
|
67
|
+
if BayServer.harbor.trace_header
|
68
68
|
@tour.res.headers.names.each do |name|
|
69
69
|
@tour.res.headers.values(name).each do |value|
|
70
70
|
BayLog.info("%s CGI: resHeader: %s=%s", @tour, name, value)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bayserver-docker-cgi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michisuke-P
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bayserver-core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.1
|
27
27
|
description: BayServer is one of the high-speed web servers. It operates as a single-threaded,
|
28
28
|
asynchronous server, which makes it exceptionally fast. It also supports multi-core
|
29
29
|
processors, harnessing the full potential of the CPU's capabilities.
|
@@ -37,8 +37,8 @@ files:
|
|
37
37
|
- lib/baykit/bayserver/docker/cgi/cgi_docker.rb
|
38
38
|
- lib/baykit/bayserver/docker/cgi/cgi_message.rb
|
39
39
|
- lib/baykit/bayserver/docker/cgi/cgi_req_content_handler.rb
|
40
|
-
- lib/baykit/bayserver/docker/cgi/
|
41
|
-
- lib/baykit/bayserver/docker/cgi/
|
40
|
+
- lib/baykit/bayserver/docker/cgi/cgi_std_err_ship.rb
|
41
|
+
- lib/baykit/bayserver/docker/cgi/cgi_std_out_ship.rb
|
42
42
|
- lib/baykit/bayserver/docker/cgi/cgi_train.rb
|
43
43
|
- lib/baykit/bayserver/docker/cgi/php_cgi_docker.rb
|
44
44
|
homepage: https://baykit.yokohama
|