rainbows 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/GIT-VERSION-GEN +1 -1
  2. data/GNUmakefile +12 -6
  3. data/README +3 -2
  4. data/Rakefile +3 -3
  5. data/TODO +2 -9
  6. data/lib/rainbows.rb +1 -0
  7. data/lib/rainbows/app_pool.rb +10 -6
  8. data/lib/rainbows/base.rb +1 -1
  9. data/lib/rainbows/const.rb +1 -1
  10. data/lib/rainbows/ev_core.rb +88 -0
  11. data/lib/rainbows/event_machine.rb +218 -0
  12. data/lib/rainbows/http_server.rb +4 -1
  13. data/lib/rainbows/rev.rb +21 -89
  14. data/lib/rainbows/revactor.rb +4 -10
  15. data/local.mk.sample +13 -7
  16. data/rainbows.gemspec +17 -2
  17. data/t/.gitignore +1 -0
  18. data/t/GNUmakefile +63 -40
  19. data/t/README +6 -2
  20. data/t/async_sinatra.ru +13 -0
  21. data/t/bin/unused_listen +1 -1
  22. data/t/large-file-response.ru +1 -0
  23. data/t/my-tap-lib.sh +200 -0
  24. data/t/simple-http_Base.ru +3 -0
  25. data/t/simple-http_EventMachine.ru +9 -0
  26. data/t/simple-http_Rev.ru +9 -0
  27. data/t/simple-http_Revactor.ru +10 -0
  28. data/t/simple-http_ThreadPool.ru +10 -0
  29. data/t/simple-http_ThreadSpawn.ru +10 -0
  30. data/t/t0000-simple-http.sh +142 -0
  31. data/t/t0001-unix-http.sh +103 -0
  32. data/t/t0002-graceful.sh +32 -0
  33. data/t/t0002-parser-error.sh +31 -0
  34. data/t/t0003-reopen-logs.sh +97 -0
  35. data/t/t0005-large-file-response.sh +83 -0
  36. data/t/t0100-rack-input-hammer.sh +45 -0
  37. data/t/t0101-rack-input-trailer.sh +68 -0
  38. data/t/t0200-async-response.sh +66 -0
  39. data/t/t0201-async-response-no-autochunk.sh +3 -0
  40. data/t/t0300-async_sinatra.sh +65 -0
  41. data/t/t9000-rack-app-pool.sh +45 -33
  42. data/t/test-lib.sh +67 -56
  43. metadata +26 -56
  44. data/t/lib-async-response-no-autochunk.sh +0 -6
  45. data/t/lib-async-response.sh +0 -45
  46. data/t/lib-graceful.sh +0 -40
  47. data/t/lib-input-trailer.sh +0 -63
  48. data/t/lib-large-file-response.sh +0 -45
  49. data/t/lib-parser-error.sh +0 -29
  50. data/t/lib-rack-input-hammer.sh +0 -38
  51. data/t/lib-reopen-logs.sh +0 -60
  52. data/t/lib-simple-http.sh +0 -92
  53. data/t/t0000-basic.sh +0 -2
  54. data/t/t1000-thread-pool-basic.sh +0 -2
  55. data/t/t1002-thread-pool-graceful.sh +0 -2
  56. data/t/t1003-thread-pool-reopen-logs.sh +0 -2
  57. data/t/t1004-thread-pool-async-response.sh +0 -45
  58. data/t/t1005-thread-pool-large-file-response.sh +0 -45
  59. data/t/t1006-thread-pool-async-response-no-autochunk.sh +0 -6
  60. data/t/t1100-thread-pool-rack-input.sh +0 -2
  61. data/t/t1101-thread-pool-input-trailer.sh +0 -2
  62. data/t/t2000-thread-spawn-basic.sh +0 -2
  63. data/t/t2002-thread-spawn-graceful.sh +0 -2
  64. data/t/t2003-thread-spawn-reopen-logs.sh +0 -2
  65. data/t/t2004-thread-spawn-async-response.sh +0 -45
  66. data/t/t2005-thread-spawn-large-file-response.sh +0 -45
  67. data/t/t2006-thread-spawn-async-response-no-autochunk.sh +0 -6
  68. data/t/t2100-thread-spawn-rack-input.sh +0 -2
  69. data/t/t2101-thread-spawn-input-trailer.sh +0 -2
  70. data/t/t3000-revactor-basic.sh +0 -2
  71. data/t/t3002-revactor-graceful.sh +0 -2
  72. data/t/t3003-revactor-reopen-logs.sh +0 -2
  73. data/t/t3004-revactor-async-response.sh +0 -45
  74. data/t/t3005-revactor-large-file-response.sh +0 -2
  75. data/t/t3006-revactor-async-response-no-autochunk.sh +0 -6
  76. data/t/t3100-revactor-rack-input.sh +0 -2
  77. data/t/t3101-revactor-rack-input-trailer.sh +0 -2
  78. data/t/t4000-rev-basic.sh +0 -2
  79. data/t/t4002-rev-graceful.sh +0 -2
  80. data/t/t4003-rev-parser-error.sh +0 -2
  81. data/t/t4003-rev-reopen-logs.sh +0 -2
  82. data/t/t4004-rev-async-response.sh +0 -45
  83. data/t/t4005-rev-large-file-response.sh +0 -2
  84. data/t/t4006-rev-async-response-no-autochunk.sh +0 -6
  85. data/t/t4100-rev-rack-input.sh +0 -2
  86. data/t/t4101-rev-rack-input-trailer.sh +0 -2
