riser 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/riser/daemon.rb +64 -90
- data/lib/riser/server.rb +60 -29
- data/lib/riser/version.rb +1 -1
- data/lib/riser.rb +1 -0
- data/misc/run_curls.sh +34 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ac8260579321a152af6b38fe4305936934ede2893c1b9ede48a1c85563aad8d
|
4
|
+
data.tar.gz: 93a8e6145c9d53e94ed3443d46dc64c55460638a60eab2097bc563eff9f2b724
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59148c981335471f2c57d0caca09b1b8272008180fbe045e2f5f13988996c020741930419c4df73570811d148bd66df89f2c5aa260767852df6fd8627f711bb3
|
7
|
+
data.tar.gz: f0ba2792523825f164376e19a841274c685aca4dab7c8f32a5b88a496c97dcbb5eb5a077a36b417029ad3cf1db885df300c096164b840b3c06b3387c91a5ad8a
|
data/lib/riser/daemon.rb
CHANGED
@@ -270,6 +270,65 @@ module Riser
|
|
270
270
|
end
|
271
271
|
private :server_stop_forced
|
272
272
|
|
273
|
+
def server_socket_option(server_socket, server_address)
|
274
|
+
if (server_address.backlog) then
|
275
|
+
if (@sysop.listen(server_socket, server_address.backlog)) then
|
276
|
+
@logger.info("server socket backlog: #{server_address.backlog}")
|
277
|
+
else
|
278
|
+
@logger.warn('server socket backlog is not changed.')
|
279
|
+
end
|
280
|
+
else
|
281
|
+
@logger.info('server socket backlog is default.')
|
282
|
+
end
|
283
|
+
|
284
|
+
if (server_address.type == :unix) then
|
285
|
+
if (server_address.mode) then
|
286
|
+
if (@sysop.chmod(server_address.mode, server_address.path)) then
|
287
|
+
@logger.info("unix domain server socket mode: #{'%04o' % server_address.mode}")
|
288
|
+
else
|
289
|
+
@logger.warn('unix domain server socket mode is not changed.')
|
290
|
+
end
|
291
|
+
else
|
292
|
+
@logger.info('unix domain server socket mode is default.')
|
293
|
+
end
|
294
|
+
|
295
|
+
if (server_address.owner || server_address.group) then
|
296
|
+
if (@sysop.chown(server_address.owner, server_address.group, server_address.path)) then
|
297
|
+
@logger.info("unix domain server socket ownership: <#{server_address.owner}> <#{server_address.group}>")
|
298
|
+
else
|
299
|
+
@logger.warn('unix domain server socket ownership is not changed.')
|
300
|
+
end
|
301
|
+
else
|
302
|
+
@logger.info('unix domain server socket ownership is default.')
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
nil
|
307
|
+
end
|
308
|
+
private :server_socket_option
|
309
|
+
|
310
|
+
def server_socket_close(server_socket, server_address)
|
311
|
+
# get local_address before close(2)
|
312
|
+
server_socket_local_address = server_socket.local_address
|
313
|
+
|
314
|
+
if (@sysop.close(server_socket)) then
|
315
|
+
@logger.info("close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
316
|
+
else
|
317
|
+
@logger.warn("failed to close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
318
|
+
end
|
319
|
+
|
320
|
+
if (server_address.type == :unix) then
|
321
|
+
if (@sysop.unlink(server_address.path)) then
|
322
|
+
@logger.info("delete unix server socket: #{server_address}")
|
323
|
+
else
|
324
|
+
@logger.warn("failed to delete unix server socket: #{server_address}")
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
nil
|
329
|
+
end
|
330
|
+
private :server_socket_close
|
331
|
+
|
273
332
|
def run_server(server_socket)
|
274
333
|
read_write = @sysop.pipe
|
275
334
|
unless (read_write) then
|
@@ -357,37 +416,7 @@ module Riser
|
|
357
416
|
@logger.info("open server socket: #{server_socket.local_address.inspect_sockaddr}")
|
358
417
|
|
359
418
|
begin
|
360
|
-
|
361
|
-
if (@sysop.listen(server_socket, server_address.backlog)) then
|
362
|
-
@logger.info("server socket backlog: #{server_address.backlog}")
|
363
|
-
else
|
364
|
-
@logger.warn('server socket backlog is not changed.')
|
365
|
-
end
|
366
|
-
else
|
367
|
-
@logger.info('server socket backlog is default.')
|
368
|
-
end
|
369
|
-
|
370
|
-
if (server_address.type == :unix) then
|
371
|
-
if (server_address.mode) then
|
372
|
-
if (@sysop.chmod(server_address.mode, server_address.path)) then
|
373
|
-
@logger.info("unix domain server socket mode: #{'%04o' % server_address.mode}")
|
374
|
-
else
|
375
|
-
@logger.warn('unix domain server socket mode is not changed.')
|
376
|
-
end
|
377
|
-
else
|
378
|
-
@logger.info('unix domain server socket mode is default.')
|
379
|
-
end
|
380
|
-
|
381
|
-
if (server_address.owner || server_address.group) then
|
382
|
-
if (@sysop.chown(server_address.owner, server_address.group, server_address.path)) then
|
383
|
-
@logger.info("unix domain server socket ownership: <#{server_address.owner}> <#{server_address.group}>")
|
384
|
-
else
|
385
|
-
@logger.warn('unix domain server socket ownership is not changed.')
|
386
|
-
end
|
387
|
-
else
|
388
|
-
@logger.info('unix domain server socket ownership is default.')
|
389
|
-
end
|
390
|
-
end
|
419
|
+
server_socket_option(server_socket, server_address)
|
391
420
|
|
392
421
|
unless (server_pid = run_server(server_socket)) then
|
393
422
|
@logger.fatal('failed to start daemon.')
|
@@ -426,19 +455,7 @@ module Riser
|
|
426
455
|
else
|
427
456
|
if (next_server_socket = @sysop.get_server_socket(next_server_address)) then
|
428
457
|
@logger.info("open server socket: #{next_server_socket.local_address.inspect_sockaddr}")
|
429
|
-
|
430
|
-
if (@sysop.close(server_socket)) then
|
431
|
-
@logger.info("close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
432
|
-
else
|
433
|
-
@logger.warn("failed to close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
434
|
-
end
|
435
|
-
if (server_address.type == :unix) then
|
436
|
-
if (@sysop.unlink(server_address.path)) then
|
437
|
-
@logger.info("delete unix server socket: #{server_address}")
|
438
|
-
else
|
439
|
-
@logger.warn("failed to delete unix server socket: #{server_address}")
|
440
|
-
end
|
441
|
-
end
|
458
|
+
server_socket_close(server_socket, server_address)
|
442
459
|
server_socket = next_server_socket
|
443
460
|
server_address = next_server_address
|
444
461
|
else
|
@@ -448,38 +465,7 @@ module Riser
|
|
448
465
|
else
|
449
466
|
@logger.warn("server socket continue: #{server_socket.local_address.inspect_sockaddr}")
|
450
467
|
end
|
451
|
-
|
452
|
-
if (server_address.backlog) then
|
453
|
-
if (@sysop.listen(server_socket, server_address.backlog)) then
|
454
|
-
@logger.info("server socket backlog: #{server_address.backlog}")
|
455
|
-
else
|
456
|
-
@logger.warn('server socket backlog is not changed.')
|
457
|
-
end
|
458
|
-
else
|
459
|
-
@logger.info('server socket backlog is default.')
|
460
|
-
end
|
461
|
-
|
462
|
-
if (server_address.type == :unix) then
|
463
|
-
if (server_address.mode) then
|
464
|
-
if (@sysop.chmod(server_address.mode, server_address.path)) then
|
465
|
-
@logger.info("unix domain server socket mode: #{'%04o' % server_address.mode}")
|
466
|
-
else
|
467
|
-
@logger.warn('unix domain server socket mode is not changed.')
|
468
|
-
end
|
469
|
-
else
|
470
|
-
@logger.info('unix domain server socket mode is default.')
|
471
|
-
end
|
472
|
-
|
473
|
-
if (server_address.owner || server_address.group) then
|
474
|
-
if (@sysop.chown(server_address.owner, server_address.group, server_address.path)) then
|
475
|
-
@logger.info("unix domain server socket ownership: <#{server_address.owner}> <#{server_address.group}>")
|
476
|
-
else
|
477
|
-
@logger.warn('unix domain server socket ownership is not changed.')
|
478
|
-
end
|
479
|
-
else
|
480
|
-
@logger.info('unix domain server socket ownership is default.')
|
481
|
-
end
|
482
|
-
end
|
468
|
+
server_socket_option(server_socket, server_address)
|
483
469
|
|
484
470
|
case (sig_ope)
|
485
471
|
when :restart_graceful
|
@@ -579,19 +565,7 @@ module Riser
|
|
579
565
|
@logger.warn('no server to stop.')
|
580
566
|
end
|
581
567
|
ensure
|
582
|
-
|
583
|
-
if (@sysop.close(server_socket)) then
|
584
|
-
@logger.info("close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
585
|
-
else
|
586
|
-
@logger.warn("failed to close server socket: #{server_socket_local_address.inspect_sockaddr}")
|
587
|
-
end
|
588
|
-
if (server_address.type == :unix) then
|
589
|
-
if (@sysop.unlink(server_address.path)) then
|
590
|
-
@logger.info("delete unix server socket: #{server_address}")
|
591
|
-
else
|
592
|
-
@logger.warn("failed to delete unix server socket: #{server_address}")
|
593
|
-
end
|
594
|
-
end
|
568
|
+
server_socket_close(server_socket, server_address)
|
595
569
|
end
|
596
570
|
|
597
571
|
@logger.info('daemon stop.')
|
@@ -628,7 +602,7 @@ module Riser
|
|
628
602
|
|
629
603
|
DEFAULT = {
|
630
604
|
daemonize: true,
|
631
|
-
daemon_name: 'ruby',
|
605
|
+
daemon_name: 'ruby'.freeze,
|
632
606
|
daemon_debug: $DEBUG,
|
633
607
|
daemon_nochdir: true,
|
634
608
|
status_file: nil,
|
data/lib/riser/server.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'io/wait'
|
4
4
|
require 'socket'
|
5
|
+
require 'tempfile'
|
5
6
|
|
6
7
|
module Riser
|
7
8
|
class TimeoutSizedQueue
|
@@ -173,6 +174,35 @@ module Riser
|
|
173
174
|
SIGNAL_RESTART_FORCED = :QUIT
|
174
175
|
end
|
175
176
|
|
177
|
+
module AcceptTimeout
|
178
|
+
module ServerSocketMethod
|
179
|
+
end
|
180
|
+
::TCPServer.class_eval{ include ServerSocketMethod }
|
181
|
+
::UNIXServer.class_eval{ include ServerSocketMethod }
|
182
|
+
|
183
|
+
refine ServerSocketMethod do
|
184
|
+
def accept_timeout(timeout_seconds)
|
185
|
+
begin
|
186
|
+
socket = accept_nonblock(exception: false)
|
187
|
+
if (socket != :wait_readable) then
|
188
|
+
socket
|
189
|
+
else
|
190
|
+
if (wait_readable(timeout_seconds) != nil) then
|
191
|
+
socket = accept_nonblock(exception: false)
|
192
|
+
# to ignore conflicting accept(2) at server restart overlap
|
193
|
+
if (socket != :wait_readable) then
|
194
|
+
socket
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
rescue Errno::EINTR # EINTR is not captured by `exception: false'
|
199
|
+
nil
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
using AcceptTimeout
|
205
|
+
|
176
206
|
class SocketThreadDispatcher
|
177
207
|
def initialize(thread_queue_name)
|
178
208
|
@thread_num = nil
|
@@ -307,10 +337,10 @@ module Riser
|
|
307
337
|
queue = TimeoutSizedQueue.new(@thread_queue_size, name: @thread_queue_name)
|
308
338
|
begin
|
309
339
|
thread_list = []
|
310
|
-
@thread_num.times
|
311
|
-
thread_list << Thread.
|
340
|
+
@thread_num.times do |i|
|
341
|
+
thread_list << Thread.start(i) {|thread_number|
|
312
342
|
begin
|
313
|
-
Thread.current[:number] =
|
343
|
+
Thread.current[:number] = thread_number
|
314
344
|
while (socket = queue.pop)
|
315
345
|
begin
|
316
346
|
@dispatch.call(socket)
|
@@ -324,7 +354,7 @@ module Riser
|
|
324
354
|
}
|
325
355
|
end
|
326
356
|
}
|
327
|
-
|
357
|
+
end
|
328
358
|
|
329
359
|
catch (:end_of_server) {
|
330
360
|
while (true)
|
@@ -475,6 +505,11 @@ module Riser
|
|
475
505
|
nil
|
476
506
|
end
|
477
507
|
|
508
|
+
SEND_CMD = "SEND\n".freeze # :nodoc:
|
509
|
+
SEND_LEN = SEND_CMD.length # :nodoc:
|
510
|
+
RADY_CMD = "RADY\n".freeze # :nodoc:
|
511
|
+
RADY_LEN = RADY_CMD.length # :nodoc:
|
512
|
+
|
478
513
|
def start(server_socket)
|
479
514
|
case (server_socket)
|
480
515
|
when TCPServer, UNIXServer
|
@@ -483,10 +518,17 @@ module Riser
|
|
483
518
|
socket_class = IO
|
484
519
|
end
|
485
520
|
|
521
|
+
parent_latch_file = Tempfile.open('riser_latch_')
|
522
|
+
child_latch_file = File.open(parent_latch_file.path, File::RDWR)
|
523
|
+
child_latch_file.flock(File::LOCK_EX | File::LOCK_NB) or raise "internal error: failed to lock latch file: #{parent_latch_file.path}"
|
524
|
+
parent_latch_file.unlink
|
525
|
+
|
486
526
|
process_list = []
|
487
527
|
@process_num.times do |pos|
|
488
528
|
child_io, parent_io = UNIXSocket.socketpair
|
489
529
|
pid = Process.fork{
|
530
|
+
parent_latch_file.close
|
531
|
+
|
490
532
|
parent_io.close
|
491
533
|
pos.times do |i|
|
492
534
|
process_list[i].io.close
|
@@ -506,12 +548,12 @@ module Riser
|
|
506
548
|
|
507
549
|
thread_dispatcher.accept{
|
508
550
|
if (child_io.wait_readable(@process_send_io_polling_timeout_seconds) != nil) then
|
509
|
-
command = child_io.read(
|
510
|
-
command ==
|
551
|
+
command = child_io.read(SEND_LEN)
|
552
|
+
command == SEND_CMD or raise "internal error: unknown command <#{command.inspect}>"
|
511
553
|
child_io.recv_io(socket_class)
|
512
554
|
end
|
513
555
|
}
|
514
|
-
thread_dispatcher.accept_return{ child_io.write(
|
556
|
+
thread_dispatcher.accept_return{ child_io.write(RADY_CMD) }
|
515
557
|
thread_dispatcher.dispatch(&@dispatch)
|
516
558
|
|
517
559
|
Signal.trap(SIGNAL_STOP_GRACEFUL) { thread_dispatcher.signal_stop_graceful }
|
@@ -520,8 +562,10 @@ module Riser
|
|
520
562
|
Signal.trap(SIGNAL_STAT_GET_NO_RESET) { thread_dispatcher.signal_stat_get(reset: false) }
|
521
563
|
Signal.trap(SIGNAL_STAT_STOP) { thread_dispatcher.signal_stat_stop }
|
522
564
|
|
565
|
+
# release flock(2)
|
566
|
+
child_latch_file.close
|
567
|
+
|
523
568
|
begin
|
524
|
-
child_io.write("RADY\n")
|
525
569
|
@at_fork.call
|
526
570
|
thread_dispatcher.start
|
527
571
|
ensure
|
@@ -533,10 +577,9 @@ module Riser
|
|
533
577
|
process_list << SocketProcess.new(pid, parent_io)
|
534
578
|
end
|
535
579
|
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
end
|
580
|
+
child_latch_file.close
|
581
|
+
parent_latch_file.flock(File::LOCK_EX) # wait to release flock(2) at child processes
|
582
|
+
parent_latch_file.close
|
540
583
|
|
541
584
|
setup unless @process_dispatcher
|
542
585
|
@process_dispatcher.thread_num = @process_num
|
@@ -576,21 +619,15 @@ module Riser
|
|
576
619
|
@process_dispatcher.postprocess(&NO_CALL)
|
577
620
|
|
578
621
|
@process_dispatcher.accept{
|
579
|
-
|
580
|
-
begin
|
581
|
-
server_socket.accept_nonblock
|
582
|
-
rescue IO::WaitReadable
|
583
|
-
nil # to avoid conflicting accept(2) at server restart overlap
|
584
|
-
end
|
585
|
-
end
|
622
|
+
server_socket.accept_timeout(@accept_polling_timeout_seconds)
|
586
623
|
}
|
587
624
|
@process_dispatcher.accept_return(&NO_CALL)
|
588
625
|
@process_dispatcher.dispatch{|socket|
|
589
626
|
process = process_list[Thread.current[:number]]
|
590
|
-
process.io.write(
|
627
|
+
process.io.write(SEND_CMD)
|
591
628
|
process.io.send_io(socket)
|
592
|
-
response = process.io.read(
|
593
|
-
response ==
|
629
|
+
response = process.io.read(RADY_LEN)
|
630
|
+
response == RADY_CMD or raise "internal error: unknown response <#{response.inspect}>"
|
594
631
|
}
|
595
632
|
@process_dispatcher.start
|
596
633
|
|
@@ -736,13 +773,7 @@ module Riser
|
|
736
773
|
@dispatcher.preprocess(&@preprocess)
|
737
774
|
@dispatcher.postprocess(&@postprocess)
|
738
775
|
@dispatcher.accept{
|
739
|
-
|
740
|
-
begin
|
741
|
-
server_socket.accept_nonblock
|
742
|
-
rescue IO::WaitReadable
|
743
|
-
nil # to avoid conflicting accept(2) at server restart overlap
|
744
|
-
end
|
745
|
-
end
|
776
|
+
server_socket.accept_timeout(@accept_polling_timeout_seconds)
|
746
777
|
}
|
747
778
|
@dispatcher.accept_return(&NO_CALL)
|
748
779
|
@dispatcher.dispatch(&@dispatch)
|
data/lib/riser/version.rb
CHANGED
data/lib/riser.rb
CHANGED
data/misc/run_curls.sh
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
sleep_seconds="${1:-1}"
|
4
|
+
num_curl="${2:-4}"
|
5
|
+
|
6
|
+
job_pid_list=''
|
7
|
+
|
8
|
+
run_curl() {
|
9
|
+
(
|
10
|
+
while true; do
|
11
|
+
curl --silent -- "$1"/ >/dev/null
|
12
|
+
done
|
13
|
+
) &
|
14
|
+
job_pid_list="${job_pid_list} $!"
|
15
|
+
echo "run curl $!"
|
16
|
+
}
|
17
|
+
|
18
|
+
cmd() {
|
19
|
+
echo "$*"
|
20
|
+
"$@"
|
21
|
+
}
|
22
|
+
|
23
|
+
echo "GET URL: ${GET_URL:=http://localhost:8080}"
|
24
|
+
|
25
|
+
for i in $(yes | head -"${num_curl}"); do
|
26
|
+
run_curl "${GET_URL}"
|
27
|
+
done
|
28
|
+
|
29
|
+
cmd sleep "${sleep_seconds}"
|
30
|
+
|
31
|
+
for pid in $job_pid_list; do
|
32
|
+
cmd kill "${pid}"
|
33
|
+
wait "${pid}"
|
34
|
+
done
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TOKI Yoshinori
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/riser/temppath.rb
|
105
105
|
- lib/riser/test.rb
|
106
106
|
- lib/riser/version.rb
|
107
|
+
- misc/run_curls.sh
|
107
108
|
- riser.gemspec
|
108
109
|
homepage: https://github.com/y10k/riser
|
109
110
|
licenses:
|