Date | Commit message (Collapse) |
|
Basic single-threaded EventMachine support is now included. It
supports async_synatra[1] via the "async.callback" Rack
environment[2]. For EventMachine, we rely on the updated
attach/watch API in EventMachine 0.12.10.
As Revactor 0.1.5 is now available, our Revactor support now
depends on it as it adds the ability to listen on UNIX domain
sockets.
For developers/QA folks, the integration tests are completely
revamped for easier maintenance when new concurrency models are
introduced and should also produce TAP-compliant output. The
test suite remains highly parallelizable using GNU make.
There are immediate plans to expand support for both Rev and
EventMachine to support use with threaded application dispatch.
Eric Wong (41):
rev: remove Revactor-specific workaround
README: change ordering of concurrency model listing
tests: more correct HTTP/0.9 test
test-lib: avoid stalling due to bad FIFO handling
rev: fix static file responses under HTTP/0.9
add news bodies to site NEWS.atom.xml
tests: avoid needlessly remaking "rainbows"
initial EventMachine support
tests: hopefully fix stalls in input trailer tests
tests: avoid race condition in reopen logs test
tests: prefer "RUBY" to lowercased "ruby"
tests: common setup and wait_start functions
tests: add a TAP producer shell library
tests: port all existing tests to TAP library
tests: remove symlinks and small files, use Make
t9000: bail if run with an unsupported/pointless model
tests: allow "make $model" to run tests for that model
rev: spell ECONNABORTED correctly
rev/evma: move common code for event models into ev_core
ev_core: do not drop deferred bodies on graceful quits
eventmachine: get basic tests working
rev: do not File.expand_path on result of body.to_path
eventmachine 0.12.8 passes all tests
tests: make large file memory tests more reliable
eventmachine: require EM 0.12.10
update gem dependencies in comments/local.mk.sample
rev: enforce Rev::VERSION >= 0.3.0
eventmachine: add async_sinatra support
tests: only load Revactor tests under 1.9.1
tests: gracefully exit if EventMachine is not available
tests: error out if socat + curl aren't reachable
thread*: fix MRI 1.8.6 compatibility
local.mk.sample: cleanups and minor reorg
eventmachine: remove unnecessary ivar assignment
eventmachine: document our support of "async_synatra"
doc: Update TODO and README
tests: generate all dependencies atomically
app_pool: update RDoc
test-lib: DWIM handling of temp UNIX sockets
revactor: require 0.1.5, remove 0.1.4 workarounds
gemspec: bump up Unicorn dep version to 0.93.4
[1] http://github.com/raggi/async_sinatra
[2] this is not 100% Rack::Lint compatible, but we'll let it
slide since there are already folks depending on
the async_sinatra gem
|
|
It's easier to support especially for Thread* models
which are affected by the BSD stdio weirdness 0.93.4
works around.
|
|
Also new are added basic HTTP tests for UNIX domain socket
handling (for all models, now, of course).
|
|
|
|
Now that we have EM support (which is basically like
Rev), update our docs for that. Also, expand on why
Revactor isn't supported just yet...
|
|
Using a "+" suffix alone was not enough protection since we use
evil recursive makes and can't share dependency info with parent
makes. While this could be done more efficiently (even with
recursive make), but it'd be harder to maintain. So we generate
the dependencies later to and sacrifice efficiency on the
initial run (but rarely/never again).
|
|
We have basic EventMachine and :async support.
|
|
ref: http://github.com/raggi/async_sinatra
|
|
It shouldn't be needed, really, favor simpler code
here until proven otherwise.
|
|
define the Ruby prefix once to make it easier on Rubies outside
of home. Organize gem listings logically by dependency chains.
|
|
Array#count is not available until MRI 1.8.7
|
|
This makes it easier to figure out why tests are failing
for people that forget to read t/README
|
|
|
|
Even though our tests do an extra check, it's faster to
not unnecessarily invoke the check in the first place.
|
|
This is should be compatible with how the Thin webserver
provides async callback support.
See http://github.com/raggi/async_sinatra for the details
|
|
We depend on the ability to create listeners from existing IO
objects here.
|
|
Rack 1.0.1 is out and works nicely.
|
|
The EM::attach/EM::watch API changed incompatibly
in 0.12.10
|
|
Use a bigger random_blob and run GC before checking RSS
|
|
This means Rainbows::DevFdBody async responses and large
file streaming without slurping.
This is only with eventmachine 0.12.8, it looks like 0.12.10
changes the attach/watch API...
|
|
Rack::Lint requires File::exist? to be true on this, so
there's no need to expand the path name to resolve it
here.
|
|
log reopens, graceful shutdown, HTTP error responses
should all be working now.
|
|
Graceful quit means we finish sending everything we have before
exiting. Additionally, only signal quits after we've queued
the error response up.
|
|
EventMachine and Rev models seem to be able to share a lot of
common code, so lets share. We may support Packet in the
future, too, and end up with a similar programming model there
as well.
|
|
Odd that Ruby didn't barf on this until now...
|
|
This makes it easier to filter functionality by model.
|
|
We'll probably make AppPool at least not break down and die in
the future, but for now just disable it if run directly.
|
|
This will make it easier to enable and manage tests for new
concurrency models.
|
|
Everything passes, and "set -e" prevents us from
making any stupid mistakes...
|
|
This will eventually allow our test output to be consumed by any
TAP[1]-compatible consumers. Like the rest of our shell scripts,
this only relies on POSIX behavior and has no bashisms.
mktemp(1) is a requirement only if using the verbose output in
this library.
This library aims to be useful outside of Rainbows!
[1]: Test Anything Protocol: http://testanything.org/
|
|
Instead of sleeping and waiting for a PID file to appear,
just use a named-pipe and block on it in the test scripts
since we know Unicorn won't attempt to fork until sockets
are already bound.
|
|
It's more common form for externally-visible/modifiable
variables in Makefiles and shell scripts.
|
|
Ensure our workers are capable of processing requests before we
can continue to setup signal handlers. The later "kill -USR1"
signal may fire in our test script before the workers have a
chance to setup the handlers. So by the time we receive a
positive response, we _know_ signal handlers are ready.
|
|
utee is line-oriented on _read_, so avoid messing with
that for this. Additionally, spawn our FIFO cats before
we start writing gobs of data out since it could cause
the writers to block otherwise.
|
|
Working for simple GET requests, completely untested otherwise
and most definitely not able to handle async/Comet-style
requests yet, either. No tests for this are enabled.
This could share a lot of code with the existing Rev model.
|
|
The cmp test was completely unnecessary and
pointless.
|
|
While we're at it, remove trailing whitespace for
author names, too.
|
|
Since HTTP/0.9 responses have no headers to write, the
on_write_complete handler we rely on never got triggered,
leading to additional reads to never get queued up.
Additionally, we need to explicitly detect and close client
sockets if we've written the last response body since HTTP/0.9
clients never know when it's time to close a connection.
|
|
Don't try to clobber FIFOs at startup since sometimes traps may
not fire. And while we're at it, avoid trying to unlink them
twice.
|
|
The extra CRLF is not needed for HTTP/0.9
|
|
Revactor was our first take on the "rainbows" branch of Unicorn
and probably less confusing to people that may have tracked that
branch. ThreadPool was used in the "gossamer" branch of Unicorn
before, but since this project is named Rainbows!, it's less
logical. I'll freely admit to having some personal bias here
and not being a fan of threads (and especially not pthreads!).
|
|
This was blindly copied and pasted from the Revactor code.
|
|
The major feature of this release is the new DeferredResponse
middleware for the Rev-based concurrency model. It should be
transparently compatible with non-Rev models, as well. As a
pleasant side effect, this change also allows large files to be
streamed to the client with Rev as the socket becomes writable
instead of slurping the entire file into an IO::Buffer first.
Bugfixes to graceful shutdowns support for all concurrency
models. The Rev-based model also gets a working heartbeat
mechanism (oops!) and fixed HTTP/1.1 pipelining support.
Eric Wong (37):
app_pool: note it being currently broken with Revactor
Revactor tests can sleep more easily
tests: sleep.ru handles "Expect: 100-continue"
Fix graceful shutdown handling of Thread* models harder
DRY setting of rack.multithread
test-lib: dbgcat adds headers with key name
use timeout correctly to join threads on SIGQUIT
Rev: simplification to error handling
tests: sleep.ru slurps rack.input stream
refactor graceful shutdowns again, harder
tests: introduce require_for_model function
tests: add unbuffered tee(1)-like helper
tests: rack.input trailer tests for all models
tests: fix issues with non-portable shell constructs
tests: fix random_blob dependency
tests: factor out a common parser error "library"
tests: DRY setting of the "model" environment var
tests: DRY Ruby requires based on model
test-lib: quiet down pipefail error message
tests: DRY require tests for Rev/Revactor
rev: handle fully-buffered, pipelined requests
rev: avoid stack overflow through pipelining
tests: common basic HTTP tests for all models
tests: rack.input hammer concurrency testing
tests: for log reopening for all concurrency models
http_response: filter out X-Rainbows-* headers
rev: fix heartbeat timeouts
revactor: switch to a 1 second heartbeat
rev: async response bodies with DevFdResponse middleware
tests: more reliable error checking
tests: DWIM FIFO creation
tests: predictable and simpler tempfile management
rev: AsyncResponse => DeferredResponse API cleanup
rev: update documentation for this model
TUNING: update documentation notes
TODO: update with new items
local.mk.sample: sync with BDFL's version
|
|
|
|
|
|
|
|
|
|
The "async" moniker wasn't appropriate since this API also
handles static files without slurping, so "deferred" is a more
appropriate term (even if I have trouble speling words with
double conssonants in them).
The DeferredResponse.write method now emulates the
HttpResponse.write method for consistency.
|
|
Instead of using completely random names, we'll use
predictable ones since we already depend on them for
exit codes and such. This drops our ability to run
the same test for the same version of Ruby in the
same working tree, but that's an unlikely scenario.
While we're at it, avoid remove tempfiles if a test
failed. This should make debugging easier.
|
|
If we're going to name a variable "fifo", it'll be for
descriptive reasons...
|