Date | Commit message (Collapse) |
|
This release syncs with unicorn 5 and drops some old compatibility
cruft from old releases. Performance should be roughly unchanged
for Ruby 2.2 users while older Rubies (1.9.3 - 2.1) will see
minor, probably unnoticeable performance regressions.
Compatibility:
* The horrible, proprietary (:P) "Status:" response header is
finally gone, saving at least 16 precious bytes in every HTTP
response. This should make it easier to write custom HTTP clients
which are compatible across all HTTP servers. It will hopefully
make migrating between different Rack servers easier for new
projects.
* Ruby 1.8 support removed. Ruby 1.9.3 is currently the earliest
supported version. However, expect minor, likely-unnoticeable
performance regressions if you use Ruby 2.1 or earlier. Going
forward, Rainbows! will favor the latest version (currently 2.2) of
the mainline Ruby implementation, potentially sacrificing
performance on older Rubies.
New features:
* sd_listen_fds(3) emulation added for systemd compatibility.
You may now stop using PID files and other process monitoring
software when using systemd.
* Newly-set TCP socket options are now applied to inherited sockets.
* Dynamic changes in the application to Rack::Utils::HTTP_STATUS
hash is now supported; allowing users to set custom status lines
in Rack to be reflected in unicorn. This feature causes a minor
performance regression, but is made up for Ruby 2.2 users with
other optimizations.
* The monotonic clock is used under Ruby 2.1+, making the
timeout feature immune to system clock changes.
As Rainbows! may be used anonymously without registration, the
project is committed to supporting anonymous and pseudonymous
help requests, contributions and feedback via plain-text mail to:
rainbows-public@bogomips.org
The mail submission port (587) is open to those behind firewalls
and allows access via Tor and anonymous remailers.
Archives are accessible via:
* http://bogomips.org/rainbows-public/
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
* nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general
and mirrored to various other places, so you do not even need
to use a valid address when posting.
18 changes since Rainbows! 4.7.0
README: remove Zbatery references
http_parser: handle keepalive_requests internally
kill the moronic Status: header
reflect changes in Rack::Utils::HTTP_STATUS_CODES
reduce constant lookup dependencies
http_parser: workaround hijack changes in unicorn 5
http_server: add master_pid attribute
stream_response_epoll: remove hijack_prepare call
bump to unicorn 5.0.1, use monotonic clock
add .gitattributes for Ruby method detection
response: avoid garbage string entirely
tiny bytecode reductions for cold paths
Ruby 1.9.3+-only cleanups
revactor: remove fcntl dependency
response: simplify regexp
t0105: fix test reliability
fix Rainbows.now definition for old Rubies
fix broken constant lookups in unmaintained bits
|
|
In case Revactor starts being maintained again...
(heck, it was probably the reason I started Rainbows! in the first
place...)
Our ReverseProxy stuff was never complete nor marketed;
and probably not worth keeping around at all.
|
|
Oops, blind substitution :x
|
|
It's possible curl will be sending to us and detect an error in the
send before it has a chance to read our (premature) 413 response.
Of course, we cannot afford to read an entire request when returning
a premature 413 response because we risk wasting bandwidth that way.
|
|
Redundant \z statements are ugly and wastes 4 bytes on x86-64
according to ObjectSpace.memsize_of
|
|
In the unlikely case somebody runs revactor, they won't need to
load the extra fcntl.so library into their process anymore.
In retrospect, we could've alway used IO#close_on_exec= since
it appeared in 1.9.1 and (IIRC) revactor always required 1.9.1+
|
|
unicorn 5 will only support Ruby 1.9.3 and later, so remove
some checks for Hash#compare_by_identity and IO.copy_stream
which we know exist in Ruby 1.9.
Favor &:sym proc dispatch to avoid unnecessary captures and
bytecode size increases, too.
Finally, ensure we fail fast by converting some literal
hashes to use non-arrow syntax for symbolic keys.
|
|
Less code in cold paths can improve speed for hot paths.
Single-byte strings for String#split is optimized in mainline Ruby,
so it's not actually a performance loss for sendfile_range in
response.rb
Regexps are at least 400 bytes each, so prefer non-Regexps
if possible, especially for cold sites where performance does
not matter.
|
|
Even with frozen string literals enabled in Ruby 2.3.0dev,
dstrings still create garbage as the optimizer is
not yet smart enough to optimize it despite the limited
choice of internals being known.
Maybe in the future Ruby will be smart enough, but not yet...
|
|
The "diff" function detection for C does not map well to
Ruby files, take advantage of gitattributes(5) to improve
method name detection in generated patches as well as
making "git diff -W" output more useful.
|
|
The timeout (mis)feature in unicorn uses the monotonic clock
if available. We must follow suit to avoid having our timeout
functionality completely broken.
|
|
unicorn 5.0.0 assumes Rack hijack is always available if
the application tries to use it, so the wrapper method
is removed.
|
|
We'll need this for unicorn 5, as they dropped this publically
accessible attribute while retaining the ivar. Eventually we
may not have to check this attribute at all, instead detecting
parent death via worker pipe.
|
|
unicorn lost the hijack_setup method in version 5,
so we must recreate it ourselves.
|
|
Unicorn 5 removes some constants we were using, and constant
lookups + inline caching are waste of time anyways on newer
Rubies with the opt_str_freeze bytecode instruction.
This may reduce performance for folks on older Rubies (probably
not noticeable); but improves performance for folks on newer
Rubies.
|
|
Applications may want to alter the message associated with HTTP
status codes in Rack::Utils::HTTP_STATUS_CODES. Avoid memoizing
status lines ahead-of-time
Note: this introduces a minor performance regression, but ought to
be unnoticeable unless you're running "Hello world"-type apps.
|
|
Whatever compatibility reasons which existed in 2009 likely do not exist
now. Other servers (e.g. thin, puma) seem to work alright without it,
so there's no reason to waste precious bytes.
|
|
unicorn 5 dropped support for this, essentially allowing unlimited
persistent connections if we used the parser as-is.
Since most of our concurrency models cannot handle infinite
persistent connections without being vulnerable to DoS,
we must support keepalive_requests like nginx does.
|
|
yahns runs as a single process just fine.
|
|
This release includes fixes for upcoming changes in Ruby 2.3.0
(due December 2015). Use of Rainbows! for new projects is not
recommended, try other servers instead.
* update dependencies for Ruby 2.2.0dev
* switch docs + website to olddoc
* gemspec: fix bad reference to rdoc_options
* README: reference yahns
* build: fix quoting issue with double parens
* response: avoid unnecessary args to IO.copy_stream
* t/close-has-env.ru: ensure close is idempotent
* sync_close: This fix breakage from Ruby-trunk r50118
* t/t0044-autopush.sh: remove test
* t/test_isolate.rb: updates for various gem versions
* response: convert source arg to path before IO.copy_stream
* speed up QUIT for users of the unicorn worker_loop
* gemspec: use SPDX-compatible license for GPL-2.0+
|
|
Current versions of RubyGems still complains about the '+'
is valid according to: http://spdx.org/licenses
|
|
WriterThreadPool, WriterThreadSpawn, Base, and potentially
other rarely-used concurrency options experienced slow shutdowns
due to the destruction of a listener socket failing to wake up
a thread in IO.select.
Send ourselves a signal to interrupt the IO.select call in
the main thread to force the wakeup.
|
|
This will allow us use the sendfile syscall under Linux on
Ruby which favor #read/#readpartial methods for non-IO objects.
This also allows us to revert changes made in
commit db790ff3531acdfa23ab290998bba29360a6782b
("sync_close: This fix breakage from Ruby-trunk r50118")
|
|
|
|
kgio no longer does anything with autopush, so this test is
broken. Autopush was overkill and badly done (MSG_MORE is
better on Linux, FreeBSD should copy it :P).
|
|
By providing read+readpartial methods
IO.copy_stream behaves slightly differently when operating on
non-IO-subclassed objects nowadays.
Ref:
> * io.c (copy_stream_body): use the arguments without conversion if
> having read, readpartial, and write methods, than conversion by
> to_path method. [ruby-core:68676] [Bug #11015]
|
|
Ruby 2.3.0 will have idempotent IO#close, so closing an IO
twice will be idempotent and not raise an IOError exception.
Ensure we do not rely on the IOError exception to catch
our own errors.
|
|
Not all responses are seekable, so do not attempt to pass seek
arguments to them since Ruby may attempt to seek (and fail!).
|
|
Apparently GNU make parses that strangely and mangles it for the
shell...
|
|
Because nobody has time to read about all the options Rainbows!
provides. yahns is basically XEpollThreadPool, with minor
improvements which weren't easily supportable with other
concurrency options.
|
|
olddoc does not need or use this
|
|
wrongdoc was difficult to maintain because of the tidy-ffi
dependency and the HTML5 changes in Darkfish could not be
handled well by Tidy.
olddoc is superior as it generates leaner HTML which loads faster,
requires less scrolling and less processing power to render.
Aesthetic comparisons are subjective of course but completely
unimportant compared to speed and accessibility.
The presence of images and CSS on the old (Darkfish-based) site
probably set unreasonable expectations as to my ability and
willingness to view such things. No more, the new website is
entirely simple HTML which renders well with even the wimpiest
browser (hell, olddoc even tries to generate readable raw HTML).
|
|
This will allow me to test for unintentional breakage in 2.2.0.
Part of the reason for putting this project on maintenance mode
is because many of the libraries we depend on have not kept up
with the latest changes to Ruby. So we will disable many tests
for 2.2+ to ensure the core parts remain working.
|
|
This release updates documentation to reflect the migration of the
mailing list to a new public-inbox[1] instance. This is necessary
due to the impending RubyForge shutdown on May 15, 2014.
The public-inbox address is: rainbows-public@bogomips.org
(no subscription required, plain text only)
ssoma[2] git archives: git://bogomips.org/rainbows-public
browser-friendly archives: http://bogomips.org/rainbows-public/
As evidenced by our git history, Rainbows! development has stagnated
over the years. Rainbows! was designed to be an unopinionated
exploration into various concurrency options offered in the Ruby
ecosystem.
In recent years, I have come to favor the one-shot-based,
worst-of-all-worlds design of yahns: http://yahns.yhbt.net/README
Without the exploration from Rainbows!, yahns may not exist today.
Disclaimer: Rainbows! has always been intolerant of buggy/broken code in
libraries and apps. yahns is even less tolerant of buggy/broken code,
as the SIGKILL-based timeout mechanism inherited unicorn is completely
gone. On the other hand, yahns has reasonable defaults so you do not
have to read documentation to configure it.
[1] policy: http://public-inbox.org/ - git://80x24.org/public-inbox
an "archives first" approach to mailing lists
[2] mechanism: http://ssoma.public-inbox.org/ - git://80x24.org/ssoma
some sort of mail archiver (using git)
|
|
We're migrating to a new public-inbox[1] + mailing list
rainbows-public@bogomips.org
[1] http://public-inbox.org/
|
|
|
|
In case anybody else wants to verify/check the archive or
use this for other projects, we'll document what we did here.
|
|
* event_machine: update for unicorn 4.8.x
* disable cramp tests for now
* update EventMachine tests
* set executable bit rainbows executable
Nothing relevant for non-EM users.
|
|
Folks don't usually run from the source directory, but
RubyGems complains otherwise.
|
|
EM 1.0.3 got released and seems to work under Ruby 2.1,
so re-enable EM and NeverBlock tests again.
|
|
Cramp seems broken for now, we'll deal with it at another time
and I'm not sure if it ever took off...
|
|
unicorn 4.8.x shutdown handling is different and no longer removes
items from the event loop. So we must do that ourselves to enable
graceful shutdown. Otherwise, we'll time out on shutdowns and
the master will forcibly kill us.
|
|
The unicorn 4.8.0 internal changes unfortunately broke some
unoffically supported behavior we depended on. This release fixes
that, but as a result, we lose compatibility of older unicorn
versions. (Oops!, oh well... :x)
There's also minor bugfixes and documentation updates.
In order to ease transitions to future versions of the GPL, we are
now "GPLv2 or later" instead of explicitly GPLv2 + GPLv3(-only).
The old Ruby 1.8 license remains an option. If the FSF turns out
a horrible GPLv4, users are free to continue using GPLv2 or GPLv3.
|
|
RubyForge is going away, so we must migrate the homepage.
The mailing list will be migrated, soon.
|
|
Internal reworking of unicorn 4.8.0 completely broke us(!).
This commit fixes things, but it means we no longer support
unicorn <= 4.7. Sorry about that.
|
|
There's nothing we can do about these errors due to
network failures and bad clients, either, so do not spew
a backtrace for them.
|
|
There is currently no GPLv4, so this change has no effect at the
moment.
In case the GPLv4 arrives and I am not alive to approve/review it,
the lesser of evils is have give blanket approval of all future GPL
versions (as published by the FSF). The worse evil is to be stuck
with a license which cannot guarantee the Free-ness of this project
in the future.
This unfortunately means the FSF can theoretically come out with
license terms I do not agree with, but the GPLv2 and GPLv3 will
always be an option to all users.
|
|
RAA is dead.
|
|
My curl 7.32.0 would actually print 400 Bad Request
Hope this would make it match against newer or older curl.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
This was documented in the unicorn docs, but not Rainbows!
(The major difference between unicorn and Rainbows! signal
handling is the deferred handling of SIGUSR1 in unicorn vs
the immediate handling in Rainbows!)
|