rainbows 4.6.2 → 4.7.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.
- checksums.yaml +4 -4
- data/.document +0 -1
- data/.gitignore +3 -1
- data/{.wrongdoc.yml → .olddoc.yml} +8 -1
- data/DEPLOY +5 -5
- data/FAQ +7 -7
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +1 -12
- data/HACKING +3 -5
- data/README +7 -3
- data/SIGNALS +3 -3
- data/Sandbox +1 -1
- data/Static_Files +1 -1
- data/Summary +1 -0
- data/Test_Suite +1 -0
- data/lib/rainbows.rb +3 -0
- data/lib/rainbows/response.rb +6 -1
- data/lib/rainbows/sync_close.rb +2 -2
- data/pkg.mk +18 -36
- data/rainbows.gemspec +12 -11
- data/t/GNUmakefile +9 -6
- data/t/close-has-env.ru +1 -0
- data/t/test_isolate.rb +17 -15
- data/vs_Unicorn +8 -8
- metadata +15 -22
- data/Documentation/comparison.css +0 -6
- data/Rakefile +0 -71
- data/Test_Suite +0 -63
- data/t/t0044-autopush.sh +0 -121
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 696829a7735d042f66084bbbf36e17658edd8a78
|
4
|
+
data.tar.gz: 8ca5eb73b0c23373c9ac41a23866506de6b6b649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb200f3630bf46e0a3be33a6dcd132f3f555eb72cdfd65145781d2488ccbfa3fc8f7b35db3c3d5e9ab4aa8707ddd373b80efe5129b4a13e54df2483939bd4ad4
|
7
|
+
data.tar.gz: b08b512c0fc0f71f78efa8000cb150cbc7a5ece957b1f1a51bc7dda11e73f488d4f865752932b94b1b07fb66b93d08093fc8780620347a516b389af1964d46ad
|
data/.document
CHANGED
data/.gitignore
CHANGED
@@ -2,10 +2,17 @@
|
|
2
2
|
cgit_url: http://bogomips.org/rainbows.git
|
3
3
|
git_url: git://bogomips.org/rainbows.git
|
4
4
|
rdoc_url: http://rainbows.bogomips.org/
|
5
|
-
changelog_start: v0.97.0
|
6
5
|
merge_html:
|
7
6
|
rainbows_1: Documentation/rainbows.1.html
|
8
7
|
Summary: Documentation/comparison.html
|
9
8
|
public_email: rainbows-public@bogomips.org
|
10
9
|
private_email: rainbows@bogomips.org
|
10
|
+
noindex:
|
11
|
+
- TODO
|
12
|
+
- LATEST
|
13
|
+
- Unicorn
|
14
|
+
- Unicorn::Configurator
|
15
|
+
- Unicorn::SocketHelper
|
16
|
+
- EM
|
17
|
+
- Revactor
|
11
18
|
ml_url: http://bogomips.org/rainbows-public/
|
data/DEPLOY
CHANGED
@@ -13,26 +13,26 @@ processing of the request body as it is being uploaded.
|
|
13
13
|
In this case, haproxy or any similar (non-request-body-buffering) load
|
14
14
|
balancer should be used to balance requests between different machines.
|
15
15
|
|
16
|
-
== nginx proxying to \Rainbows! or
|
16
|
+
== nginx proxying to \Rainbows! or unicorn
|
17
17
|
|
18
18
|
For high-traffic applications, routing slow actions to \Rainbows! with
|
19
19
|
nginx is recommended as nginx can serve static files faster and nginx
|
20
|
-
can forward fast actions to
|
20
|
+
can forward fast actions to unicorn.
|
21
21
|
|
22
22
|
static files
|
23
23
|
|
|
24
24
|
nginx |--> slow actions --> Rainbows!
|
25
25
|
|
|
26
|
-
`--> fast actions -->
|
26
|
+
`--> fast actions --> unicorn
|
27
27
|
|
28
28
|
Be sure to set <tt>proxy_buffering off</tt> in nginx for "slow actions"
|
29
|
-
if you have Comet applications (but not for
|
29
|
+
if you have Comet applications (but not for unicorn).
|
30
30
|
|
31
31
|
== Denial-of-Service Concerns
|
32
32
|
|
33
33
|
Since \Rainbows! is designed to talk to slow clients with long-held
|
34
34
|
connections, it may be subject to brute force denial-of-service attacks.
|
35
|
-
In
|
35
|
+
In unicorn and Mongrel, we've already enabled the "httpready" accept
|
36
36
|
filter for FreeBSD and the TCP_DEFER_ACCEPT option in Linux; but it is
|
37
37
|
still possible to build clients that work around and fool these
|
38
38
|
mechanisms.
|
data/FAQ
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
= Frequently Asked Questions about \Rainbows!
|
2
2
|
|
3
|
-
=== Why is \Rainbows! a separate project from
|
3
|
+
=== Why is \Rainbows! a separate project from unicorn?
|
4
4
|
|
5
|
-
\Rainbows! is for the odd, corner-case requests that
|
5
|
+
\Rainbows! is for the odd, corner-case requests that unicorn is poorly
|
6
6
|
suited for. More scalable concurrency models introduce additional
|
7
|
-
complexity that
|
7
|
+
complexity that unicorn users and developers are uncomfortable with for
|
8
8
|
the common cases.
|
9
9
|
|
10
10
|
|
@@ -15,7 +15,7 @@ models, or are just too lazy to deal with them for the majority of
|
|
15
15
|
requests we service.
|
16
16
|
|
17
17
|
|
18
|
-
=== Isn't "rainbows" a branch of
|
18
|
+
=== Isn't "rainbows" a branch of unicorn?
|
19
19
|
|
20
20
|
That functionality is now in the Revactor model of \Rainbows!
|
21
21
|
However, \Revactor is not recommended since it is dormant
|
@@ -23,7 +23,7 @@ upstream and requires your application (and all its libraries)
|
|
23
23
|
to cooperate with \Revactor for concurrency.
|
24
24
|
|
25
25
|
|
26
|
-
=== What happened to the "gossamer" branch of
|
26
|
+
=== What happened to the "gossamer" branch of unicorn?
|
27
27
|
|
28
28
|
It became the ThreadPool model of \Rainbows!
|
29
29
|
|
@@ -39,7 +39,7 @@ ease-of-debugging, compatibility, performance, and memory usage.
|
|
39
39
|
=== Should I put \Rainbows! behind nginx to serve slow clients?
|
40
40
|
|
41
41
|
It is optional. You can still use nginx to route certain requests to
|
42
|
-
|
42
|
+
unicorn and others to \Rainbows! nginx will always outperform
|
43
43
|
\Rainbows! in both pure reverse proxy applications and for serving
|
44
44
|
static files, but \Rainbows! is for hosting applications that are more
|
45
45
|
easily-implemented in Ruby than C.
|
@@ -64,7 +64,7 @@ requires a extra {patch}[http://haproxy.1wt.eu/download/patches/].
|
|
64
64
|
If you don't need streaming "rack.input", then nginx is a great HTTPS
|
65
65
|
reverse proxy.
|
66
66
|
|
67
|
-
Refer to the {
|
67
|
+
Refer to the {unicorn FAQ}[http://unicorn.bogomips.org/FAQ.html] on how
|
68
68
|
to ensure redirects go to "https://" URLs.
|
69
69
|
|
70
70
|
|
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -2,23 +2,16 @@
|
|
2
2
|
all::
|
3
3
|
# RSYNC_DEST := rubyforge.org:/var/www/gforge-projects/rainbows
|
4
4
|
RSYNC_DEST := rainbows.bogomips.org:/srv/rainbows
|
5
|
-
rfproject := rainbows
|
6
5
|
rfpackage := rainbows
|
6
|
+
PLACEHOLDERS := rainbows_1 Summary
|
7
7
|
|
8
8
|
man-rdoc: man html
|
9
9
|
$(MAKE) -C Documentation comparison.html
|
10
|
-
for i in $(man1_rdoc); do echo > $$i; done
|
11
10
|
doc:: man-rdoc
|
12
11
|
include pkg.mk
|
13
|
-
ifneq ($(VERSION),)
|
14
|
-
release::
|
15
|
-
$(RAKE) publish_news VERSION=$(VERSION)
|
16
|
-
$(RAKE) fm_update VERSION=$(VERSION)
|
17
|
-
endif
|
18
12
|
|
19
13
|
base_bins := rainbows
|
20
14
|
bins := $(addprefix bin/, $(base_bins))
|
21
|
-
man1_rdoc := $(addsuffix _1, $(base_bins))
|
22
15
|
man1_bins := $(addsuffix .1, $(base_bins))
|
23
16
|
man1_paths := $(addprefix man/man1/, $(man1_bins))
|
24
17
|
|
@@ -30,10 +23,6 @@ man html:
|
|
30
23
|
|
31
24
|
pkg_extra += $(man1_paths) lib/rainbows/version.rb
|
32
25
|
|
33
|
-
doc::
|
34
|
-
cat Documentation/comparison.css >> doc/rdoc.css
|
35
|
-
$(RM) $(man1_rdoc)
|
36
|
-
|
37
26
|
lib/rainbows/version.rb: GIT-VERSION-FILE
|
38
27
|
|
39
28
|
all:: test
|
data/HACKING
CHANGED
@@ -6,10 +6,8 @@ All tests are written in POSIX shell. See README file in the t/ directory.
|
|
6
6
|
|
7
7
|
=== Documentation
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
the lack of RDoc-to-manpage converters we know about, we're writing
|
12
|
-
manpages in Markdown and converting to troff/HTML with Pandoc.
|
9
|
+
Due to the lack of RDoc-to-manpage converters we know about, we're
|
10
|
+
writing manpages in Markdown and converting to troff/HTML with Pandoc.
|
13
11
|
|
14
12
|
Please wrap documentation at 72 characters-per-line or less (long URLs
|
15
13
|
are exempt) so it is comfortably readable from terminals.
|
@@ -48,7 +46,7 @@ Please Cc: everyone on replies, as not everyone is subscribed.
|
|
48
46
|
|
49
47
|
In order to build the gem, you must install the following components:
|
50
48
|
|
51
|
-
*
|
49
|
+
* olddoc (RubyGem)
|
52
50
|
* pandoc
|
53
51
|
|
54
52
|
You can build the Unicorn gem with the following command:
|
data/README
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
= Rainbows! -
|
1
|
+
= Rainbows! - unicorn for sleepy apps and slow clients
|
2
2
|
|
3
3
|
\Rainbows! is an HTTP server for sleepy Rack applications. It is based on
|
4
|
-
|
4
|
+
unicorn, but designed to handle applications that expect long
|
5
5
|
request/response times and/or slow clients.
|
6
6
|
|
7
|
+
If you're on GNU/Linux and overwhelmed by options in \Rainbows!,
|
8
|
+
consider {yahns}[http://yahns.yhbt.net/] as it has fewer options
|
9
|
+
and more energy-efficient during non-peak traffic.
|
10
|
+
|
7
11
|
For Rack applications not heavily bound by slow external network
|
8
|
-
dependencies, consider
|
12
|
+
dependencies, consider unicorn instead as it simpler and easier to
|
9
13
|
debug.
|
10
14
|
|
11
15
|
If you're on a small system, or write extremely tight and reliable code
|
data/SIGNALS
CHANGED
@@ -5,7 +5,7 @@ the signals Rainbows! uses internally to communicate with the worker
|
|
5
5
|
processes are documented here as well. With the exception of TTIN/TTOU,
|
6
6
|
signal handling matches the behavior of and {nginx}[http://nginx.net/]
|
7
7
|
so it should be possible to easily share process management scripts
|
8
|
-
between \Rainbows!,
|
8
|
+
between \Rainbows!, unicorn and nginx.
|
9
9
|
|
10
10
|
=== Master Process
|
11
11
|
|
@@ -60,7 +60,7 @@ automatically respawned.
|
|
60
60
|
|
61
61
|
* USR1 - Reopen all logs owned by the worker process.
|
62
62
|
See Unicorn::Util.reopen_logs for what is considered a log.
|
63
|
-
Unlike
|
63
|
+
Unlike unicorn, log files are reopened immediately in \Rainbows!
|
64
64
|
since worker processes are likely to be serving multiple clients
|
65
65
|
simutaneously, we can't wait for all of them to finish.
|
66
66
|
|
@@ -68,7 +68,7 @@ automatically respawned.
|
|
68
68
|
|
69
69
|
You may replace a running instance of rainbows with a new one without
|
70
70
|
losing any incoming connections. Doing so will reload all of your
|
71
|
-
application code,
|
71
|
+
application code, unicorn/Rainbows! config, Ruby executable, and all
|
72
72
|
libraries. The only things that will not change (due to OS limitations)
|
73
73
|
are:
|
74
74
|
|
data/Sandbox
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Tips for using \Rainbows! with Sandbox installation tools
|
2
2
|
|
3
|
-
Most {tips for
|
3
|
+
Most {tips for unicorn}[http://unicorn.bogomips.org/Sandbox.html]
|
4
4
|
for Bundler and Isolate apply to \Rainbows! as well.
|
5
5
|
|
6
6
|
== TLDR (Bundler)
|
data/Static_Files
CHANGED
@@ -10,7 +10,7 @@ to simplify your deployments and only deploy one server?
|
|
10
10
|
== {sendfile}[http://rubygems.org/gems/sendfile] RubyGem
|
11
11
|
|
12
12
|
To enable the "sendfile" gem, just make sure you have 1.1.0 or later and
|
13
|
-
"require" it in your \Rainbows!/
|
13
|
+
"require" it in your \Rainbows!/unicorn config file (not your Rack
|
14
14
|
config.ru):
|
15
15
|
|
16
16
|
require 'sendfile' # that's it! nothing else to do
|
data/Summary
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
olddoc_placeholder
|
data/Test_Suite
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
t/README
|
data/lib/rainbows.rb
CHANGED
data/lib/rainbows/response.rb
CHANGED
@@ -128,8 +128,13 @@ module Rainbows::Response
|
|
128
128
|
unless IO.method_defined?(:trysendfile)
|
129
129
|
module CopyStream
|
130
130
|
def write_body_file(body, range)
|
131
|
+
# ensure sendfile gets used for SyncClose objects:
|
132
|
+
if !body.kind_of?(IO) && body.respond_to?(:to_path)
|
133
|
+
body = body.to_path
|
134
|
+
end
|
135
|
+
|
131
136
|
range ? COPY_STREAM.copy_stream(body, self, range[1], range[0]) :
|
132
|
-
COPY_STREAM.copy_stream(body, self
|
137
|
+
COPY_STREAM.copy_stream(body, self)
|
133
138
|
end
|
134
139
|
end
|
135
140
|
include CopyStream
|
data/lib/rainbows/sync_close.rb
CHANGED
data/pkg.mk
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
RUBY = ruby
|
2
2
|
RAKE = rake
|
3
3
|
RSYNC = rsync
|
4
|
-
|
4
|
+
OLDDOC = olddoc
|
5
|
+
RDOC = rdoc
|
5
6
|
|
6
7
|
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
7
8
|
@./GIT-VERSION-GEN
|
@@ -48,10 +49,10 @@ else
|
|
48
49
|
build:
|
49
50
|
endif
|
50
51
|
|
51
|
-
pkg_extra += GIT-VERSION-FILE NEWS
|
52
|
-
|
53
|
-
$(
|
54
|
-
|
52
|
+
pkg_extra += GIT-VERSION-FILE NEWS LATEST
|
53
|
+
NEWS: GIT-VERSION-FILE .olddoc.yml
|
54
|
+
$(OLDDOC) prepare
|
55
|
+
LATEST: NEWS
|
55
56
|
|
56
57
|
manifest:
|
57
58
|
$(RM) .manifest
|
@@ -63,28 +64,20 @@ manifest:
|
|
63
64
|
cmp $@+ $@ || mv $@+ $@
|
64
65
|
$(RM) $@+
|
65
66
|
|
66
|
-
doc:: .document .
|
67
|
+
doc:: .document .olddoc.yml $(pkg_extra) $(PLACEHOLDERS)
|
67
68
|
-find lib -type f -name '*.rbc' -exec rm -f '{}' ';'
|
68
69
|
-find ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
69
70
|
$(RM) -r doc
|
70
|
-
$(
|
71
|
+
$(RDOC) -f oldweb
|
72
|
+
$(OLDDOC) merge
|
71
73
|
install -m644 COPYING doc/COPYING
|
74
|
+
install -m644 NEWS doc/NEWS
|
75
|
+
install -m644 NEWS.atom.xml doc/NEWS.atom.xml
|
72
76
|
install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
|
73
77
|
|
74
78
|
ifneq ($(VERSION),)
|
75
79
|
pkggem := pkg/$(rfpackage)-$(VERSION).gem
|
76
80
|
pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
|
77
|
-
release_notes := release_notes-$(VERSION)
|
78
|
-
release_changes := release_changes-$(VERSION)
|
79
|
-
|
80
|
-
release-notes: $(release_notes)
|
81
|
-
release-changes: $(release_changes)
|
82
|
-
$(release_changes):
|
83
|
-
$(WRONGDOC) release_changes > $@+
|
84
|
-
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
85
|
-
$(release_notes):
|
86
|
-
$(WRONGDOC) release_notes > $@+
|
87
|
-
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
88
81
|
|
89
82
|
# ensures we're actually on the tagged $(VERSION), only used for release
|
90
83
|
verify:
|
@@ -120,23 +113,9 @@ $(pkgtgz): manifest fix-perms
|
|
120
113
|
|
121
114
|
package: $(pkgtgz) $(pkggem)
|
122
115
|
|
123
|
-
|
124
|
-
# make tgz release on RubyForge
|
125
|
-
@echo rubyforge add_release -f \
|
126
|
-
-n $(release_notes) -a $(release_changes) \
|
127
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
128
|
-
@echo gem push $(pkggem)
|
129
|
-
@echo rubyforge add_file \
|
130
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
131
|
-
release:: verify package $(release_notes) $(release_changes)
|
132
|
-
# make tgz release on RubyForge
|
133
|
-
rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
|
134
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
116
|
+
release:: verify package
|
135
117
|
# push gem to RubyGems.org
|
136
118
|
gem push $(pkggem)
|
137
|
-
# in case of gem downloads from RubyForge releases page
|
138
|
-
rubyforge add_file \
|
139
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
140
119
|
else
|
141
120
|
gem install-gem: GIT-VERSION-FILE
|
142
121
|
$(MAKE) $@ VERSION=$(GIT_VERSION)
|
@@ -154,8 +133,6 @@ ifneq ($(RSYNC_DEST),)
|
|
154
133
|
publish_doc:
|
155
134
|
-git set-file-times
|
156
135
|
$(MAKE) doc
|
157
|
-
find doc/images -type f | \
|
158
|
-
TZ=UTC xargs touch -d '1970-01-01 00:00:06' doc/rdoc.css
|
159
136
|
$(MAKE) doc_gz
|
160
137
|
$(RSYNC) -av doc/ $(RSYNC_DEST)/
|
161
138
|
git ls-files | xargs touch
|
@@ -163,7 +140,7 @@ endif
|
|
163
140
|
|
164
141
|
# Create gzip variants of the same timestamp as the original so nginx
|
165
142
|
# "gzip_static on" can serve the gzipped versions directly.
|
166
|
-
doc_gz: docs = $(shell find doc -type f ! -regex '
|
143
|
+
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.gz$$')
|
167
144
|
doc_gz:
|
168
145
|
for i in $(docs); do \
|
169
146
|
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
@@ -171,5 +148,10 @@ check-warnings:
|
|
171
148
|
@(for i in $$(git ls-files '*.rb'| grep -v '^setup\.rb$$'); \
|
172
149
|
do $(RUBY) -d -W2 -c $$i; done) | grep -v '^Syntax OK$$' || :
|
173
150
|
|
151
|
+
ifneq ($(PLACEHOLDERS),)
|
152
|
+
$(PLACEHOLDERS):
|
153
|
+
echo olddoc_placeholder > $@
|
154
|
+
endif
|
155
|
+
|
174
156
|
.PHONY: all .FORCE-GIT-VERSION-FILE doc test $(test_units) manifest
|
175
157
|
.PHONY: check-warnings
|
data/rainbows.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
2
|
ENV["VERSION"] or abort "VERSION= must be specified"
|
3
3
|
manifest = File.readlines('.manifest').map! { |x| x.chomp! }
|
4
|
-
require '
|
5
|
-
extend
|
4
|
+
require 'olddoc'
|
5
|
+
extend Olddoc::Gemspec
|
6
6
|
name, summary, title = readme_metadata
|
7
7
|
|
8
8
|
Gem::Specification.new do |s|
|
@@ -10,16 +10,13 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.version = ENV["VERSION"].dup
|
11
11
|
|
12
12
|
s.authors = ["#{name} hackers"]
|
13
|
-
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
14
13
|
s.description = readme_description
|
15
14
|
s.email = %q{rainbows-public@bogomips.org}
|
16
15
|
s.executables = %w(rainbows)
|
17
16
|
s.extra_rdoc_files = extra_rdoc_files(manifest)
|
18
17
|
s.files = manifest
|
19
|
-
s.homepage =
|
18
|
+
s.homepage = Olddoc.config['rdoc_url']
|
20
19
|
s.summary = summary
|
21
|
-
s.rdoc_options = rdoc_options
|
22
|
-
s.rubyforge_project = %q{rainbows}
|
23
20
|
|
24
21
|
# we want a newer Rack for a valid HeaderHash#each
|
25
22
|
s.add_dependency(%q<rack>, ['~> 1.1'])
|
@@ -27,13 +24,13 @@ Gem::Specification.new do |s|
|
|
27
24
|
# kgio 2.5 has kgio_wait_* methods that take optional timeout args
|
28
25
|
s.add_dependency(%q<kgio>, ['~> 2.5'])
|
29
26
|
|
30
|
-
# we need
|
27
|
+
# we need unicorn for the HTTP parser and process management
|
31
28
|
# we need unicorn 4.8.0+ since we depend on undocumented/unsupported
|
32
29
|
# unicorn internals.
|
33
30
|
s.add_dependency(%q<unicorn>, ["~> 4.8"])
|
34
31
|
|
35
32
|
s.add_development_dependency(%q<isolate>, "~> 3.1")
|
36
|
-
s.add_development_dependency(%q<
|
33
|
+
s.add_development_dependency(%q<olddoc>, "~> 1.0")
|
37
34
|
|
38
35
|
# optional runtime dependencies depending on configuration
|
39
36
|
# see t/test_isolate.rb for the exact versions we've tested with
|
@@ -56,7 +53,11 @@ Gem::Specification.new do |s|
|
|
56
53
|
# NeverBlock, currently only available on http://gems.github.com/
|
57
54
|
# s.add_dependency(%q<espace-neverblock>, ["~> 0.1.6.1"])
|
58
55
|
|
59
|
-
#
|
60
|
-
#
|
61
|
-
|
56
|
+
# Note: To avoid ambiguity, we intentionally avoid the SPDX-compatible
|
57
|
+
# 'Ruby' here since Ruby 1.9.3 switched to BSD-2-Clause license while
|
58
|
+
# we already inherited our license from Mongrel during Ruby 1.8.
|
59
|
+
# We cannot automatically switch licenses when Ruby changes their license,
|
60
|
+
# so we remain optionally-licensed under the terms of Ruby 1.8 despite
|
61
|
+
# not having a good way to specify this in an SPDX-compatible way...
|
62
|
+
s.licenses = ['GPL-2.0+', 'Nonstandard'] # Nonstandard = 'Ruby 1.8'
|
62
63
|
end
|
data/t/GNUmakefile
CHANGED
@@ -29,7 +29,6 @@ models += WriterThreadPool
|
|
29
29
|
models += WriterThreadSpawn
|
30
30
|
models += ThreadPool
|
31
31
|
models += ThreadSpawn
|
32
|
-
models += Coolio
|
33
32
|
|
34
33
|
models += StreamResponseEpoll
|
35
34
|
|
@@ -42,12 +41,16 @@ ifeq ($(RUBY_ENGINE),ruby)
|
|
42
41
|
endif
|
43
42
|
models += FiberSpawn
|
44
43
|
models += FiberPool
|
45
|
-
models += CoolioThreadPool
|
46
|
-
models += CoolioThreadSpawn
|
47
|
-
models += CoolioFiberSpawn
|
48
44
|
|
49
|
-
|
50
|
-
|
45
|
+
RUBY_LE_2_1 := $(shell $(RUBY) -e 'puts(RUBY_VERSION.to_f <= 2.1)')
|
46
|
+
ifeq ($(RUBY_LE_2_1), true)
|
47
|
+
models += Coolio
|
48
|
+
models += CoolioThreadPool
|
49
|
+
models += CoolioThreadSpawn
|
50
|
+
models += CoolioFiberSpawn
|
51
|
+
models += EventMachine
|
52
|
+
models += NeverBlock
|
53
|
+
endif
|
51
54
|
endif
|
52
55
|
endif
|
53
56
|
|
data/t/close-has-env.ru
CHANGED
data/t/test_isolate.rb
CHANGED
@@ -16,32 +16,34 @@ $stdout.reopen($stderr)
|
|
16
16
|
lock = File.open(__FILE__, "rb")
|
17
17
|
lock.flock(File::LOCK_EX)
|
18
18
|
Isolate.now!(opts) do
|
19
|
-
gem 'kgio', '2.
|
20
|
-
gem 'rack', '1.
|
21
|
-
gem 'kcar', '0.
|
19
|
+
gem 'kgio', '2.10.0'
|
20
|
+
gem 'rack', '1.6.4'
|
21
|
+
gem 'kcar', '0.5.0'
|
22
22
|
gem 'raindrops', '0.13.0'
|
23
|
-
gem 'unicorn', '4.
|
23
|
+
gem 'unicorn', '4.9.0'
|
24
24
|
|
25
25
|
if engine == "ruby"
|
26
|
-
gem 'sendfile', '1.2.
|
27
|
-
gem '
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
gem 'sendfile', '1.2.2'
|
27
|
+
gem 'eventmachine', '1.0.8'
|
28
|
+
gem 'async_sinatra', '1.2.0'
|
29
|
+
if RUBY_VERSION.to_f < 2.2
|
30
|
+
gem 'cool.io', '1.1.0'
|
31
|
+
gem 'neverblock', '0.1.6.2'
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
35
|
if defined?(::Fiber) && engine == "ruby"
|
36
|
-
|
37
|
-
|
36
|
+
if RUBY_VERSION.to_f < 2.2
|
37
|
+
gem 'revactor', '0.1.5'
|
38
|
+
gem 'rack-fiber_pool', '0.9.2' # depends on EM
|
39
|
+
end
|
38
40
|
end
|
39
41
|
|
40
42
|
if RUBY_PLATFORM =~ /linux/
|
41
|
-
gem 'sleepy_penguin', '3.
|
43
|
+
gem 'sleepy_penguin', '3.4.1'
|
42
44
|
|
43
45
|
# is 2.6.32 new enough?
|
44
|
-
gem 'io_splice', '4.
|
46
|
+
gem 'io_splice', '4.4.0' if `uname -r`.strip > '2.6.32'
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
data/vs_Unicorn
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
= \Rainbows! is like
|
1
|
+
= \Rainbows! is like unicorn, but Different...
|
2
2
|
|
3
|
-
While \Rainbows! depends on
|
3
|
+
While \Rainbows! depends on unicorn for its process/socket management,
|
4
4
|
HTTP parser and configuration language; \Rainbows! is more ambitious.
|
5
5
|
|
6
6
|
== Architectural Diagrams
|
7
7
|
|
8
|
-
===
|
8
|
+
=== unicorn uses a 1:1 mapping of processes to clients
|
9
9
|
|
10
10
|
unicorn master
|
11
11
|
\_ unicorn worker[0]
|
@@ -52,16 +52,16 @@ In both cases, workers share common listen sockets with the master and
|
|
52
52
|
pull connections off the listen queue only if the worker has resources
|
53
53
|
available.
|
54
54
|
|
55
|
-
== Differences from
|
55
|
+
== Differences from unicorn
|
56
56
|
|
57
|
-
* log rotation is handled immediately in \Rainbows! whereas
|
57
|
+
* log rotation is handled immediately in \Rainbows! whereas unicorn has
|
58
58
|
the luxury of delaying it until the current request is finished
|
59
59
|
processing to prevent log entries for one request to be split across
|
60
60
|
files.
|
61
61
|
|
62
62
|
* load balancing between workers is imperfect, certain worker processes
|
63
63
|
may be servicing more requests than others so it is important to not
|
64
|
-
set +worker_connections+ too high.
|
64
|
+
set +worker_connections+ too high. unicorn worker processes can never
|
65
65
|
be servicing more than one request at once.
|
66
66
|
|
67
67
|
* speculative, non-blocking accept() is not used, this is to help
|
@@ -72,10 +72,10 @@ available.
|
|
72
72
|
* Less heavily-tested and inherently more complex.
|
73
73
|
|
74
74
|
|
75
|
-
== Similarities with
|
75
|
+
== Similarities with unicorn
|
76
76
|
|
77
77
|
While some similarities are obvious (we depend on and subclass off
|
78
|
-
|
78
|
+
unicorn code), some things are not:
|
79
79
|
|
80
80
|
* Does not attempt to accept() connections when pre-configured limits
|
81
81
|
are hit (+worker_connections+). This will first help balance load
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rainbows
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rainbows! hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -67,29 +67,28 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.1'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: olddoc
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1.
|
75
|
+
version: '1.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1.
|
82
|
+
version: '1.0'
|
83
83
|
description: |-
|
84
84
|
\Rainbows! is an HTTP server for sleepy Rack applications. It is based on
|
85
|
-
|
85
|
+
unicorn, but designed to handle applications that expect long
|
86
86
|
request/response times and/or slow clients.
|
87
87
|
email: rainbows-public@bogomips.org
|
88
88
|
executables:
|
89
89
|
- rainbows
|
90
90
|
extensions: []
|
91
91
|
extra_rdoc_files:
|
92
|
-
- ChangeLog
|
93
92
|
- DEPLOY
|
94
93
|
- FAQ
|
95
94
|
- lib/rainbows.rb
|
@@ -127,6 +126,7 @@ extra_rdoc_files:
|
|
127
126
|
- LATEST
|
128
127
|
- LICENSE
|
129
128
|
- NEWS
|
129
|
+
- rainbows_1
|
130
130
|
- README
|
131
131
|
- SIGNALS
|
132
132
|
- TODO
|
@@ -141,13 +141,11 @@ files:
|
|
141
141
|
- ".document"
|
142
142
|
- ".gitignore"
|
143
143
|
- ".manifest"
|
144
|
-
- ".
|
144
|
+
- ".olddoc.yml"
|
145
145
|
- COPYING
|
146
|
-
- ChangeLog
|
147
146
|
- DEPLOY
|
148
147
|
- Documentation/.gitignore
|
149
148
|
- Documentation/GNUmakefile
|
150
|
-
- Documentation/comparison.css
|
151
149
|
- Documentation/comparison.haml
|
152
150
|
- Documentation/rainbows.1.txt
|
153
151
|
- FAQ
|
@@ -159,7 +157,6 @@ files:
|
|
159
157
|
- LICENSE
|
160
158
|
- NEWS
|
161
159
|
- README
|
162
|
-
- Rakefile
|
163
160
|
- SIGNALS
|
164
161
|
- Sandbox
|
165
162
|
- Static_Files
|
@@ -280,6 +277,7 @@ files:
|
|
280
277
|
- man/man1/rainbows.1
|
281
278
|
- pkg.mk
|
282
279
|
- rainbows.gemspec
|
280
|
+
- rainbows_1
|
283
281
|
- setup.rb
|
284
282
|
- t/.gitignore
|
285
283
|
- t/GNUmakefile
|
@@ -382,7 +380,6 @@ files:
|
|
382
380
|
- t/t0041-optional-pool-size.sh
|
383
381
|
- t/t0042-client_header_buffer_size.sh
|
384
382
|
- t/t0043-quit-keepalive-disconnect.sh
|
385
|
-
- t/t0044-autopush.sh
|
386
383
|
- t/t0045-client_max_header_size.sh
|
387
384
|
- t/t0050-response-body-close-has-env.sh
|
388
385
|
- t/t0100-rack-input-hammer-chunked.sh
|
@@ -429,15 +426,11 @@ files:
|
|
429
426
|
- vs_Unicorn
|
430
427
|
homepage: http://rainbows.bogomips.org/
|
431
428
|
licenses:
|
432
|
-
-
|
433
|
-
-
|
429
|
+
- GPL-2.0+
|
430
|
+
- Nonstandard
|
434
431
|
metadata: {}
|
435
432
|
post_install_message:
|
436
|
-
rdoc_options:
|
437
|
-
- "-t"
|
438
|
-
- Rainbows! - Unicorn for sleepy apps and slow clients
|
439
|
-
- "-W"
|
440
|
-
- http://bogomips.org/rainbows.git/tree/%s
|
433
|
+
rdoc_options: []
|
441
434
|
require_paths:
|
442
435
|
- lib
|
443
436
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -451,9 +444,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
451
444
|
- !ruby/object:Gem::Version
|
452
445
|
version: '0'
|
453
446
|
requirements: []
|
454
|
-
rubyforge_project:
|
455
|
-
rubygems_version: 2.
|
447
|
+
rubyforge_project:
|
448
|
+
rubygems_version: 2.5.0
|
456
449
|
signing_key:
|
457
450
|
specification_version: 4
|
458
|
-
summary: "-
|
451
|
+
summary: "- unicorn for sleepy apps and slow clients"
|
459
452
|
test_files: []
|
data/Rakefile
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
# -*- encoding: binary -*-
|
2
|
-
autoload :Gem, 'rubygems'
|
3
|
-
autoload :Tempfile, 'tempfile'
|
4
|
-
require 'wrongdoc'
|
5
|
-
|
6
|
-
cgit_url = Wrongdoc.config[:cgit_url]
|
7
|
-
git_url = Wrongdoc.config[:git_url]
|
8
|
-
|
9
|
-
desc "read news article from STDIN and post to rubyforge"
|
10
|
-
task :publish_news do
|
11
|
-
require 'rubyforge'
|
12
|
-
spec = Gem::Specification.load('rainbows.gemspec')
|
13
|
-
tmp = Tempfile.new('rf-news')
|
14
|
-
_, subject, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
|
15
|
-
tmp.puts subject
|
16
|
-
tmp.puts
|
17
|
-
tmp.puts spec.description.strip
|
18
|
-
tmp.puts ""
|
19
|
-
tmp.puts "* #{spec.homepage}"
|
20
|
-
tmp.puts "* #{spec.email}"
|
21
|
-
tmp.puts "* #{git_url}"
|
22
|
-
tmp.print "\nChanges:\n\n"
|
23
|
-
tmp.puts body
|
24
|
-
tmp.flush
|
25
|
-
system(ENV["VISUAL"], tmp.path) or abort "#{ENV["VISUAL"]} failed: #$?"
|
26
|
-
msg = File.readlines(tmp.path)
|
27
|
-
subject = msg.shift
|
28
|
-
blank = msg.shift
|
29
|
-
blank == "\n" or abort "no newline after subject!"
|
30
|
-
subject.strip!
|
31
|
-
body = msg.join("").strip!
|
32
|
-
|
33
|
-
rf = RubyForge.new.configure
|
34
|
-
rf.login
|
35
|
-
rf.post_news('rainbows', subject, body)
|
36
|
-
end
|
37
|
-
|
38
|
-
desc "post to FM"
|
39
|
-
task :fm_update do
|
40
|
-
require 'net/http'
|
41
|
-
require 'net/netrc'
|
42
|
-
require 'json'
|
43
|
-
version = ENV['VERSION'] or abort "VERSION= needed"
|
44
|
-
uri = URI.parse('https://freecode.com/projects/rainbows/releases.json')
|
45
|
-
rc = Net::Netrc.locate('rainbows-fm') or abort "~/.netrc not found"
|
46
|
-
api_token = rc.password
|
47
|
-
_, subject, body = `git cat-file tag v#{version}`.split(/\n\n/, 3)
|
48
|
-
tmp = Tempfile.new('fm-changelog')
|
49
|
-
tmp.puts subject
|
50
|
-
tmp.puts
|
51
|
-
tmp.puts body
|
52
|
-
tmp.flush
|
53
|
-
system(ENV["VISUAL"], tmp.path) or abort "#{ENV["VISUAL"]} failed: #$?"
|
54
|
-
changelog = File.read(tmp.path).strip
|
55
|
-
|
56
|
-
req = {
|
57
|
-
"auth_code" => api_token,
|
58
|
-
"release" => {
|
59
|
-
"tag_list" => "Stable",
|
60
|
-
"version" => version,
|
61
|
-
"changelog" => changelog,
|
62
|
-
},
|
63
|
-
}.to_json
|
64
|
-
if ! changelog.strip.empty? && version =~ %r{\A[\d\.]+\d+\z}
|
65
|
-
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
66
|
-
p http.post(uri.path, req, {'Content-Type'=>'application/json'})
|
67
|
-
end
|
68
|
-
else
|
69
|
-
warn "not updating freshmeat for v#{version}"
|
70
|
-
end
|
71
|
-
end
|
data/Test_Suite
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
= \Rainbows! test suite - YES OUR TEST SUITE IS CONCURRENT!
|
2
|
-
|
3
|
-
These are all integration tests that start the server on random, unused
|
4
|
-
TCP ports or Unix domain sockets. They're all designed to run
|
5
|
-
concurrently with other tests to minimize test time, but tests may be
|
6
|
-
run independently as well.
|
7
|
-
|
8
|
-
We write our tests primarily in Bourne shell because that's what we're
|
9
|
-
comfortable writing integration tests with. This test suite is also
|
10
|
-
easily portable to non-Ruby web servers.
|
11
|
-
|
12
|
-
== Requirements
|
13
|
-
|
14
|
-
* {Ruby 1.8 or 1.9}[http://www.ruby-lang.org/] (duh!)
|
15
|
-
* {isolate ~> 2.1.0}[http://github.com/jbarnette/isolate] - for dependencies
|
16
|
-
* {GNU make}[http://www.gnu.org/software/make/]
|
17
|
-
* {socat}[http://www.dest-unreach.org/socat/]
|
18
|
-
* {curl >= 7.18.0}[http://curl.haxx.se/]
|
19
|
-
* standard UNIX shell utilities (Bourne sh, awk, sed, grep, ...)
|
20
|
-
|
21
|
-
We do not use bashisms or any non-portable, non-POSIX constructs
|
22
|
-
in our shell code. We use the "pipefail" option if available and
|
23
|
-
mainly test with {ksh}[http://kornshell.com/], but occasionally
|
24
|
-
with {dash}[http://gondor.apana.org.au/~herbert/dash/] and
|
25
|
-
{bash}[http://www.gnu.org/software/bash/], too.
|
26
|
-
|
27
|
-
== Running Tests
|
28
|
-
|
29
|
-
*BSD users: use "gmake" instead of "make"
|
30
|
-
|
31
|
-
To run the entire test suite with 8 tests running at once:
|
32
|
-
|
33
|
-
make -j8
|
34
|
-
|
35
|
-
To run one individual test for all concurrency models:
|
36
|
-
|
37
|
-
make t0000-simple-http.sh
|
38
|
-
|
39
|
-
To run one individual test for one concurrency model:
|
40
|
-
|
41
|
-
make Revactor.t0000-simple-http.sh
|
42
|
-
|
43
|
-
To run all tests for one concurrency model:
|
44
|
-
|
45
|
-
make EventMachine
|
46
|
-
|
47
|
-
You may also increase verbosity by setting the "V" variable for
|
48
|
-
GNU make. To disable trapping of stdout/stderr:
|
49
|
-
|
50
|
-
make V=1
|
51
|
-
|
52
|
-
To enable the "set -x" option in shell scripts to trace execution
|
53
|
-
|
54
|
-
make V=2
|
55
|
-
|
56
|
-
== Performance
|
57
|
-
|
58
|
-
Some of the tests are rather I/O intensive due to the rewindability
|
59
|
-
requirement of "rack.input" in the Rack specification and the somewhat
|
60
|
-
complicated (but awesome!) nature of the TeeInput class leading us to
|
61
|
-
test it very heavily. If you have lots of RAM and a large tmpfs
|
62
|
-
partition, it is advisable to set your TMPDIR and also make the t/trash/
|
63
|
-
directory a symlink to a directory inside in your TMPDIR.
|
data/t/t0044-autopush.sh
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
#!/bin/sh
|
2
|
-
. ./test-lib.sh
|
3
|
-
STRACE=$(which strace 2>/dev/null || :)
|
4
|
-
if ! test -x "$STRACE"
|
5
|
-
then
|
6
|
-
t_info "strace not found, skipping $T"
|
7
|
-
exit 0
|
8
|
-
fi
|
9
|
-
if test x"$(uname -s)" != xLinux
|
10
|
-
then
|
11
|
-
t_info "Linux is the only supported OS for $T"
|
12
|
-
exit 0
|
13
|
-
fi
|
14
|
-
|
15
|
-
# these buffer internally in external libraries, so we can't detect when
|
16
|
-
# to use TCP_CORK
|
17
|
-
skip_models EventMachine NeverBlock
|
18
|
-
skip_models StreamResponseEpoll
|
19
|
-
skip_models Coolio CoolioThreadPool CoolioThreadSpawn
|
20
|
-
skip_models Revactor Rev RevThreadPool RevThreadSpawn
|
21
|
-
|
22
|
-
# not sure why, but we don't have time to care about Ruby 1.8 too much
|
23
|
-
case $RUBY_VERSION in
|
24
|
-
1.8.*) skip_models WriterThreadSpawn WriterThreadPool ;;
|
25
|
-
esac
|
26
|
-
|
27
|
-
t_plan 13 "Kgio autopush tests"
|
28
|
-
|
29
|
-
start_strace () {
|
30
|
-
# dbgcat strace_out
|
31
|
-
> $strace_out
|
32
|
-
sleep 1
|
33
|
-
strace -p $worker_pid -e '!futex' -f -o $strace_out &
|
34
|
-
strace_pid=$!
|
35
|
-
while ! test -s $strace_out; do sleep 1; done
|
36
|
-
}
|
37
|
-
|
38
|
-
check_TCP_CORK () {
|
39
|
-
nr=0
|
40
|
-
while test 2 -gt $(grep TCP_CORK $strace_out | count_lines)
|
41
|
-
do
|
42
|
-
nr=$(( $nr + 1 ))
|
43
|
-
if test $nr -gt 30
|
44
|
-
then
|
45
|
-
dbgcat strace_out
|
46
|
-
die "waited too long ($nr seconds) for TCP_CORK"
|
47
|
-
fi
|
48
|
-
sleep 1
|
49
|
-
done
|
50
|
-
|
51
|
-
test 2 -eq $(grep TCP_CORK $strace_out | count_lines)
|
52
|
-
fgrep 'SOL_TCP, TCP_CORK, [0],' $strace_out
|
53
|
-
fgrep 'SOL_TCP, TCP_CORK, [1],' $strace_out
|
54
|
-
}
|
55
|
-
|
56
|
-
t_begin "setup and start" && {
|
57
|
-
rainbows_setup $model 1 1
|
58
|
-
rtmpfiles strace_out
|
59
|
-
ed -s $unicorn_config <<EOF
|
60
|
-
,s/^listen.*/listen "$listen", :tcp_nodelay => true, :tcp_nopush => true/
|
61
|
-
w
|
62
|
-
EOF
|
63
|
-
rainbows -D large-file-response.ru -c $unicorn_config -E none
|
64
|
-
rainbows_wait_start
|
65
|
-
}
|
66
|
-
|
67
|
-
t_begin "read worker pid" && {
|
68
|
-
worker_pid=$(curl -sSf http://$listen/pid)
|
69
|
-
kill -0 $worker_pid
|
70
|
-
}
|
71
|
-
|
72
|
-
t_begin "start strace on worker" && start_strace
|
73
|
-
|
74
|
-
t_begin "reading RSS uncorks" && {
|
75
|
-
curl -sSf http://$listen/rss >/dev/null
|
76
|
-
}
|
77
|
-
|
78
|
-
t_begin "restart strace on worker" && {
|
79
|
-
kill $strace_pid
|
80
|
-
wait
|
81
|
-
start_strace
|
82
|
-
}
|
83
|
-
|
84
|
-
t_begin "reading static file uncorks" && {
|
85
|
-
curl -sSf http://$listen/random_blob >/dev/null
|
86
|
-
check_TCP_CORK
|
87
|
-
}
|
88
|
-
|
89
|
-
t_begin "stop strace on worker" && {
|
90
|
-
kill $strace_pid
|
91
|
-
wait
|
92
|
-
}
|
93
|
-
|
94
|
-
t_begin "enable sendfile" && {
|
95
|
-
echo >> $unicorn_config 'require "sendfile"'
|
96
|
-
kill -HUP $rainbows_pid
|
97
|
-
test xSTART = x"$(cat $fifo)"
|
98
|
-
}
|
99
|
-
|
100
|
-
t_begin "reread worker pid" && {
|
101
|
-
worker_pid=$(curl -sSf http://$listen/pid)
|
102
|
-
kill -0 $worker_pid
|
103
|
-
}
|
104
|
-
|
105
|
-
t_begin "restart strace on the worker" && start_strace
|
106
|
-
|
107
|
-
t_begin "HTTP/1.x GET on static file with sendfile uncorks" && {
|
108
|
-
curl -sSf http://$listen/random_blob >/dev/null
|
109
|
-
check_TCP_CORK
|
110
|
-
}
|
111
|
-
|
112
|
-
t_begin "killing succeeds" && {
|
113
|
-
kill $strace_pid
|
114
|
-
wait
|
115
|
-
# dbgcat strace_out
|
116
|
-
kill $rainbows_pid
|
117
|
-
}
|
118
|
-
|
119
|
-
t_begin "check stderr" && check_stderr
|
120
|
-
|
121
|
-
t_done
|