unicorn 1.0.1 → 1.0.2
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.
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +2 -2
- data/Rakefile +7 -3
- data/lib/unicorn.rb +4 -5
- data/lib/unicorn/configurator.rb +12 -6
- data/lib/unicorn/const.rb +2 -2
- data/t/t0009-winch_ttin.sh +59 -0
- data/t/t0012-reload-empty-config.sh +82 -0
- data/unicorn.gemspec +2 -2
- metadata +10 -9
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -169,7 +169,7 @@ NEWS: GIT-VERSION-FILE .manifest
|
|
169
169
|
$(RAKE) -s news_rdoc > $@+
|
170
170
|
mv $@+ $@
|
171
171
|
|
172
|
-
SINCE = 0.
|
172
|
+
SINCE = 1.0.0
|
173
173
|
ChangeLog: LOG_VERSION = \
|
174
174
|
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
175
175
|
echo $(GIT_VERSION) || git describe)
|
@@ -189,7 +189,7 @@ atom = <link rel="alternate" title="Atom feed" href="$(1)" \
|
|
189
189
|
doc: .document $(ext)/unicorn_http.c NEWS ChangeLog
|
190
190
|
for i in $(man1_rdoc); do echo > $$i; done
|
191
191
|
find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';'
|
192
|
-
rdoc -
|
192
|
+
rdoc -t "$(shell sed -ne '1s/^= //p' README)"
|
193
193
|
install -m644 COPYING doc/COPYING
|
194
194
|
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
195
195
|
$(MAKE) -C Documentation install-html install-man
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ def tags
|
|
15
15
|
timefmt = '%Y-%m-%dT%H:%M:%SZ'
|
16
16
|
@tags ||= `git tag -l`.split(/\n/).map do |tag|
|
17
17
|
next if tag == "v0.0.0"
|
18
|
-
if %r{\Av[\d\.]
|
18
|
+
if %r{\Av[\d\.]+} =~ tag
|
19
19
|
header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
|
20
20
|
header = header.split(/\n/)
|
21
21
|
tagger = header.grep(/\Atagger /).first
|
@@ -168,8 +168,12 @@ task :fm_update do
|
|
168
168
|
"changelog" => changelog,
|
169
169
|
},
|
170
170
|
}.to_json
|
171
|
-
|
172
|
-
|
171
|
+
if ! changelog.strip.empty? && version =~ %r{\A[\d\.]+\d+\z}
|
172
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
173
|
+
p http.post(uri.path, req, {'Content-Type'=>'application/json'})
|
174
|
+
end
|
175
|
+
else
|
176
|
+
warn "not updating freshmeat for v#{version}"
|
173
177
|
end
|
174
178
|
end
|
175
179
|
|
data/lib/unicorn.rb
CHANGED
@@ -422,10 +422,12 @@ module Unicorn
|
|
422
422
|
respawn = false
|
423
423
|
logger.info "gracefully stopping all workers"
|
424
424
|
kill_each_worker(:QUIT)
|
425
|
+
self.worker_processes = 0
|
425
426
|
else
|
426
427
|
logger.info "SIGWINCH ignored because we're not daemonized"
|
427
428
|
end
|
428
429
|
when :TTIN
|
430
|
+
respawn = true
|
429
431
|
self.worker_processes += 1
|
430
432
|
when :TTOU
|
431
433
|
self.worker_processes -= 1 if self.worker_processes > 0
|
@@ -486,12 +488,9 @@ module Unicorn
|
|
486
488
|
# wait for a signal hander to wake us up and then consume the pipe
|
487
489
|
# Wake up every second anyways to run murder_lazy_workers
|
488
490
|
def master_sleep(sec)
|
489
|
-
|
490
|
-
|
491
|
-
SELF_PIPE.first.read_nonblock(Const::CHUNK_SIZE, HttpRequest::BUF)
|
491
|
+
IO.select([ SELF_PIPE[0] ], nil, nil, sec) or return
|
492
|
+
SELF_PIPE[0].read_nonblock(Const::CHUNK_SIZE, HttpRequest::BUF)
|
492
493
|
rescue Errno::EAGAIN, Errno::EINTR
|
493
|
-
break
|
494
|
-
end while true
|
495
494
|
end
|
496
495
|
|
497
496
|
def awaken_master
|
data/lib/unicorn/configurator.rb
CHANGED
@@ -40,21 +40,24 @@ module Unicorn
|
|
40
40
|
|
41
41
|
def initialize(defaults = {}) #:nodoc:
|
42
42
|
self.set = Hash.new(:unset)
|
43
|
-
use_defaults = defaults.delete(:use_defaults)
|
43
|
+
@use_defaults = defaults.delete(:use_defaults)
|
44
44
|
self.config_file = defaults.delete(:config_file)
|
45
45
|
|
46
46
|
# after_reload is only used by unicorn_rails, unsupported otherwise
|
47
47
|
self.after_reload = defaults.delete(:after_reload)
|
48
48
|
|
49
|
-
set.merge!(DEFAULTS) if use_defaults
|
50
|
-
defaults.each { |key, value| self.
|
49
|
+
set.merge!(DEFAULTS) if @use_defaults
|
50
|
+
defaults.each { |key, value| self.__send__(key, value) }
|
51
51
|
Hash === set[:listener_opts] or
|
52
52
|
set[:listener_opts] = Hash.new { |hash,key| hash[key] = {} }
|
53
53
|
Array === set[:listeners] or set[:listeners] = []
|
54
|
-
reload
|
54
|
+
reload(false)
|
55
55
|
end
|
56
56
|
|
57
|
-
def reload #:nodoc:
|
57
|
+
def reload(merge_defaults = true) #:nodoc:
|
58
|
+
if merge_defaults && @use_defaults
|
59
|
+
set.merge!(DEFAULTS) if @use_defaults
|
60
|
+
end
|
58
61
|
instance_eval(File.read(config_file), config_file) if config_file
|
59
62
|
|
60
63
|
parse_rackup_file
|
@@ -361,7 +364,10 @@ module Unicorn
|
|
361
364
|
|
362
365
|
# sets the working directory for Unicorn. This ensures SIGUSR2 will
|
363
366
|
# start a new instance of Unicorn in this directory. This may be
|
364
|
-
# a symlink, a common scenario for Capistrano users.
|
367
|
+
# a symlink, a common scenario for Capistrano users. Unlike
|
368
|
+
# all other Unicorn configuration directives, this binds immediately
|
369
|
+
# for error checking and cannot be undone by unsetting it in the
|
370
|
+
# configuration file and reloading.
|
365
371
|
def working_directory(path)
|
366
372
|
# just let chdir raise errors
|
367
373
|
path = File.expand_path(path)
|
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 1.0.
|
12
|
-
UNICORN_VERSION="1.0.
|
11
|
+
# The current version of Unicorn, currently 1.0.2
|
12
|
+
UNICORN_VERSION="1.0.2"
|
13
13
|
|
14
14
|
DEFAULT_HOST = "0.0.0.0" # default TCP listen host address
|
15
15
|
DEFAULT_PORT = 8080 # default TCP listen port
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 8 "SIGTTIN succeeds after SIGWINCH"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
cat >> $unicorn_config <<EOF
|
8
|
+
after_fork do |server, worker|
|
9
|
+
# test script will block while reading from $fifo,
|
10
|
+
File.open("$fifo", "wb") { |fp| fp.syswrite worker.nr.to_s }
|
11
|
+
end
|
12
|
+
EOF
|
13
|
+
unicorn -D -c $unicorn_config pid.ru
|
14
|
+
unicorn_wait_start
|
15
|
+
test 0 -eq $(cat $fifo) || die "worker.nr != 0"
|
16
|
+
}
|
17
|
+
|
18
|
+
t_begin "read worker pid" && {
|
19
|
+
orig_worker_pid=$(curl -sSf http://$listen/)
|
20
|
+
test -n "$orig_worker_pid" && kill -0 $orig_worker_pid
|
21
|
+
}
|
22
|
+
|
23
|
+
t_begin "stop all workers" && {
|
24
|
+
kill -WINCH $unicorn_pid
|
25
|
+
}
|
26
|
+
|
27
|
+
# we have to do this next step before delivering TTIN
|
28
|
+
# signals aren't guaranteed to delivered in order
|
29
|
+
t_begin "wait for worker to die" && {
|
30
|
+
i=0
|
31
|
+
while kill -0 $orig_worker_pid 2>/dev/null
|
32
|
+
do
|
33
|
+
i=$(( $i + 1 ))
|
34
|
+
test $i -lt 600 || die "timed out"
|
35
|
+
sleep 1
|
36
|
+
done
|
37
|
+
}
|
38
|
+
|
39
|
+
t_begin "start one worker back up" && {
|
40
|
+
kill -TTIN $unicorn_pid
|
41
|
+
}
|
42
|
+
|
43
|
+
t_begin "wait for new worker to start" && {
|
44
|
+
test 0 -eq $(cat $fifo) || die "worker.nr != 0"
|
45
|
+
new_worker_pid=$(curl -sSf http://$listen/)
|
46
|
+
test -n "$new_worker_pid" && kill -0 $new_worker_pid
|
47
|
+
test $orig_worker_pid -ne $new_worker_pid || \
|
48
|
+
die "worker wasn't replaced"
|
49
|
+
}
|
50
|
+
|
51
|
+
t_begin "killing succeeds" && {
|
52
|
+
kill $unicorn_pid
|
53
|
+
}
|
54
|
+
|
55
|
+
t_begin "check stderr" && check_stderr
|
56
|
+
|
57
|
+
dbgcat r_err
|
58
|
+
|
59
|
+
t_done
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 9 "reloading unset config resets defaults"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
rtmpfiles unicorn_config_orig before_reload after_reload
|
8
|
+
cat $unicorn_config > $unicorn_config_orig
|
9
|
+
cat >> $unicorn_config <<EOF
|
10
|
+
logger Logger.new(STDOUT)
|
11
|
+
preload_app true
|
12
|
+
timeout 0x7fffffff
|
13
|
+
worker_processes 2
|
14
|
+
after_fork { |s,w| }
|
15
|
+
\$dump_cfg = lambda { |fp,srv|
|
16
|
+
defaults = Unicorn::Configurator::DEFAULTS
|
17
|
+
defaults.keys.map { |x| x.to_s }.sort.each do |key|
|
18
|
+
next if key =~ %r{\Astd(?:err|out)_path\z}
|
19
|
+
key = key.to_sym
|
20
|
+
def_value = defaults[key]
|
21
|
+
srv_value = srv.__send__(key)
|
22
|
+
fp << "#{key}|#{srv_value}|#{def_value}\\n"
|
23
|
+
end
|
24
|
+
}
|
25
|
+
before_fork { |s,w|
|
26
|
+
File.open("$before_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
27
|
+
}
|
28
|
+
before_exec { |s| }
|
29
|
+
EOF
|
30
|
+
unicorn -D -c $unicorn_config env.ru
|
31
|
+
unicorn_wait_start
|
32
|
+
}
|
33
|
+
|
34
|
+
t_begin "ensure worker is started" && {
|
35
|
+
curl -sSf http://$listen/ > $tmp
|
36
|
+
}
|
37
|
+
|
38
|
+
t_begin "replace config file with original(-ish)" && {
|
39
|
+
grep -v ^pid < $unicorn_config_orig > $unicorn_config
|
40
|
+
cat >> $unicorn_config <<EOF
|
41
|
+
before_fork { |s,w|
|
42
|
+
File.open("$after_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
43
|
+
}
|
44
|
+
EOF
|
45
|
+
}
|
46
|
+
|
47
|
+
t_begin "reload signal succeeds" && {
|
48
|
+
kill -HUP $unicorn_pid
|
49
|
+
while ! egrep '(done|error) reloading' $r_err >/dev/null
|
50
|
+
do
|
51
|
+
sleep 1
|
52
|
+
done
|
53
|
+
|
54
|
+
grep 'done reloading' $r_err >/dev/null
|
55
|
+
}
|
56
|
+
|
57
|
+
t_begin "ensure worker is started" && {
|
58
|
+
curl -sSf http://$listen/ > $tmp
|
59
|
+
}
|
60
|
+
|
61
|
+
t_begin "pid file no longer exists" && {
|
62
|
+
if test -f $pid
|
63
|
+
then
|
64
|
+
die "pid=$pid should not exist"
|
65
|
+
fi
|
66
|
+
}
|
67
|
+
|
68
|
+
t_begin "killing succeeds" && {
|
69
|
+
kill $unicorn_pid
|
70
|
+
}
|
71
|
+
|
72
|
+
t_begin "check stderr" && {
|
73
|
+
check_stderr
|
74
|
+
}
|
75
|
+
|
76
|
+
t_begin "ensure reloading restored settings" && {
|
77
|
+
awk < $after_reload -F'|' '
|
78
|
+
$1 != "before_fork" && $2 != $3 { print $0; exit(1) }
|
79
|
+
'
|
80
|
+
}
|
81
|
+
|
82
|
+
t_done
|
data/unicorn.gemspec
CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.homepage = %q{http://unicorn.bogomips.org/}
|
37
37
|
|
38
38
|
summary = %q{Rack HTTP server for fast clients and Unix}
|
39
|
-
s.rdoc_options = [ "-
|
39
|
+
s.rdoc_options = [ "-t", "Unicorn: #{summary}" ]
|
40
40
|
s.require_paths = %w(lib ext)
|
41
41
|
s.rubyforge_project = %q{mongrel}
|
42
42
|
s.summary = summary
|
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
|
|
49
49
|
# *strongly* recommended for security reasons.
|
50
50
|
s.add_dependency(%q<rack>)
|
51
51
|
|
52
|
-
s.add_development_dependency('isolate', '~>
|
52
|
+
s.add_development_dependency('isolate', '~> 3.0.0')
|
53
53
|
|
54
54
|
# s.licenses = %w(GPLv2 Ruby) # licenses= method is not in older RubyGems
|
55
55
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Unicorn hackers
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-27 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -40,12 +40,12 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
43
|
+
hash: 7
|
44
44
|
segments:
|
45
|
-
-
|
45
|
+
- 3
|
46
|
+
- 0
|
46
47
|
- 0
|
47
|
-
|
48
|
-
version: 2.0.2
|
48
|
+
version: 3.0.0
|
49
49
|
type: :development
|
50
50
|
version_requirements: *id002
|
51
51
|
description: |-
|
@@ -211,6 +211,8 @@ files:
|
|
211
211
|
- t/t0006.ru
|
212
212
|
- t/t0007-working_directory_no_embed_cli.sh
|
213
213
|
- t/t0008-back_out_of_upgrade.sh
|
214
|
+
- t/t0009-winch_ttin.sh
|
215
|
+
- t/t0012-reload-empty-config.sh
|
214
216
|
- t/t0300-rails3-basic.sh
|
215
217
|
- t/t0301-rails3-missing-config-ru.sh
|
216
218
|
- t/t0302-rails3-alt-working_directory.sh
|
@@ -319,7 +321,6 @@ licenses: []
|
|
319
321
|
|
320
322
|
post_install_message:
|
321
323
|
rdoc_options:
|
322
|
-
- -Na
|
323
324
|
- -t
|
324
325
|
- "Unicorn: Rack HTTP server for fast clients and Unix"
|
325
326
|
require_paths:
|