bayserver-core 2.2.2 → 2.3.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.
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