unicorn 0.991.0.4.g0cb0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTORS +5 -2
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +3 -2
- data/lib/unicorn/app/exec_cgi.rb +2 -1
- data/lib/unicorn/const.rb +2 -2
- data/lib/unicorn/tee_input.rb +6 -0
- data/lib/unicorn/util.rb +0 -1
- data/local.mk.sample +12 -2
- data/t/t0006-reopen-logs.sh +83 -0
- data/t/t0006.ru +13 -0
- data/t/t0007-working_directory_no_embed_cli.sh +44 -0
- data/t/t0303-rails3-alt-working_directory_config.ru.sh +7 -4
- data/t/t0304-rails3-alt-working_directory_no_embed_cli.sh +52 -0
- data/test/exec/test_exec.rb +1 -5
- data/test/unit/test_signals.rb +1 -1
- data/test/unit/test_socket_helper.rb +3 -3
- metadata +13 -13
data/CONTRIBUTORS
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
Unicorn developers:
|
2
|
-
* Eric Wong
|
1
|
+
Unicorn developers (let us know if we forgot you):
|
2
|
+
* Eric Wong (BDFL, BOFH)
|
3
3
|
* Suraj N. Kurapati
|
4
4
|
* Andrey Stikheev
|
5
5
|
* Wayne Larsen
|
6
|
+
* Iñaki Baz Castillo
|
7
|
+
* Augusto Becciu
|
8
|
+
* Hongli Lai
|
6
9
|
* ... (help wanted)
|
7
10
|
|
8
11
|
We would like to thank following folks for helping make Unicorn possible:
|
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -8,6 +8,7 @@ MRI = ruby
|
|
8
8
|
RUBY = ruby
|
9
9
|
RAKE = rake
|
10
10
|
RAGEL = ragel
|
11
|
+
RSYNC = rsync
|
11
12
|
|
12
13
|
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
13
14
|
@./GIT-VERSION-GEN
|
@@ -168,7 +169,7 @@ NEWS: GIT-VERSION-FILE .manifest
|
|
168
169
|
$(RAKE) -s news_rdoc > $@+
|
169
170
|
mv $@+ $@
|
170
171
|
|
171
|
-
SINCE = 0.
|
172
|
+
SINCE = 0.991.0
|
172
173
|
ChangeLog: LOG_VERSION = \
|
173
174
|
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
174
175
|
echo $(GIT_VERSION) || git describe)
|
@@ -221,7 +222,7 @@ publish_doc:
|
|
221
222
|
$(MAKE) doc_gz
|
222
223
|
tar cf - $$(git ls-files examples/) | (cd doc && tar xf -)
|
223
224
|
chmod 644 $$(find doc -type f)
|
224
|
-
|
225
|
+
$(RSYNC) -av doc/ unicorn.bogomips.org:/srv/unicorn/
|
225
226
|
git ls-files | xargs touch
|
226
227
|
|
227
228
|
# Create gzip variants of the same timestamp as the original so nginx
|
data/lib/unicorn/app/exec_cgi.rb
CHANGED
@@ -120,7 +120,8 @@ module Unicorn::App
|
|
120
120
|
# ensures rack.input is a file handle that we can redirect stdin to
|
121
121
|
def force_file_input(env)
|
122
122
|
inp = env['rack.input']
|
123
|
-
|
123
|
+
# inp could be a StringIO or StringIO-like object
|
124
|
+
if inp.respond_to?(:size) && inp.size == 0
|
124
125
|
::File.open('/dev/null', 'rb')
|
125
126
|
else
|
126
127
|
tmp = Unicorn::Util.tmpio
|
data/lib/unicorn/const.rb
CHANGED
@@ -8,8 +8,8 @@ module Unicorn
|
|
8
8
|
# Symbols did not really improve things much compared to constants.
|
9
9
|
module Const
|
10
10
|
|
11
|
-
# The current version of Unicorn, currently 0.
|
12
|
-
UNICORN_VERSION="0.
|
11
|
+
# The current version of Unicorn, currently 1.0.0
|
12
|
+
UNICORN_VERSION="1.0.0"
|
13
13
|
|
14
14
|
DEFAULT_HOST = "0.0.0.0" # default TCP listen host address
|
15
15
|
DEFAULT_PORT = 8080 # default TCP listen port
|
data/lib/unicorn/tee_input.rb
CHANGED
@@ -39,6 +39,12 @@ module Unicorn
|
|
39
39
|
# For Transfer-Encoding:chunked requests, this requires consuming
|
40
40
|
# all of the input stream before returning since there's no other
|
41
41
|
# way to determine the size of the request body beforehand.
|
42
|
+
#
|
43
|
+
# This method is no longer part of the Rack specification as of
|
44
|
+
# Rack 1.2, so its use is not recommended. This method only exists
|
45
|
+
# for compatibility with Rack applications designed for Rack 1.1 and
|
46
|
+
# earlier. Most applications should only need to call +read+ with a
|
47
|
+
# specified +length+ in a loop until it returns +nil+.
|
42
48
|
def size
|
43
49
|
len and return len
|
44
50
|
|
data/lib/unicorn/util.rb
CHANGED
data/local.mk.sample
CHANGED
@@ -9,10 +9,18 @@ DLEXT := so
|
|
9
9
|
# Avoid loading rubygems to speed up tests because gmake is
|
10
10
|
# fork+exec heavy with Ruby.
|
11
11
|
prefix = $(HOME)
|
12
|
+
|
13
|
+
# XXX clean this up
|
12
14
|
ifeq ($(r192),)
|
13
15
|
ifeq ($(r19),)
|
14
16
|
ifeq ($(rbx),)
|
15
|
-
|
17
|
+
ifeq ($(r186),)
|
18
|
+
RUBY := $(prefix)/bin/ruby
|
19
|
+
else
|
20
|
+
prefix := $(prefix)/r186-p114
|
21
|
+
export PATH := $(prefix)/bin:$(PATH)
|
22
|
+
RUBY := $(prefix)/bin/ruby
|
23
|
+
endif
|
16
24
|
else
|
17
25
|
prefix := $(prefix)/rbx
|
18
26
|
export PATH := $(prefix)/bin:$(PATH)
|
@@ -42,7 +50,7 @@ endif
|
|
42
50
|
# SHELL := /bin/bash -e -o pipefail
|
43
51
|
SHELL := /bin/ksh93 -e -o pipefail
|
44
52
|
|
45
|
-
full-test: test-18 test-191 test-192 test-rbx
|
53
|
+
full-test: test-18 test-191 test-192 test-rbx test-186
|
46
54
|
|
47
55
|
# FIXME: keep eye on Rubinius activity and wait for fixes from upstream
|
48
56
|
# so we don't need RBX_SKIP anymore
|
@@ -50,6 +58,8 @@ test-rbx: export RBX_SKIP := 1
|
|
50
58
|
test-rbx: export RUBY := $(RUBY)
|
51
59
|
test-rbx:
|
52
60
|
$(MAKE) test test-integration rbx=T 2>&1 |sed -e 's!^!rbx !'
|
61
|
+
test-186:
|
62
|
+
$(MAKE) test-all r186=1 2>&1 |sed 's!^!1.8.6 !'
|
53
63
|
test-18:
|
54
64
|
$(MAKE) test-all 2>&1 |sed 's!^!1.8 !'
|
55
65
|
test-191:
|
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
|
4
|
+
t_plan 15 "reopen rotated logs"
|
5
|
+
|
6
|
+
t_begin "setup and startup" && {
|
7
|
+
rtmpfiles curl_out curl_err r_rot
|
8
|
+
unicorn_setup
|
9
|
+
unicorn -D t0006.ru -c $unicorn_config
|
10
|
+
unicorn_wait_start
|
11
|
+
}
|
12
|
+
|
13
|
+
t_begin "ensure server is responsive" && {
|
14
|
+
test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err)
|
15
|
+
}
|
16
|
+
|
17
|
+
t_begin "ensure stderr log is clean" && check_stderr
|
18
|
+
|
19
|
+
t_begin "external log rotation" && {
|
20
|
+
rm -f $r_rot
|
21
|
+
mv $r_err $r_rot
|
22
|
+
}
|
23
|
+
|
24
|
+
t_begin "send reopen log signal (USR1)" && {
|
25
|
+
kill -USR1 $unicorn_pid
|
26
|
+
}
|
27
|
+
|
28
|
+
t_begin "wait for rotated log to reappear" && {
|
29
|
+
nr=60
|
30
|
+
while ! test -f $r_err && test $nr -ge 0
|
31
|
+
do
|
32
|
+
sleep 1
|
33
|
+
nr=$(( $nr - 1 ))
|
34
|
+
done
|
35
|
+
}
|
36
|
+
|
37
|
+
t_begin "ensure server is still responsive" && {
|
38
|
+
test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err)
|
39
|
+
}
|
40
|
+
|
41
|
+
t_begin "wait for worker to reopen logs" && {
|
42
|
+
nr=60
|
43
|
+
re="worker=.* done reopening logs"
|
44
|
+
while ! grep "$re" < $r_err >/dev/null && test $nr -ge 0
|
45
|
+
do
|
46
|
+
sleep 1
|
47
|
+
nr=$(( $nr - 1 ))
|
48
|
+
done
|
49
|
+
}
|
50
|
+
|
51
|
+
dbgcat r_rot
|
52
|
+
dbgcat r_err
|
53
|
+
|
54
|
+
t_begin "ensure no errors from curl" && {
|
55
|
+
test ! -s $curl_err
|
56
|
+
}
|
57
|
+
|
58
|
+
t_begin "current server stderr is clean" && check_stderr
|
59
|
+
|
60
|
+
t_begin "rotated stderr is clean" && {
|
61
|
+
check_stderr $r_rot
|
62
|
+
}
|
63
|
+
|
64
|
+
t_begin "server is now writing logs to new stderr" && {
|
65
|
+
before_rot=$(wc -c < $r_rot)
|
66
|
+
before_err=$(wc -c < $r_err)
|
67
|
+
test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err)
|
68
|
+
after_rot=$(wc -c < $r_rot)
|
69
|
+
after_err=$(wc -c < $r_err)
|
70
|
+
test $after_rot -eq $before_rot
|
71
|
+
test $after_err -gt $before_err
|
72
|
+
}
|
73
|
+
|
74
|
+
t_begin "stop server" && {
|
75
|
+
kill $unicorn_pid
|
76
|
+
}
|
77
|
+
|
78
|
+
dbgcat r_err
|
79
|
+
|
80
|
+
t_begin "current server stderr is clean" && check_stderr
|
81
|
+
t_begin "rotated stderr is clean" && check_stderr $r_rot
|
82
|
+
|
83
|
+
t_done
|
data/t/t0006.ru
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
use Rack::ContentLength
|
2
|
+
use Rack::ContentType, "text/plain"
|
3
|
+
run lambda { |env|
|
4
|
+
|
5
|
+
# our File objects for stderr/stdout should always have #path
|
6
|
+
# and be sync=true
|
7
|
+
ok = $stderr.sync &&
|
8
|
+
$stdout.sync &&
|
9
|
+
String === $stderr.path &&
|
10
|
+
String === $stdout.path
|
11
|
+
|
12
|
+
[ 200, {}, [ "#{ok}\n" ] ]
|
13
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
|
4
|
+
t_plan 4 "config.ru inside alt working_directory (no embedded switches)"
|
5
|
+
|
6
|
+
t_begin "setup and start" && {
|
7
|
+
unicorn_setup
|
8
|
+
rm -rf $t_pfx.app
|
9
|
+
mkdir $t_pfx.app
|
10
|
+
|
11
|
+
cat > $t_pfx.app/config.ru <<EOF
|
12
|
+
use Rack::ContentLength
|
13
|
+
use Rack::ContentType, "text/plain"
|
14
|
+
run lambda { |env| [ 200, {}, [ "#{\$master_ppid}\\n" ] ] }
|
15
|
+
EOF
|
16
|
+
# the whole point of this exercise
|
17
|
+
echo "working_directory '$t_pfx.app'" >> $unicorn_config
|
18
|
+
|
19
|
+
# allows ppid to be 1 in before_fork
|
20
|
+
echo "preload_app true" >> $unicorn_config
|
21
|
+
cat >> $unicorn_config <<\EOF
|
22
|
+
before_fork do |server,worker|
|
23
|
+
$master_ppid = Process.ppid # should be zero to detect daemonization
|
24
|
+
end
|
25
|
+
EOF
|
26
|
+
|
27
|
+
cd /
|
28
|
+
unicorn -D -c $unicorn_config
|
29
|
+
unicorn_wait_start
|
30
|
+
}
|
31
|
+
|
32
|
+
t_begin "hit with curl" && {
|
33
|
+
body=$(curl -sSf http://$listen/)
|
34
|
+
}
|
35
|
+
|
36
|
+
t_begin "killing succeeds" && {
|
37
|
+
kill $unicorn_pid
|
38
|
+
}
|
39
|
+
|
40
|
+
t_begin "response body ppid == 1 (daemonized)" && {
|
41
|
+
test "$body" -eq 1
|
42
|
+
}
|
43
|
+
|
44
|
+
t_done
|
@@ -10,8 +10,11 @@ t_plan 5 "Rails 3 (beta) inside alt working_directory (w/ config.ru)"
|
|
10
10
|
|
11
11
|
t_begin "setup and start" && {
|
12
12
|
unicorn_setup
|
13
|
-
rtmpfiles unicorn_config_tmp
|
14
|
-
|
13
|
+
rtmpfiles unicorn_config_tmp usocket
|
14
|
+
if test -e $usocket
|
15
|
+
then
|
16
|
+
die "unexpected $usocket"
|
17
|
+
fi
|
15
18
|
rails3_app=$(cd rails3-app && pwd)
|
16
19
|
rm -rf $t_pfx.app
|
17
20
|
mkdir $t_pfx.app
|
@@ -22,7 +25,7 @@ t_begin "setup and start" && {
|
|
22
25
|
unicorn_setup
|
23
26
|
rm $pid
|
24
27
|
|
25
|
-
echo "#\\--daemonize --host $host --port $port -l $
|
28
|
+
echo "#\\--daemonize --host $host --port $port -l $usocket" \
|
26
29
|
>> $t_pfx.app/config.ru
|
27
30
|
|
28
31
|
# we have --host/--port in config.ru instead
|
@@ -48,7 +51,7 @@ t_begin "static file serving works" && {
|
|
48
51
|
}
|
49
52
|
|
50
53
|
t_begin "socket created" && {
|
51
|
-
test -S $
|
54
|
+
test -S $usocket
|
52
55
|
}
|
53
56
|
|
54
57
|
t_begin "killing succeeds" && {
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-rails3.sh
|
3
|
+
|
4
|
+
t_plan 5 "Rails 3 (beta) inside alt working_directory (no embedded switches)"
|
5
|
+
|
6
|
+
t_begin "setup and start" && {
|
7
|
+
unicorn_setup
|
8
|
+
rtmpfiles unicorn_config_tmp usocket
|
9
|
+
if test -e $usocket
|
10
|
+
then
|
11
|
+
die "unexpected $usocket"
|
12
|
+
fi
|
13
|
+
rails3_app=$(cd rails3-app && pwd)
|
14
|
+
rm -rf $t_pfx.app
|
15
|
+
mkdir $t_pfx.app
|
16
|
+
cd $t_pfx.app
|
17
|
+
( cd $rails3_app && tar cf - . ) | tar xf -
|
18
|
+
$RAKE db:sessions:create
|
19
|
+
$RAKE db:migrate
|
20
|
+
unicorn_setup
|
21
|
+
rm $pid
|
22
|
+
|
23
|
+
grep -v ^pid $unicorn_config > $unicorn_config_tmp
|
24
|
+
echo "working_directory '$t_pfx.app'" >> $unicorn_config_tmp
|
25
|
+
cd /
|
26
|
+
unicorn_rails -c $unicorn_config_tmp \
|
27
|
+
--daemonize --host $host --port $port -l $usocket
|
28
|
+
}
|
29
|
+
|
30
|
+
t_begin "pids in the right place" && {
|
31
|
+
if test -e $pid
|
32
|
+
then
|
33
|
+
die "pid=$pid not expected"
|
34
|
+
fi
|
35
|
+
|
36
|
+
unicorn_rails_pid="$t_pfx.app/tmp/pids/unicorn.pid"
|
37
|
+
unicorn_pid=$(cat $unicorn_rails_pid)
|
38
|
+
}
|
39
|
+
|
40
|
+
t_begin "static file serving works" && {
|
41
|
+
test x"$(curl -sSf http://$listen/x.txt)" = xHELLO
|
42
|
+
}
|
43
|
+
|
44
|
+
t_begin "socket created" && {
|
45
|
+
test -S $usocket
|
46
|
+
}
|
47
|
+
|
48
|
+
t_begin "killing succeeds" && {
|
49
|
+
kill $unicorn_pid
|
50
|
+
}
|
51
|
+
|
52
|
+
t_done
|
data/test/exec/test_exec.rb
CHANGED
@@ -20,10 +20,6 @@ unless try_require('rack')
|
|
20
20
|
do_test = false
|
21
21
|
end
|
22
22
|
|
23
|
-
if ENV['RBX_SKIP']
|
24
|
-
do_test = false
|
25
|
-
end
|
26
|
-
|
27
23
|
class ExecTest < Test::Unit::TestCase
|
28
24
|
trap(:QUIT, 'IGNORE')
|
29
25
|
|
@@ -613,7 +609,7 @@ EOF
|
|
613
609
|
results = retry_hit(["http://#{@addr}:#{@port}/"])
|
614
610
|
assert_equal String, results[0].class
|
615
611
|
assert_shutdown(pid)
|
616
|
-
end
|
612
|
+
end unless ENV['RBX_SKIP']
|
617
613
|
|
618
614
|
def test_config_ru_alt_path
|
619
615
|
config_path = "#{@tmpdir}/foo.ru"
|
data/test/unit/test_signals.rb
CHANGED
@@ -97,7 +97,7 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
97
97
|
a = bind_listen(tcp_server)
|
98
98
|
assert_equal a.fileno, tcp_server.fileno
|
99
99
|
assert_equal a.fileno, @tcp_listener.fileno
|
100
|
-
end
|
100
|
+
end
|
101
101
|
|
102
102
|
def test_bind_listen_unix_rebind
|
103
103
|
test_bind_listen_unix
|
@@ -139,11 +139,11 @@ class TestSocketHelper < Test::Unit::TestCase
|
|
139
139
|
assert_equal @tcp_listener.fileno, @tcp_server.fileno
|
140
140
|
assert TCPServer === @tcp_server
|
141
141
|
assert_equal @tcp_listener_name, sock_name(@tcp_server)
|
142
|
-
end
|
142
|
+
end
|
143
143
|
|
144
144
|
def test_sock_name
|
145
145
|
test_server_cast
|
146
146
|
sock_name(@unix_server)
|
147
|
-
end
|
147
|
+
end
|
148
148
|
|
149
149
|
end
|
metadata
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
- 991
|
9
9
|
- 0
|
10
|
-
|
11
|
-
- g0cb0
|
12
|
-
version: 0.991.0.4.g0cb0
|
10
|
+
version: 1.0.0
|
13
11
|
platform: ruby
|
14
12
|
authors:
|
15
13
|
- Unicorn hackers
|
@@ -17,7 +15,7 @@ autorequire:
|
|
17
15
|
bindir: bin
|
18
16
|
cert_chain: []
|
19
17
|
|
20
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-17 00:00:00 +00:00
|
21
19
|
default_executable:
|
22
20
|
dependencies:
|
23
21
|
- !ruby/object:Gem::Dependency
|
@@ -208,10 +206,14 @@ files:
|
|
208
206
|
- t/t0003-working_directory.sh
|
209
207
|
- t/t0004-working_directory_broken.sh
|
210
208
|
- t/t0005-working_directory_app.rb.sh
|
209
|
+
- t/t0006-reopen-logs.sh
|
210
|
+
- t/t0006.ru
|
211
|
+
- t/t0007-working_directory_no_embed_cli.sh
|
211
212
|
- t/t0300-rails3-basic.sh
|
212
213
|
- t/t0301-rails3-missing-config-ru.sh
|
213
214
|
- t/t0302-rails3-alt-working_directory.sh
|
214
215
|
- t/t0303-rails3-alt-working_directory_config.ru.sh
|
216
|
+
- t/t0304-rails3-alt-working_directory_no_embed_cli.sh
|
215
217
|
- t/test-lib.sh
|
216
218
|
- t/test-rails3.sh
|
217
219
|
- test/aggregate.rb
|
@@ -333,14 +335,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
333
335
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
334
336
|
none: false
|
335
337
|
requirements:
|
336
|
-
- - "
|
338
|
+
- - ">="
|
337
339
|
- !ruby/object:Gem::Version
|
338
|
-
hash:
|
340
|
+
hash: 3
|
339
341
|
segments:
|
340
|
-
-
|
341
|
-
|
342
|
-
- 1
|
343
|
-
version: 1.3.1
|
342
|
+
- 0
|
343
|
+
version: "0"
|
344
344
|
requirements: []
|
345
345
|
|
346
346
|
rubyforge_project: mongrel
|