rainbows 0.2.0 → 0.3.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.
Files changed (71) hide show
  1. data/GIT-VERSION-GEN +1 -1
  2. data/TODO +15 -0
  3. data/TUNING +14 -0
  4. data/lib/rainbows.rb +7 -0
  5. data/lib/rainbows/app_pool.rb +4 -3
  6. data/lib/rainbows/base.rb +17 -11
  7. data/lib/rainbows/const.rb +5 -1
  8. data/lib/rainbows/dev_fd_response.rb +69 -0
  9. data/lib/rainbows/http_response.rb +1 -0
  10. data/lib/rainbows/http_server.rb +2 -0
  11. data/lib/rainbows/rev.rb +136 -43
  12. data/lib/rainbows/revactor.rb +6 -14
  13. data/lib/rainbows/thread_pool.rb +11 -13
  14. data/lib/rainbows/thread_spawn.rb +4 -4
  15. data/local.mk.sample +9 -1
  16. data/t/GNUmakefile +4 -4
  17. data/t/README +1 -1
  18. data/t/async-response-no-autochunk.ru +24 -0
  19. data/t/async-response.ru +13 -0
  20. data/t/bin/content-md5-put +1 -1
  21. data/t/bin/utee +12 -0
  22. data/t/env.ru +3 -0
  23. data/t/large-file-response.ru +13 -0
  24. data/t/lib-async-response-no-autochunk.sh +6 -0
  25. data/t/lib-async-response.sh +45 -0
  26. data/t/lib-graceful.sh +40 -0
  27. data/t/lib-input-trailer.sh +63 -0
  28. data/t/lib-large-file-response.sh +45 -0
  29. data/t/lib-parser-error.sh +29 -0
  30. data/t/{t3100-revactor-tee-input.sh → lib-rack-input-hammer.sh} +3 -9
  31. data/t/lib-reopen-logs.sh +60 -0
  32. data/t/lib-simple-http.sh +92 -0
  33. data/t/sleep.ru +13 -6
  34. data/t/t0000-basic.sh +1 -36
  35. data/t/t1000-thread-pool-basic.sh +1 -41
  36. data/t/t1002-thread-pool-graceful.sh +1 -36
  37. data/t/t1003-thread-pool-reopen-logs.sh +2 -0
  38. data/t/t1004-thread-pool-async-response.sh +45 -0
  39. data/t/t1005-thread-pool-large-file-response.sh +45 -0
  40. data/t/t1006-thread-pool-async-response-no-autochunk.sh +6 -0
  41. data/t/t1100-thread-pool-rack-input.sh +2 -0
  42. data/t/t1101-thread-pool-input-trailer.sh +2 -0
  43. data/t/t2000-thread-spawn-basic.sh +1 -37
  44. data/t/t2002-thread-spawn-graceful.sh +1 -36
  45. data/t/t2003-thread-spawn-reopen-logs.sh +2 -0
  46. data/t/t2004-thread-spawn-async-response.sh +45 -0
  47. data/t/t2005-thread-spawn-large-file-response.sh +45 -0
  48. data/t/t2006-thread-spawn-async-response-no-autochunk.sh +6 -0
  49. data/t/t2100-thread-spawn-rack-input.sh +2 -0
  50. data/t/t2101-thread-spawn-input-trailer.sh +2 -0
  51. data/t/t3000-revactor-basic.sh +1 -39
  52. data/t/t3002-revactor-graceful.sh +1 -37
  53. data/t/t3003-revactor-reopen-logs.sh +1 -53
  54. data/t/t3004-revactor-async-response.sh +45 -0
  55. data/t/t3005-revactor-large-file-response.sh +2 -0
  56. data/t/t3006-revactor-async-response-no-autochunk.sh +6 -0
  57. data/t/t3100-revactor-rack-input.sh +2 -0
  58. data/t/t3101-revactor-rack-input-trailer.sh +2 -0
  59. data/t/t4000-rev-basic.sh +1 -50
  60. data/t/t4002-rev-graceful.sh +1 -51
  61. data/t/t4003-rev-parser-error.sh +1 -33
  62. data/t/t4003-rev-reopen-logs.sh +2 -0
  63. data/t/t4004-rev-async-response.sh +45 -0
  64. data/t/t4005-rev-large-file-response.sh +2 -0
  65. data/t/t4006-rev-async-response-no-autochunk.sh +6 -0
  66. data/t/t4100-rev-rack-input.sh +1 -43
  67. data/t/t4101-rev-rack-input-trailer.sh +1 -50
  68. data/t/t9000-rack-app-pool.sh +2 -3
  69. data/t/test-lib.sh +80 -18
  70. metadata +39 -4
  71. data/t/t3001-revactor-pipeline.sh +0 -46
