bayserver-core 2.2.2 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/baykit/bayserver/agent/command_receiver.rb +1 -1
  3. data/lib/baykit/bayserver/agent/grand_agent.rb +89 -76
  4. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +1 -0
  5. data/lib/baykit/bayserver/agent/lifecycle_listener.rb +16 -0
  6. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +37 -8
  7. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +1 -0
  8. data/lib/baykit/bayserver/agent/spin_handler.rb +16 -0
  9. data/lib/baykit/bayserver/agent/timer_handler.rb +15 -0
  10. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +20 -51
  11. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +2 -1
  12. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +3 -2
  13. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +8 -2
  14. data/lib/baykit/bayserver/docker/warp/warp_data.rb +8 -0
  15. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +9 -9
  16. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +2 -1
  17. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +32 -3
  18. data/lib/baykit/bayserver/mem_usage.rb +2 -1
  19. data/lib/baykit/bayserver/protocol/packet_store.rb +2 -1
  20. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +2 -1
  21. data/lib/baykit/bayserver/taxi/taxi.rb +1 -0
  22. data/lib/baykit/bayserver/taxi/taxi_runner.rb +94 -5
  23. data/lib/baykit/bayserver/tours/read_file_taxi.rb +46 -23
  24. data/lib/baykit/bayserver/tours/send_file_yacht.rb +5 -1
  25. data/lib/baykit/bayserver/tours/tour.rb +5 -6
  26. data/lib/baykit/bayserver/tours/tour_req.rb +28 -28
  27. data/lib/baykit/bayserver/tours/tour_res.rb +93 -31
  28. data/lib/baykit/bayserver/tours/tour_store.rb +2 -1
  29. data/lib/baykit/bayserver/util/executor_service.rb +27 -10
  30. data/lib/baykit/bayserver/version.rb +1 -1
  31. metadata +4 -2
@@ -82,6 +82,7 @@ module Baykit
82
82
  @bytes_posted = 0
83
83
  @bytes_consumed = 0
84
84
  @bytes_limit = 0
85
+ @tour_returned = false
85
86
  end
86
87
 
87
88
  ######################################################
@@ -121,8 +122,16 @@ module Baykit
121
122
  end
122
123
  end
123
124
 
124
- @tour.ship.send_headers(@tour.ship_id, @tour)
125
- @header_sent = true
125
+ begin
126
+ @tour.ship.send_headers(@tour.ship_id, @tour)
127
+ rescue IOError => e
128
+ BayLog.debug_e(e, "%s abort: %s", @tour, e)
129
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
130
+ raise e
131
+ ensure
132
+ @header_sent = true
133
+ end
134
+
126
135
  end
127
136
 
128
137
  def send_redirect(chk_tour_id, status, location)
@@ -132,9 +141,15 @@ module Baykit
132
141
  BayLog.error("Try to redirect after response header is sent (Ignore)")
133
142
  else
134
143
  set_consume_listener(&ContentConsumeListener::DEV_NULL)
135
- @tour.ship.send_redirect(@tour.ship_id, @tour, status, location)
136
- @header_sent = true
137
- end_content(chk_tour_id)
144
+ begin
145
+ @tour.ship.send_redirect(@tour.ship_id, @tour, status, location)
146
+ rescue IOError => e
147
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
148
+ raise e
149
+ ensure
150
+ @header_sent = true
151
+ end_content(chk_tour_id)
152
+ end
138
153
  end
139
154
 
140
155
  end
@@ -170,27 +185,31 @@ module Baykit
170
185
  raise Sink.new("Response consume listener is null")
171
186
  end
172
187
 
188
+ @bytes_posted += len
173
189
  BayLog.debug("%s posted res content len=%d posted=%d limit=%d consumed=%d",
174
190
  @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
175
191
  if @bytes_limit > 0 && @bytes_limit < self.bytes_posted
176
192
  raise ProtocolException.new("Post data exceed content-length: " + @bytes_posted + "/" + @bytes_limit)
177
193
  end
178
194
 
179
- if @can_compress
180
- get_compressor().compress(buf, ofs, len, &done_lis)
195
+ if @tour.zombie? || @tour.aborted?
196
+ # Don't send peer any data
197
+ BayLog::debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, @tour, @tour.state)
198
+ done_lis.call()
181
199
  else
182
- begin
183
- @tour.ship.send_res_content(@tour.ship_id, @tour, buf, ofs, len, &done_lis)
184
- rescue IOError => e
185
- done_lis.call()
186
- raise e
200
+ if @can_compress
201
+ get_compressor().compress(buf, ofs, len, &done_lis)
202
+ else
203
+ begin
204
+ @tour.ship.send_res_content(@tour.ship_id, @tour, buf, ofs, len, &done_lis)
205
+ rescue IOError => e
206
+ done_lis.call()
207
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
208
+ raise e
209
+ end
187
210
  end
188
211
  end
189
212
 