@@ -1,63 +0,0 @@
1
- . ./test-lib.sh
2
- test -r random_blob || die "random_blob required, run with 'make $0'"
3
- echo "input trailer test model=$model"
4
-
5
- eval $(unused_listen)
6
- rtmpfiles unicorn_config tmp r_err r_out pid fifo ok
7
-
8
- cat > $unicorn_config <<EOF
9
- listen "$listen"
10
- pid "$pid"
11
- stderr_path "$r_err"
12
- stdout_path "$r_out"
13
- Rainbows! { use :$model }
14
- EOF
15
-
16
- rainbows -D content-md5.ru -c $unicorn_config
17
- wait_for_pid $pid
18
-
19
- echo "small blob"
20
- (
21
- echo hello world | content-md5-put
22
- cat $fifo > $tmp &
23
- wait
24
- echo ok > $ok
25
- ) | socat - TCP:$listen | utee $fifo
26
-
27
- fgrep 'HTTP/1.1 200 OK' $tmp
28
- test xok = x"$(cat $ok)"
29
- check_stderr
30
-
31
- echo "big blob"
32
- (
33
- content-md5-put < random_blob
34
- cat $fifo > $tmp &
35
- wait
36
- echo ok > $ok
37
- ) | socat - TCP:$listen | utee $fifo
38
-
39
- fgrep 'HTTP/1.1 200 OK' $tmp
40
- test xok = x"$(cat $ok)"
41
- check_stderr
42
-
43
- echo "staggered blob"
44
- (
45
- (
46
- dd bs=164 count=1 < random_blob
47
- sleep 2
48
- dd bs=4545 count=1 < random_blob
49
- sleep 2
50
- dd bs=1234 count=1 < random_blob
51
- echo ok > $ok
52
- ) 2>/dev/null | content-md5-put
53
- test xok = x"$(cat $ok)"
54
- cat $fifo > $tmp &
55
- wait
56
- echo ok > $ok
57
- ) | socat - TCP:$listen | utee $fifo
58
-
59
- fgrep 'HTTP/1.1 200 OK' $tmp
60
- test xok = x"$(cat $ok)"
61
- check_stderr
62
-
63
- kill $(cat $pid)
@@ -1,45 +0,0 @@
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
@@ -1,29 +0,0 @@
1
- . ./test-lib.sh
2
- echo "parser error test for model=$model"
3
-
4
- eval $(unused_listen)
5
- rtmpfiles unicorn_config pid r_err r_out tmp fifo ok
6
-
7
- cat > $unicorn_config <<EOF
8
- listen "$listen"
9
- pid "$pid"
10
- stderr_path "$r_err"
11
- stdout_path "$r_out"
12
- Rainbows! { use :$model }
13
- EOF
14
-
15
- rainbows -D env.ru -c $unicorn_config
16
- wait_for_pid $pid
17
-
18
- (
19
- printf 'GET / HTTP/1/1\r\nHost: example.com\r\n\r\n'
20
- cat $fifo > $tmp &
21
- wait
22
- echo ok > $ok
23
- ) | socat - TCP:$listen > $fifo
24
-
25
- kill $(cat $pid)
26
-
27
- dbgcat tmp
28
- grep -F 'HTTP/1.1 400 Bad Request' $tmp
29
- check_stderr
@@ -1,38 +0,0 @@
1
- nr_client=${nr_client-4}
2
- . ./test-lib.sh
3
- test -r random_blob || die "random_blob required, run with 'make $0'"
4
-
5
- eval $(unused_listen)
6
- rtmpfiles unicorn_config curl_out curl_err r_err r_out pid
7
-
8
- cat > $unicorn_config <<EOF
9
- listen "$listen"
10
- pid "$pid"
11
- stderr_path "$r_err"
12
- stdout_path "$r_out"
13
- Rainbows! do
14
- use :$model
15
- end
16
- EOF
17
-
18
- rainbows -D sha1.ru -c $unicorn_config
19
- wait_for_pid $pid
20
-
21
- start=$(date +%s)
22
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
23
- do
24
- (
25
- curl -sSf -T- http://$listen/$i \
26
- < random_blob >> $curl_out 2>> $curl_err
27
- ) &
28
- done
29
- wait
30
- echo elapsed=$(( $(date +%s) - $start ))
31
-
32
- kill $(cat $pid)
33
- test $nr_client -eq $(wc -l < $curl_out)
34
- test 1 -eq $(sort < $curl_out | uniq | wc -l)
35
- blob_sha1=$( expr "$(sha1sum < random_blob)" : '\([a-f0-9]\+\)')
36
- echo blob_sha1=$blob_sha1
37
- test x"$blob_sha1" = x"$(sort < $curl_out | uniq)"
38
- check_stderr
data/t/lib-reopen-logs.sh DELETED
@@ -1,60 +0,0 @@
1
- #!/bin/sh
2
- # don't set nr_client for Rev, only _one_ app running at once :x
3
- nr_client=${nr_client-2}
4
- . ./test-lib.sh
5
-
6
- eval $(unused_listen)
7
- rtmpfiles unicorn_config curl_out curl_err pid r_err r_out r_rot
8
-
9
-
10
- cat > $unicorn_config <<EOF
11
- listen "$listen"
12
- pid "$pid"
13
- stderr_path "$r_err"
14
- stdout_path "$r_out"
15
- Rainbows! { use :$model }
16
- EOF
17
-
18
- rainbows -D sleep.ru -c $unicorn_config
19
- wait_for_pid $pid
20
-
21
- start=$(date +%s)
22
- for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
23
- do
24
- ( curl -sSf http://$listen/2 >> $curl_out 2>> $curl_err ) &
25
- done
26
- check_stderr
27
-
28
- rm -f $r_rot
29
- mv $r_err $r_rot
30
-
31
- kill -USR1 $(cat $pid)
32
- wait_for_pid $r_err
33
-
34
- dbgcat r_rot
35
- dbgcat r_err
36
-
37
- wait
38
- echo elapsed=$(( $(date +%s) - $start ))
39
- test ! -s $curl_err
40
- test x"$(wc -l < $curl_out)" = x$nr_client
41
- nr=$(sort < $curl_out | uniq | wc -l)
42
-
43
- test "$nr" -eq 1
44
- test x$(sort < $curl_out | uniq) = xHello
45
- check_stderr
46
- check_stderr $r_rot
47
-
48
- before_rot=$(wc -c < $r_rot)
49
- before_err=$(wc -c < $r_err)
50
- curl -sSfv http://$listen/
51
- after_rot=$(wc -c < $r_rot)
52
- after_err=$(wc -c < $r_err)
53
-
54
- test $after_rot -eq $before_rot && echo "before_rot -eq after_rot"
55
- test $after_err -gt $before_err && echo "before_err -gt after_err"
56
-
57
- kill $(cat $pid)
58
- dbgcat r_err
59
- check_stderr
60
- check_stderr $r_rot
data/t/lib-simple-http.sh DELETED
@@ -1,92 +0,0 @@
1
- #!/bin/sh
2
- . ./test-lib.sh
3
-
4
- echo "simple HTTP connection keepalive/pipelining tests for $model"
5
-
6
- tbase=$(expr "$T" : '^\(t....\)-').ru
7
- test -f "$tbase" || die "$tbase missing for $T"
8
-
9
- eval $(unused_listen)
10
- rtmpfiles unicorn_config pid r_err r_out tmp fifo ok
11
-
12
- cat > $unicorn_config <<EOF
13
- listen "$listen"
14
- pid "$pid"
15
- stderr_path "$r_err"
16
- stdout_path "$r_out"
17
- EOF
18
- if test x$model != xany
19
- then
20
- echo "Rainbows! { use :$model }" >> $unicorn_config
21
- fi
22
-
23
- rainbows -D $tbase -c $unicorn_config
24
- wait_for_pid $pid
25
-
26
- echo "single request"
27
- curl -sSfv http://$listen/
28
- dbgcat r_err
29
-
30
- echo "two requests with keepalive"
31
- curl -sSfv http://$listen/a http://$listen/b > $tmp 2>&1
32
- dbgcat r_err
33
- dbgcat tmp
34
- grep 'Re-using existing connection' < $tmp
35
-
36
- echo "pipelining partial requests"
37
- req='GET / HTTP/1.1\r\nHost: example.com\r\n'
38
- (
39
- printf "$req"'\r\n'"$req"
40
- cat $fifo > $tmp &
41
- sleep 1
42
- printf 'Connection: close\r\n\r\n'
43
- wait
44
- echo ok > $ok
45
- ) | socat - TCP:$listen > $fifo
46
-
47
- dbgcat tmp
48
-
49
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
50
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
51
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
52
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
53
- test x"$(cat $ok)" = xok
54
- check_stderr
55
-
56
-
57
- echo "burst pipelining"
58
- req='GET / HTTP/1.1\r\nHost: example.com\r\n'
59
- (
60
- printf "$req"'\r\n'"$req"'Connection: close\r\n\r\n'
61
- cat $fifo > $tmp &
62
- wait
63
- echo ok > $ok
64
- ) | socat - TCP:$listen > $fifo
65
-
66
- dbgcat tmp
67
- dbgcat r_err
68
-
69
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
70
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
71
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
72
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
73
- test x"$(cat $ok)" = xok
74
-
75
- check_stderr
76
-
77
- echo "HTTP/0.9 request should not return headers"
78
- (
79
- printf 'GET /\r\n\r\n'
80
- cat $fifo > $tmp &
81
- wait
82
- echo ok > $ok
83
- ) | socat - TCP:$listen > $fifo
84
-
85
- dbgcat tmp
86
- dbgcat r_err
87
- echo "env.inspect should've put everything on one line"
88
- test 1 -eq $(wc -l < $tmp)
89
- ! grep ^Connection: $tmp
90
- ! grep ^HTTP/ $tmp
91
-
92
- kill $(cat $pid)
data/t/t0000-basic.sh DELETED
@@ -1,2 +0,0 @@
1
- #!/bin/sh
2
- . ./lib-simple-http.sh
@@ -1,2 +0,0 @@
1
- #!/bin/sh
2
- . ./lib-simple-http.sh
@@ -1,2 +0,0 @@
1
- #!/bin/sh
2
- . ./lib-graceful.sh
@@ -1,2 +0,0 @@
1
- #!/bin/sh
2
- . ./lib-reopen-logs.sh
@@ -1,45 +0,0 @@
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
@@ -1,45 +0,0 @@
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
@@ -1,6 +0,0 @@
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