@@ -0,0 +1,45 @@
1
+ . ./test-lib.sh
2
+ test -r random_blob || die "random_blob required, run with 'make $0'"
3
+ if ! grep -v ^VmRSS: /proc/self/status >/dev/null 2>&1
4
+ then
5
+ echo >&2 "skipping, can't read RSS from /proc/self/status"
6
+ exit 0
7
+ fi
8
+ echo "large file response slurp avoidance for model=$model"
9
+ eval $(unused_listen)
10
+ rtmpfiles unicorn_config tmp r_err r_out pid ok
11
+
12
+ cat > $unicorn_config <<EOF
13
+ listen "$listen"
14
+ stderr_path "$r_err"
15
+ stdout_path "$r_out"
16
+ pid "$pid"
17
+ Rainbows! { use :$model }
18
+ EOF
19
+
20
+ # can't load Rack::Lint here since it'll cause Rev to slurp
21
+ rainbows -E none -D large-file-response.ru -c $unicorn_config
22
+ wait_for_pid $pid
23
+
24
+ random_blob_size=$(wc -c < random_blob)
25
+ curl -v http://$listen/rss
26
+ dbgcat r_err
27
+ rss_before=$(curl -sSfv http://$listen/rss)
28
+ echo "rss_before=$rss_before"
29
+
30
+ for i in a b c
31
+ do
32
+ size=$( (curl -sSfv http://$listen/random_blob && echo ok > $ok) | wc -c)
33
+ test $size -eq $random_blob_size
34
+ test xok = x$(cat $ok)
35
+ done
36
+
37
+ dbgcat r_err
38
+ curl -v http://$listen/rss
39
+ rss_after=$(curl -sSfv http://$listen/rss)
40
+ echo "rss_after=$rss_after"
41
+ diff=$(( $rss_after - $rss_before ))
42
+ echo "test diff=$diff < orig=$random_blob_size"
43
+ kill -QUIT $(cat $pid)
44
+ test $diff -le $random_blob_size
45
+ dbgcat r_err
@@ -0,0 +1,6 @@
1
+ #!/bin/sh
2
+ CONFIG_RU=async-response-no-autochunk.ru
3
+ . ./lib-async-response.sh
4
+ test x"$(cat $a)" = x0123456789
5
+ test x"$(cat $b)" = x0123456789
6
+ test x"$(cat $c)" = x0123456789
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-rack-input-hammer.sh
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-input-trailer.sh
@@ -1,38 +1,2 @@
1
1
  #!/bin/sh
2
- . ./test-lib.sh
3
-
4
- eval $(unused_listen)
5
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out
6
-
7
- nr_client=30
8
- nr_thread=10
9
-
10
- cat > $unicorn_config <<EOF
11
- stderr_path "$r_err"
12
- stdout_path "$r_out"
13
- listen "$listen"
14
- pid "$pid"
15
- Rainbows! do
16
- use :ThreadSpawn
17
- worker_connections $nr_thread
18
- end
19
- EOF
20
-
21
- rainbows -D t2000.ru -c $unicorn_config
22
- wait_for_pid $pid
23
-
24
- start=$(date +%s)
25
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
26
- do
27
- ( curl -sSf http://$listen/$i >> $curl_out 2>> $curl_err ) &
28
- done
29
- wait
30
- echo elapsed=$(( $(date +%s) - $start ))
31
-
32
- kill $(cat $pid)
33
-
34
- ! test -s $curl_err
35
- test x"$(wc -l < $curl_out)" = x$nr_client
36
- nr=$(sort < $curl_out | uniq | wc -l)
37
- test "$nr" -eq $nr_client
38
- ! grep Error $r_err
2
+ . ./lib-simple-http.sh
@@ -1,37 +1,2 @@
1
1
  #!/bin/sh
2
- . ./test-lib.sh
3
-
4
- eval $(unused_listen)
5
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out
6
- nr_thread=10
7
- nr_client=10
8
- cat > $unicorn_config <<EOF
9
- listen "$listen"
10
- stderr_path "$r_err"
11
- stdout_path "$r_out"
12
- pid "$pid"
13
- Rainbows! do
14
- use :ThreadSpawn
15
- worker_connections $nr_thread
16
- end
17
- EOF
18
-
19
- rainbows -D sleep.ru -c $unicorn_config
20
- wait_for_pid $pid
21
-
22
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
23
- do
24
- curl -sSf http://$listen/5 >> $curl_out 2>> $curl_err &
25
- done
26
- sleep 2
27
- kill -QUIT $(cat $pid)
28
- wait
29
-
30
- dbgcat r_err
31
- ! test -s $curl_err
32
- test x"$(wc -l < $curl_out)" = x$nr_client
33
- nr=$(sort < $curl_out | uniq | wc -l)
34
-
35
- test "$nr" -eq 1
36
- test x$(sort < $curl_out | uniq) = xHello
37
- ! grep Error $r_err
2
+ . ./lib-graceful.sh
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-reopen-logs.sh
@@ -0,0 +1,45 @@
1
+ CONFIG_RU=${CONFIG_RU-'async-response.ru'}
2
+ . ./test-lib.sh
3
+ echo "async response for model=$model"
4
+ eval $(unused_listen)
5
+ rtmpfiles unicorn_config a b c r_err r_out pid curl_err
6
+
7
+ cat > $unicorn_config <<EOF
8
+ listen "$listen"
9
+ stderr_path "$r_err"
10
+ stdout_path "$r_out"
11
+ pid "$pid"
12
+ Rainbows! { use :$model }
13
+ EOF
14
+
15
+ # can't load Rack::Lint here since it'll cause Rev to slurp
16
+ rainbows -E none -D $CONFIG_RU -c $unicorn_config
17
+ wait_for_pid $pid
18
+
19
+ t0=$(date +%s)
20
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $a) &
21
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $b) &
22
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $c) &
23
+ wait
24
+ t1=$(date +%s)
25
+
26
+ rainbows_pid=$(cat $pid)
27
+ kill -QUIT $rainbows_pid
28
+ elapsed=$(( $t1 - $t0 ))
29
+ echo "elapsed=$elapsed < 30"
30
+ test $elapsed -lt 30
31
+
32
+ dbgcat a
33
+ dbgcat b
34
+ dbgcat c
35
+ dbgcat r_err
36
+ dbgcat curl_err
37
+ test ! -s $curl_err
38
+ check_stderr
39
+
40
+ while kill -0 $rainbows_pid >/dev/null 2>&1
41
+ do
42
+ sleep 1
43
+ done
44
+
45
+ dbgcat r_err
@@ -0,0 +1,45 @@
1
+ . ./test-lib.sh
2
+ test -r random_blob || die "random_blob required, run with 'make $0'"
3
+ if ! grep -v ^VmRSS: /proc/self/status >/dev/null 2>&1
4
+ then
5
+ echo >&2 "skipping, can't read RSS from /proc/self/status"
6
+ exit 0
7
+ fi
8
+ echo "large file response slurp avoidance for model=$model"
9
+ eval $(unused_listen)
10
+ rtmpfiles unicorn_config tmp r_err r_out pid ok
11
+
12
+ cat > $unicorn_config <<EOF
13
+ listen "$listen"
14
+ stderr_path "$r_err"
15
+ stdout_path "$r_out"
16
+ pid "$pid"
17
+ Rainbows! { use :$model }
18
+ EOF
19
+
20
+ # can't load Rack::Lint here since it'll cause Rev to slurp
21
+ rainbows -E none -D large-file-response.ru -c $unicorn_config
22
+ wait_for_pid $pid
23
+
24
+ random_blob_size=$(wc -c < random_blob)
25
+ curl -v http://$listen/rss
26
+ dbgcat r_err
27
+ rss_before=$(curl -sSfv http://$listen/rss)
28
+ echo "rss_before=$rss_before"
29
+
30
+ for i in a b c
31
+ do
32
+ size=$( (curl -sSfv http://$listen/random_blob && echo ok > $ok) | wc -c)
33
+ test $size -eq $random_blob_size
34
+ test xok = x$(cat $ok)
35
+ done
36
+
37
+ dbgcat r_err
38
+ curl -v http://$listen/rss
39
+ rss_after=$(curl -sSfv http://$listen/rss)
40
+ echo "rss_after=$rss_after"
41
+ diff=$(( $rss_after - $rss_before ))
42
+ echo "test diff=$diff < orig=$random_blob_size"
43
+ kill -QUIT $(cat $pid)
44
+ test $diff -le $random_blob_size
45
+ dbgcat r_err
@@ -0,0 +1,6 @@
1
+ #!/bin/sh
2
+ CONFIG_RU=async-response-no-autochunk.ru
3
+ . ./lib-async-response.sh
4
+ test x"$(cat $a)" = x0123456789
5
+ test x"$(cat $b)" = x0123456789
6
+ test x"$(cat $c)" = x0123456789
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-rack-input-hammer.sh
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-input-trailer.sh
@@ -1,40 +1,2 @@
1
1
  #!/bin/sh
2
- . ./test-lib.sh
3
- require_revactor
4
-
5
- eval $(unused_listen)
6
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out
7
-
8
- nr_client=30
9
- nr_actor=10
10
-
11
- cat > $unicorn_config <<EOF
12
- listen "$listen"
13
- pid "$pid"
14
- stderr_path "$r_err"
15
- stdout_path "$r_out"
16
- Rainbows! do
17
- use :Revactor
18
- worker_connections $nr_actor
19
- end
20
- EOF
21
-
22
- rainbows -D t3000.ru -c $unicorn_config
23
- wait_for_pid $pid
24
-
25
- start=$(date +%s)
26
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
27
- do
28
- ( curl -sSf http://$listen/$i >> $curl_out 2>> $curl_err ) &
29
- done
30
- wait
31
- echo elapsed=$(( $(date +%s) - $start ))
32
-
33
- kill $(cat $pid)
34
-
35
- ! test -s $curl_err
36
- test x"$(wc -l < $curl_out)" = x$nr_client
37
- nr=$(sort < $curl_out | uniq | wc -l)
38
-
39
- test "$nr" -eq 1
40
- ! grep Error $r_err
2
+ . ./lib-simple-http.sh
@@ -1,38 +1,2 @@
1
1
  #!/bin/sh
2
- . ./test-lib.sh
3
- require_revactor
4
-
5
- eval $(unused_listen)
6
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out
7
- nr_actor=10
8
- nr_client=10
9
- cat > $unicorn_config <<EOF
10
- listen "$listen"
11
- stderr_path "$r_err"
12
- stdout_path "$r_out"
13
- pid "$pid"
14
- Rainbows! do
15
- use :Revactor
16
- worker_connections $nr_actor
17
- end
18
- EOF
19
-
20
- SLEEP_CLASS=Actor rainbows -D sleep.ru -c $unicorn_config
21
- wait_for_pid $pid
22
-
23
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
24
- do
25
- curl -sSf http://$listen/5 >> $curl_out 2>> $curl_err &
26
- done
27
- sleep 2
28
- kill -QUIT $(cat $pid)
29
- wait
30
-
31
- dbgcat r_err
32
- ! test -s $curl_err
33
- test x"$(wc -l < $curl_out)" = x$nr_client
34
- nr=$(sort < $curl_out | uniq | wc -l)
35
-
36
- test "$nr" -eq 1
37
- test x$(sort < $curl_out | uniq) = xHello
38
- ! grep Error $r_err
2
+ . ./lib-graceful.sh
@@ -1,54 +1,2 @@
1
1
  #!/bin/sh
2
- . ./test-lib.sh
3
- require_revactor
4
-
5
- eval $(unused_listen)
6
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out r_rot
7
-
8
- nr_client=30
9
- nr_actor=10
10
-
11
- cat > $unicorn_config <<EOF
12
- listen "$listen"
13
- pid "$pid"
14
- stderr_path "$r_err"
15
- stdout_path "$r_out"
16
- Rainbows! do
17
- use :Revactor
18
- worker_connections $nr_actor
19
- end
20
- EOF
21
-
22
- SLEEP_CLASS=Actor rainbows -D sleep.ru -c $unicorn_config
23
- wait_for_pid $pid
24
-
25
- start=$(date +%s)
26
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
27
- do
28
- ( curl -sSf http://$listen/2 >> $curl_out 2>> $curl_err ) &
29
- done
30
- ! grep Error $r_err
31
-
32
- rm $r_rot
33
- mv $r_err $r_rot
34
-
35
- kill -USR1 $(cat $pid)
36
- wait_for_pid $r_err
37
-
38
- dbgcat r_rot
39
- dbgcat r_err
40
-
41
- wait
42
- echo elapsed=$(( $(date +%s) - $start ))
43
- ! test -s $curl_err
44
- test x"$(wc -l < $curl_out)" = x$nr_client
45
- nr=$(sort < $curl_out | uniq | wc -l)
46
-
47
- test "$nr" -eq 1
48
- test x$(sort < $curl_out | uniq) = xHello
49
- ! grep Error $r_err
50
- ! grep Error $r_rot
51
-
52
- kill $(cat $pid)
53
- dbgcat r_err
54
- ! grep Error $r_err
2
+ . ./lib-reopen-logs.sh
@@ -0,0 +1,45 @@
1
+ CONFIG_RU=${CONFIG_RU-'async-response.ru'}
2
+ . ./test-lib.sh
3
+ echo "async response for model=$model"
4
+ eval $(unused_listen)
5
+ rtmpfiles unicorn_config a b c r_err r_out pid curl_err
6
+
7
+ cat > $unicorn_config <<EOF
8
+ listen "$listen"
9
+ stderr_path "$r_err"
10
+ stdout_path "$r_out"
11
+ pid "$pid"
12
+ Rainbows! { use :$model }
13
+ EOF
14
+
15
+ # can't load Rack::Lint here since it'll cause Rev to slurp
16
+ rainbows -E none -D $CONFIG_RU -c $unicorn_config
17
+ wait_for_pid $pid
18
+
19
+ t0=$(date +%s)
20
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $a) &
21
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $b) &
22
+ ( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $c) &
23
+ wait
24
+ t1=$(date +%s)
25
+
26
+ rainbows_pid=$(cat $pid)
27
+ kill -QUIT $rainbows_pid
28
+ elapsed=$(( $t1 - $t0 ))
29
+ echo "elapsed=$elapsed < 30"
30
+ test $elapsed -lt 30
31
+
32
+ dbgcat a
33
+ dbgcat b
34
+ dbgcat c
35
+ dbgcat r_err
36
+ dbgcat curl_err
37
+ test ! -s $curl_err
38
+ check_stderr
39
+
40
+ while kill -0 $rainbows_pid >/dev/null 2>&1
41
+ do
42
+ sleep 1
43
+ done
44
+
45
+ dbgcat r_err
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ . ./lib-large-file-response.sh