190
- @bytes_posted += len
191
-
192
- BayLog.debug("%s post res content: len=%d posted=%d limit=%d consumed=%d",
193
- @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
194
213
 
195
214
  old_available = @available
196
215
  if !buffer_available()
@@ -208,6 +227,10 @@ module Baykit
208
227
  @tour.check_tour_id(chk_tour_id)
209
228
 
210
229
  BayLog.debug("%s end ResContent", self)
230
+ if @tour.ended?
231
+ BayLog.debug("%s Tour is already ended (Ignore).", self)
232
+ return
233
+ end
211
234
 
212
235
  if !@tour.zombie? && @tour.city != nil
213
236
  @tour.city.log(@tour)
@@ -220,15 +243,34 @@ module Baykit
220
243
 
221
244
 
222
245
  # Done listener
246
+ tour_returned = false
223
247
  done_lis = Proc.new() do
248
+ @tour.check_tour_id(chk_tour_id)
224
249
  @tour.ship.return_tour(@tour)
250
+ tour_returned = true
225
251
  end
226
252
 
227
253
  begin
228
- @tour.ship.send_end_tour(@tour.ship_id, @tour, &done_lis)
229
- rescue IOError => e
230
- done_lis.call()
231
- raise e
254
+ if @tour.zombie? || @tour.aborted?
255
+ # Don't send peer any data. Do nothing
256
+ BayLog.debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, @tour, @tour.state)
257
+ done_lis.call()
258
+ else
259
+ begin
260
+ @tour.ship.send_end_tour(@tour.ship_id, @tour, &done_lis)
261
+ rescue IOError => e
262
+ BayLog.debug("%s Error on sending end tour", self)
263
+ done_lis.call()
264
+ raise e
265
+ end
266
+ end
267
+ ensure
268
+ # If tour is returned, we cannot change its state because
269
+ # it will become uninitialized.
270
+ BayLog.debug("%s tur#%d is returned: %s", self, chk_tour_id, tour_returned)
271
+ if !tour_returned
272
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ENDED)
273
+ end
232
274
  end
233
275
  end
234
276
 
@@ -281,15 +323,26 @@ module Baykit
281
323
  end
282
324
 
283
325
  if @header_sent
284
- BayLog.warn("Try to send error after response header is sent (Ignore)")
285
- BayLog.warn("%s: status=%d, message=%s", self, status, msg)
326
+ BayLog.debug("Try to send error after response header is sent (Ignore)")
327
+ BayLog.debug("%s: status=%d, message=%s", self, status, msg)
286
328
  if err != nil
287
329
  BayLog.error_e(err);
288
330
  end
289
331
  else
290
332
  set_consume_listener(&ContentConsumeListener::DEV_NULL)
291
- @tour.ship.send_error(@tour.ship_id, @tour, status, msg, err)
292
- @header_sent = true
333
+
334
+ if @tour.zombie? || @tour.aborted?
335
+ # Don't send peer any data. Do nothing
336
+ BayLog.debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, @tour, @tour.state)
337
+ else
338
+ begin
339
+ @tour.ship.send_error(@tour.ship_id, @tour, status, msg, err)
340
+ rescue IOError => e
341
+ BayLog.debug("%s Error on sending error", self)
342
+ @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
343
+ end
344
+ @header_sent = true
345
+ end
293
346
  end
294
347
 
295
348
  end_content(chk_tour_id)
@@ -306,7 +359,7 @@ module Baykit
306
359
 
307
360
  if File.directory?(file)
308
361
  raise HttpException.new HttpStatus::FORBIDDEN, file
309
- elsif !File.exists?(file)
362
+ elsif !File.exist?(file)
310
363
  raise HttpException.new HttpStatus::NOT_FOUND, file
311
364
  end
312
365
 
@@ -357,11 +410,11 @@ module Baykit
357
410
  tp.open_valve()
358
411
 
359
412
  when Harbor::FILE_SEND_METHOD_TAXI
360
- txi = ReadFileTaxi.new(bufsize)
413
+ txi = ReadFileTaxi.new(@tour.ship.agent.agent_id, bufsize)
361
414
  @yacht.init(@tour, file, txi)
362
415
  txi.init(File.open(file, "rb"), @yacht)
363
- if !TaxiRunner.post(txi)
364
- raise HttpException.new(HttpStatus.SERVICE_UNAVAILABLE, "Taxi is busy!");
416
+ if !TaxiRunner.post(@tour.ship.agent.agent_id, txi)
417
+ raise HttpException.new(HttpStatus::SERVICE_UNAVAILABLE, "Taxi is busy!");
365
418
  end
366
419
 
367
420
  else
@@ -382,9 +435,18 @@ module Baykit
382
435
 
383
436
  def get_compressor()
384
437
  if @compressor == nil
385
- @compressor = GzipCompressor.new(lambda do |new_buf, new_ofs, new_len, &lis|
386
- @tour.ship.send_res_content(@tour.ship_id, @tour, new_buf, new_ofs, new_len, &lis)
387
- end)
438
+ sip_id = @tour.ship.ship_id
439
+ tur_id = @tour.tour_id
440
+ gz_callback = lambda do |new_buf, new_ofs, new_len, &lis|
441
+ begin
442
+ @tour.ship.send_res_content(sip_id, @tour, new_buf, new_ofs, new_len, &lis)
443
+ rescue IOError => e
444
+ @tour.change_state(tur_id, Tour::TourState::ABORTED)
445
+ raise e
446
+ end
447
+ end
448
+
449
+ @compressor = GzipCompressor.new(gz_callback)
388
450
  end
389
451
 
390
452
  return @compressor
@@ -1,4 +1,5 @@
1
1
  require 'baykit/bayserver/agent/grand_agent'
2
+ require 'baykit/bayserver/agent/lifecycle_listener'
2
3
  require 'baykit/bayserver/tours/tour'
3
4
  require 'baykit/bayserver/util/string_util'
4
5
 
@@ -15,7 +16,7 @@ module Baykit
15
16
 
16
17
 
17
18
  class AgentListener
18
- include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
19
+ include Baykit::BayServer::Agent::LifecycleListener # implements
19
20
 
20
21
  def add(agt)
21
22
  TourStore.stores[agt.agent_id] = TourStore.new();
@@ -20,17 +20,25 @@ module Baykit
20
20
  @name = name
21
21
  end
22
22
 
23
+ def to_s
24
+ @name
25
+ end
26
+
23
27
  def run
24
28
  while true
25
- tsk = @que.deq
26
- #BayLog.debug("%s Start task on: %s", tsk, @name)
27
- tsk.run
28
- #BayLog.debug("%s End task on: %s", tsk, @name)
29
+ block = @que.deq
30
+ if block == nil
31
+ break
32
+ end
33
+ BayLog.debug("Start task on: %s", @name)
34
+ block.call
35
+ BayLog.debug("End task on: %s", @name)
29
36
  end
30
37
  end
31
38
 
32
- def to_s
33
- @name
39
+ def shutdown
40
+ @que.pop until @que.empty?
41
+ @que.enq(nil)
34
42
  end
35
43
  end
36
44
 
@@ -40,12 +48,14 @@ module Baykit
40
48
  attr :count
41
49
  attr :max_queue_len
42
50
  attr :name
51
+ attr :executors
43
52
 
44
53
  def initialize(name, count)
45
54
  @que = Thread::Queue.new
46
55
  @count = count
47
56
  @max_queue_len = MAX_LEN_PER_EXECUTOR * count
48
57
  @name = name
58
+ @executors = []
49
59
 
50
60
  count.times do |i|
51
61
  started = false
@@ -56,6 +66,7 @@ module Baykit
56
66
  Thread.current.name = th_name
57
67
  e = Executor.new @que, id, th_name
58
68
  e.run
69
+ @executors << e
59
70
  end
60
71
  while !started
61
72
  sleep(0.01)
@@ -63,17 +74,23 @@ module Baykit
63
74
  end
64
75
  end
65
76
 
66
- def to_s()
77
+ def to_s
67
78
  return "ExecutorService[#{@name}]"
68
79
  end
69
80
 
70
81
  # post task
71
- def submit(tsk)
72
- BayLog.debug("%s Submit: task=%s (qlen=%d/%d)", self, tsk, @que.length, @max_queue_len)
82
+ def submit(&block)
83
+ BayLog.debug("%s Submit: (qlen=%d/%d)", self, @que.length, @max_queue_len)
73
84
  if @que.length > @max_queue_len
74
85
  raise IOError("Task queue is full (>_<)")
75
86
  end
76
- @que.enq(tsk)
87
+ @que.enq(block)
88
+ end
89
+
90
+ def shutdown
91
+ @executors.each do |exe|
92
+ exe.shutdown
93
+ end
77
94
  end
78
95
  end
79
96
  end
@@ -1,7 +1,7 @@
1
1
  module Baykit
2
2
  module BayServer
3
3
  class Version
4
- VERSION='2.2.2'
4
+ VERSION='2.3.1'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bayserver-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.3.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: 2023-09-30 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: BayServer is one of the high-speed web servers. It operates as a single-threaded,
14
14
  asynchronous server, which makes it exceptionally fast. It also supports multi-core
@@ -25,6 +25,7 @@ files:
25
25
  - lib/baykit/bayserver/agent/command_receiver.rb
26
26
  - lib/baykit/bayserver/agent/grand_agent.rb
27
27
  - lib/baykit/bayserver/agent/grand_agent_monitor.rb
28
+ - lib/baykit/bayserver/agent/lifecycle_listener.rb
28
29
  - lib/baykit/bayserver/agent/next_socket_action.rb
29
30
  - lib/baykit/bayserver/agent/non_blocking_handler.rb
30
31
  - lib/baykit/bayserver/agent/package.rb
@@ -32,6 +33,7 @@ files:
32
33
  - lib/baykit/bayserver/agent/signal/signal_proxy.rb
33
34
  - lib/baykit/bayserver/agent/signal/signal_sender.rb
34
35
  - lib/baykit/bayserver/agent/spin_handler.rb
36
+ - lib/baykit/bayserver/agent/timer_handler.rb
35
37
  - lib/baykit/bayserver/agent/transporter/data_listener.rb
36
38
  - lib/baykit/bayserver/agent/transporter/package.rb
37
39
  - lib/baykit/bayserver/agent/transporter/plain_transporter.rb