A bunch of small fixes related to startup/configuration and hot
reload issues with HUP:
* Variables in the user-generated config.ru files no longer
risk clobbering variables used in laucher scripts.
* signal handlers are initialized before the pid file is
dropped, so over-eager firing of init scripts won't
mysteriously nuke a process.
* SIGHUP will return app to original state if an updated
config.ru fails to load due to {Syntax,Load}Error.
* unicorn_rails should be Rails 3 compatible out-of-the-box
('unicorn' works as always, and is recommended for Rails 3)
* unicorn_rails is finally "working_directory"-aware when
generating default temporary paths and pid file
* config.ru encoding is the application's default in 1.9,
not forced to binary like many parts of Unicorn.
* configurator learned to handle the "user" directive outside
of after_fork hook (which will always remain supported).
There are also various internal cleanups and possible speedups.
This maintenance release is intended for users of Rainbows! and Zbatery servers (and anybody else using Unicorn::HttpParser). This memory leak DID NOT affect Unicorn itself: Unicorn always allocates the HttpParser once and always reuses it in every sequential request. This leak affects applications that repeatedly allocate a new HTTP parser. Thus this bug affects _all_ deployments of Rainbows! and Zbatery. These servers allocate a new parser for every client connection to serve clients concurrently. I misread the Data_Make_Struct()/Data_Wrap_Struct() documentation and ended up passing NULL as the "free" argument instead of -1, causing the memory to never be freed. From README.EXT in the MRI source which I misread: > The free argument is the function to free the pointer > allocation. If this is -1, the pointer will be just freed. > The functions mark and free will be called from garbage > collector.
This release includes small changes for things allowed by Rack
1.1. It is also now easier to detect if daemonized process
fails to start. Manpages received some minor updates as well.
Rack 1.1 allowed us to make the following environment changes:
* "rack.logger" is now set to the "logger" specified in
the Unicorn config file. This defaults to a Logger
instance pointing to $stderr.
* "rack.version" is now at [1,1]. Unicorn remains
compatible with previous Rack versions if your app
depends on it.
While only specified since Rack 1.1, Unicorn has always exposed
"rack.input" in binary mode (and has ridiculous integration
tests that go outside of Ruby to prove it!).
The HTTP parser now allows (but does not parse) the userinfo component in the very rare requests that send absoluteURIs. Thanks to Scott Chacon for reporting and submitting a test case for this fix. There are also minor documentation updates and tiny cleanups.
Small fixes to our HTTP parser to allows semicolons in PATH_INFO as allowed by RFC 2396, section 3.3. This is low impact for existing apps as semicolons are rarely seen in URIs. Our HTTP parser runs properly under Rubinius 0.13.0 and 1.0.0-rc1 again (though not yet the rest of the server since we rely heavily on signals). Another round of small documentation tweaks and minor cleanups.
Configuration files paths given on the command-line are no
longer expanded. This should make configuration reloads
possible when a non-absolute path is specified for --config-file
and Unicorn was deployed to a symlink directories (as with
Capistrano). Since deployments have always been strongly
encouraged to use absolute paths in the config file, this
change does not affect them.
This is our first gem release using gemcutter.
Eric Wong (3):
SIGNALS: HUP + preload_app cannot reload app code
Do not expand paths given on the shell
GNUmakefile: prep release process for gemcutter
Mostly internal cleanups and documentation updates. Irrelevant
stacktraces from client disconnects/errors while reading
"rack.input" are now cleared to avoid unnecessary noise. If
user switching in workers is used, ownership of logs is now
preserved when reopening worker logs (send USR1 only to the the
master in this case). The timeout config no longer affects long
after_fork hooks or application startups.
New features include the addition of the :umask option for the
"listen" config directive and error reporting for non-portable
socket options.
No ponies have ever been harmed in our development.
Eric Wong (28):
unicorn.1: document RACK_ENV changes in 0.94.0
HACKING: update with "gmake" in examples
don't nuke children for long after_fork and app loads
local.mk.sample: steal some updates from Rainbows!
Load Unicorn constants when building app
tee_input: fix RDoc argument definition for tee
Add FAQ
FAQ: fix links to Configurator docs
tee_input: better premature disconnect handling
tee_input: don't shadow struct members
raise Unicorn::ClientShutdown if client aborts in TeeInput
tee_input: fix comment from an intermediate commit
FAQ: additional notes on getting HTTPS redirects right
configurator: update RDoc and comments in examples
bump version to 0.95.0pre
configurator: listen :umask parameter for UNIX sockets
preserve user/group ownership when reopening logs
old_rails/static: avoid freezing strings
old_rails: autoload Static
const: no need to freeze HTTP_EXPECT
test_server: ensure stderr is written to before reading
tee_input: expand client error handling
replace "rescue => e" with "rescue Object => e"
socket_helper: do not hide errors when setting socket options
socket_helper: RDoc for constants
ClientShutdown: RDoc
Rakefile: add raa_update task
tee_input: client_error always raises
The HTTP parser is fix for oddly-aligned reads of trailers (this
technically affects headers, too, but is highly unlikely due to
our non-support of slow clients). This allows our HTTP parser
to better support very slow clients when used by other servers
(like Rainbows!). Fortunately this bug does not appear to lead
to any invalid memory accesses (and potential arbitrary code
execution).
FreeBSD (and possibly other *BSDs) support is improved and and
all the test cases pass under FreeBSD 7.2. Various flavors of
GNU/Linux remains our primary platform for development and
production.
New features added include the "working_directory" directive in
the configurator . Even without specifying a
"working_directory", symlink-aware detection of the current path
no longer depends on /bin/sh so it should work out-of-the-box on
FreeBSD and Solaris and not just systems where /bin/sh is dash,
ksh93 or bash.
User-switching support is finally supported but only intended
for use in the after_fork hook of worker processes. Putting it
in the after_fork hook allows allows users to set things like
CPU affinity[1] on a per-worker basis before dropping
privileges. The master process retains all privileges it
started with.
The ENV["RACK_ENV"] (process-wide) environment variable is now
both read and set for `unicorn' in the same way RAILS_ENV is
used by `unicorn_rails'. This allows the Merb launcher to read
ENV["RACK_ENV"] in config.ru. Other web servers already set
this and there may be applications or libraries that already
rely on this de facto standard.
Eric Wong (26):
cleanup: avoid redundant error checks for fstat
test_helper: connect(2) may fail with EINVAL
GNUmakefile: fix non-portable tar(1) usage
tests: provide a pure Ruby setsid(8) equivalent
more portable symlink awareness for START_CTX[:cwd]
test_signals: avoid portability issues with fchmod(2)
cleanup error handling and make it less noisy
Do not override Dir.chdir in config files
configurator: add "working_directory" directive
configurator: working_directory is expanded
configurator: set ENV["PWD"] with working_directory, too
configurator: working_directory affects pid, std{err,out}_paths
configurator: update documentation for working_directory
TODO: remove working_directory bit, done
Util.reopen_logs: remove needless Range
worker: user/group switching for after_fork hooks
Fix autoload of Etc in Worker for Ruby 1.9
bin/unicorn: allow RACK_ENV to be passed from parent
tests for RACK_ENV preservation
http: allow headers/trailers to be written byte-wise
http: extra test for bytewise chunked bodies
tee_input: do not clobber trailer buffer on partial uploads
test_exec: ensure master is killed after test
Util::tmpio returns a TmpIO that responds to #size
TODO: remove user-switching bit, done
unicorn 0.94.0
Wayne Larsen (1):
bin/unicorn: set ENV["RACK_ENV"] on startup
[1] - Unicorn does not support CPU affinity directly, but it is
possible to load code that allows it inside after_fork hooks,
or even just call sched_tool(8).
This release fixes a regression introduced in 0.93.3 where
timed-out worker processes run a chance of not being killed off
at all if they're hung. While it's not ever advisable to have
requests take a long time, we realize it's easy to fix
everything :)
Eric Wong (3):
TODO: remove --kill
fix reliability of timeout kills
TODO: update for next version (possibly 1.0-pre)
This release mainly works around BSD stdio compatibility issues
that affect at least FreeBSD and OS X. While this issues was
documented and fixed in [ruby-core:26300][1], no production
release of MRI 1.8 has it, and users typically upgrade MRI more
slowly than gems. This issue does NOT affect 1.9 users. Thanks
to Vadim Spivak for reporting and testing this issue and Andrey
Stikheev for the fix.
Additionally there are small documentation bits, one error
handling improvement, and one minor change that should improve
reliability of signal delivery.
Andrey Stikheev (1):
workaround FreeBSD/OSX IO bug for large uploads
Eric Wong (7):
DESIGN: address concerns about on-demand and thundering herd
README: alter reply conventions for the mailing list
configurator: stop testing for non-portable listens
KNOWN_ISSUES: document Rack gem issue w/Rails 2.3.2
stop continually resends signals during shutdowns
add news bodies to site NEWS.atom.xml
configurator: fix broken example in RDoc
Suraj N. Kurapati (1):
show configuration file path in errors instead of '(eval)'
[1] http://redmine.ruby-lang.org/issues/show/2267
This release fixes compatibility with OpenBSD (and possibly
other Unices with stricter fchmod(2) implementations) thanks to
Jeremy Evans. Additionally there are small documentation
changes all around.
Eric Wong (12):
doc: expand on the SELF_PIPE description
fchmod heartbeat flips between 0/1 for compatibility
examples/init.sh: remove "set -u"
configurator: update with nginx fail_timeout=0 example
PHILOSOPHY: clarify experience other deployments
PHILOSOPHY: plug the Rainbows! spin-off project
README: remove unnecessary and extraneous dash
DESIGN: clarification and possibly improve HTML validity
README: remove the "non-existent" part
README: emphasize the "fast clients"-only part
drop the whitespace cleaner for Ragel->C
unicorn 0.93.3
Avoid truncated POST bodies from with URL-encoded forms in Rails
by switching TeeInput to use read-in-full semantics (only) when
a Content-Length: header exists. Chunked request bodies
continue to exhibit readpartial semantics to support
simultaneous bidirectional chunking.
The lack of return value checking in Rails to protect against a
short ios.read(length) is entirely reasonable even if not
pedantically correct. Most ios.read(length) implementations
return the full amount requested except right before EOF.
Also there are some minor documentation improvements.
Eric Wong (8):
Fix NEWS generation on single-paragraph tag messages
Include GPLv2 in docs
doc: make it clear contributors retain copyrights
TODO: removed Rainbows! (see rainbows.rubyforge.org)
Document the START_CTX hash contents
more-compatible TeeInput#read for POSTs with Content-Length
tests for read-in-full vs readpartial semantics
unicorn 0.93.2
Fix permissions for release tarballs/gems, no other changes. Thanks to Jay Reitz for reporting this.
The one minor bugfix is only for Rails 2.3.x+ users who set the
RAILS_RELATIVE_URL_ROOT environment variable in a config file.
Users of the "--path" switch or those who set the environment
variable in the shell were unaffected by this bug. Note that we
still don't have relative URL root support for Rails < 2.3, and
are unlikely to bother with it unless there is visible demand
for it.
New features includes support for :tries and :delay when
specifying a "listen" in an after_fork hook. This was inspired
by Chris Wanstrath's example of binding per-worker listen
sockets in a loop while migrating (or upgrading) Unicorn.
Setting a negative value for :tries means we'll retry the listen
indefinitely until the socket becomes available.
So you can do something like this in an after_fork hook:
after_fork do |server, worker|
addr = "127.0.0.1:#{9293 + worker.nr}"
server.listen(addr, :tries => -1, :delay => 5)
end
There's also the usual round of added documentation, packaging
fixes, code cleanups, small fixes and minor performance
improvements that are viewable in the "git log" output.
Eric Wong (55):
build: hardcode the canonical git URL
build: manifest dropped manpages
build: smaller ChangeLog
doc/LATEST: remove trailing newline
http: don't force -fPIC if it can't be used
.gitignore on *.rbc files Rubinius generates
README/gemspec: a better description, hopefully
GNUmakefile: add missing .manifest dep on test installs
Add HACKING document
configurator: fix user switch example in RDoc
local.mk.sample: time and perms enforcement
unicorn_rails: show "RAILS_ENV" in help message
gemspec: compatibility with older Rubygems
Split out KNOWN_ISSUES document
KNOWN_ISSUES: add notes about the "isolate" gem
gemspec: fix test_files regexp match
gemspec: remove tests that fork from test_files
test_signals: ensure we can parse pids in response
GNUmakefile: cleanup test/manifest generation
util: remove APPEND_FLAGS constant
http_request: simplify and remove handle_body method
http_response: simplify and remove const dependencies
local.mk.sample: fix .js times
TUNING: notes about benchmarking a high :backlog
HttpServer#listen accepts :tries and :delay parameters
"make install" avoids installing multiple .so objects
Use Configurator#expand_addr in HttpServer#listen
configurator: move initialization stuff to #initialize
Remove "Z" constant for binary strings
cgi_wrapper: don't warn about stdoutput usage
cgi_wrapper: simplify status handling in response
cgi_wrapper: use Array#concat instead of +=
server: correctly unset reexec_pid on child death
configurator: update and modernize examples
configurator: add colons in front of listen() options
configurator: remove DEFAULT_LOGGER constant
gemspec: clarify commented-out licenses section
Add makefile targets for non-release installs
cleanup: use question mark op for 1-byte comparisons
RDoc for Unicorn::HttpServer::Worker
small cleanup to pid file handling + documentation
rails: RAILS_RELATIVE_URL_ROOT may be set in Unicorn config
unicorn_rails: undeprecate --path switch
manpages: document environment variables
README: remove reference to different versions
Avoid a small window when a pid file can be empty
configurator: update some migration examples
configurator: listen :delay must be Numeric
test: don't rely on .manifest for test install
SIGNALS: state that we stole semantics from nginx
const: DEFAULT_PORT as a string doesn't make sense
test_helper: unused_port rejects 8080 unconditionally
GNUmakefile: SINCE variable may be unset
tests: GIT-VERSION-GEN is a test install dependency
unicorn 0.93.0
Small fixes and documentation are the focus of this release.
James Golick reported and helped me track down a bug that caused
SIGHUP to drop the default listener (0.0.0.0:8080) if and only
if listeners were completely unspecified in both the
command-line and Unicorn config file. The Unicorn config file
remains the recommended option for specifying listeners as it
allows fine-tuning of the :backlog, :rcvbuf, :sndbuf,
:tcp_nopush, and :tcp_nodelay options.
There are some documentation (and resulting website)
improvements. setup.rb users will notice the new section 1
manpages for `unicorn` and `unicorn_rails`, Rubygems users
will have to install manpages manually or use the website.
The HTTP parser got a 3rd-party code review which resulted in
some cleanups and one insignificant bugfix as a result.
Additionally, the HTTP parser compiles, runs and passes unit
tests under Rubinius. The pure-Ruby parts still do not work yet
and we currently lack the resources/interest to pursue this
further but help will be gladly accepted.
The website now has an Atom feed for new release announcements.
Those unfamiliar with Atom or HTTP may finger unicorn@bogomips.org
for the latest announcements.
Eric Wong (53):
README: update with current version
http: cleanup and avoid potential signedness warning
http: clarify the setting of the actual header in the hash
http: switch to macros for bitflag handling
http: refactor keepalive tracking to functions
http: use explicit elses for readability
http: remove needless goto
http: extra assertion when advancing p manually
http: verbose assertions
http: NIL_P(var) instead of var == Qnil
http: rb_gc_mark already ignores immediates
http: ignore Host: continuation lines with absolute URIs
doc/SIGNALS: fix the no-longer-true bit about socket options
"encoding: binary" comments for all sources (1.9)
http_response: don't "rescue nil" for body.close
CONTRIBUTORS: fix capitalization for why
http: support Rubies without the OBJ_FROZEN macro
http: define OFFT2NUM macro on Rubies without it
http: no-op rb_str_modify() for Rubies without it
http: compile with -fPIC
http: use rb_str_{update,flush} if available
http: create a new string buffer on empty values
Update documentation for Rubinius support status
http: cleanup assertion for memoized header strings
http: add #endif comment labels where appropriate
Add .mailmap file for "git shortlog" and other tools
Update Manifest with mailmap
Fix comment about speculative accept()
SIGNALS: use "Unicorn" when referring to the web server
Add new Documentation section for manpages
test_exec: add extra tests for HUP and preload_app
socket_helper: (FreeBSD) don't freeze the accept filter constant
Avoid freezing objects that don't benefit from it
SIGHUP no longer drops lone, default listener
doc: generate ChangeLog and NEWS file for RDoc
Remove Echoe and roll our own packaging/release...
unicorn_rails: close parentheses in help message
launchers: deprecate ambiguous -P/--p* switches
man1/unicorn: avoid unnecessary emphasis
Add unicorn_rails(1) manpage
Documentation: don't force --rsyncable flag with gzip(1)
Simplify and standardize manpages build/install
GNUmakefile: package .tgz includes all generated files
doc: begin integration of HTML manpages into RDoc
Update TODO
html: add Atom feeds
doc: latest news is available through finger
NEWS.atom: file timestamp matches latest entry
pandoc needs the standalone switch for manpages
man1/unicorn: split out RACK ENVIRONMENT section
man1/unicorn_rails: fix unescaped underscore
NEWS.atom.xml only lists the first 10 entries
unicorn 0.92.0
HTTP/0.9 support, multiline header support, small fixes
18 years too late, Unicorn finally gets HTTP/0.9 support
as HTTP was implemented in 1991.
Eric Wong (16):
Documentation updates
examples/echo: "Expect:" value is case-insensitive
http: make strings independent before modification
http: support for multi-line HTTP headers
tee_input: fix rdoc
unicorn_http: "fix" const warning
http: extension-methods allow any tokens
http: support for simple HTTP/0.9 GET requests
test_http_parser_ng: fix failing HTTP/0.9 test case
launcher: defer daemonized redirects until config is read
test to ensure stderr goes *somewhere* when daemonized
http: SERVER_PROTOCOL matches HTTP_VERSION
http: add HttpParser#headers? method
Support HTTP/0.9 entity-body-only responses
Redirect files in binary mode
unicorn 0.91.0
switch chunking+trailer handling to Ragel, v0.8.4 fixes
Moved chunked decoding and trailer parsing over to C/Ragel.
Minor bug fixes, internal code cleanups, and API changes.
Eric Wong (55):
README: update version numbers for website
Update Rails tests to run on Rails 2.3.3.1
README: latest stable version is 0.8.4
unicorn_http: small cleanups and size reduction
Remove Ragel-generated file from version control
unicorn_http: remove typedef from http_parser
unicorn_http: update copyright
unicorn_http: change "global_" prefix to "g_"
unicorn_http: add helpful macros
extconf: SIZEOF_OFF_T should be a ruby.h macro
Refactoring unicorn_http C/Ragel code
http: find_common_field_value => find_common_field
http: split uncommon_field into a separate function
http: remove some redundant functions
http: "hp" denotes http_parser structs for consistency
http: small cleanup in "https" detection
http: minor cleanup of http_field handling
http: split out server params handling
http: move global initialization code
http: cleanup setting for common values => globals
http: remove noise functions
http: move non-Ruby-specific macros c_util.h
http: prepare http_parser struct for body processing
http: generic C string vs VALUEs comparison function
http: process Content-Length and Transfer-Encoding
http: preliminary chunk decoding
test_upload: extra CRLF is needed
Switch to Ragel/C-based chunk/trailer parser
http: unit tests for overflow and bad lengths
http: add test for invalid trailer
http: join repeated headers with a comma
test_util: explicitly close tempfiles for GC-safety
test_exec: wait for worker readiness
Documentation updates
test_signals: unlink log files of KILL-ed process
http: rename read_body to filter_body
http: add CONST_MEM_EQ macro
http: add "HttpParser#keepalive?" method
http: freeze fields when creating them, always
README: everybody loves Ruby DSLs
http_request: reinstate empty StringIO optimization
tee_input: make interface more usable outside of Unicorn
Drop the micro benchmarks
http: fix warning when sizeof(off_t) == sizeof(long long)
GNUmakefile: Fix "install" target
Fix documentation for Util.reopen_logs
http_response: pass through unknown status codes
const: remove unused constants
update TODO
http: support for "Connection: keep-alive"
TODO: remove keep-alive/pipelining
Make launchers __END__-aware
Remove explicit requires for Rack things
app/inetd: explicitly close pipe descriptors on CatBody#close
unicorn 0.90.0
pass through unknown HTTP status codes
This release allows graceful degradation in case a user is using a
status code not defined by Rack::Utils::HTTP_STATUS_CODES. A patch has
been submitted[1] upstream to Rack but this issue may still affect users
of yet-to-be-standardized status codes.
Eric Wong (2):
http_response: pass through unknown status codes
unicorn 0.8.4
[1] - http://rack.lighthouseapp.com/projects/22435-rack/tickets/70
Ruby 1.9.2 preview1 compatibility
This release mainly fixes compatibility issues the Ruby 1.9.2 preview1
release (and one existing 1.9.x issue). Note that Rails 2.3.2.1 does
NOT appear to work with Ruby 1.9.2 preview1, but that is outside the
scope of this project.
The 0.9.x series (including this release) is only recommended for
development/experimental use. This series is NOT recommended for
production use, use 0.8.x instead.
Eric Wong (10):
README: add Gmane newsgroup info
README: update about development/stable versions
Rename unicorn/http11 => unicorn_http
move all #gets logic to tee_input out of chunked_reader
http_request: don't support apps that close env["rack.input"]
HttpRequest: no need for a temporary variable
Remove core Tempfile dependency (1.9.2-preview1 compat)
fix tests to run correctly under 1.9.2preview1
app/exec_cgi: fix 1.9 compatibility
unicorn 0.9.2
Ruby 1.9.2 preview1 compatibility
This release fixes compatibility issues the Ruby 1.9.2 preview1
release (and one existing 1.9.x issue). Note that Rails 2.3.2.1
does NOT appear to work with Ruby 1.9.2 preview1, but that
is outside the scope of this project.
Eric Wong (4):
Remove core Tempfile dependency (1.9.2-preview1 compat)
fix tests to run correctly under 1.9.2preview1
app/exec_cgi: fix 1.9 compatibility
unicorn 0.8.3
socket handling bugfixes and usability tweaks
Socket handling bugfixes and socket-related usability and
performance tweaks. We no longer trust FD_CLOEXEC to be
inherited across accept(); thanks to Paul Sponagl for diagnosing
this issue on OSX. There are also minor tweaks backported from
0.9.0 to make non-graceful restarts/upgrades go more smoothly.
Eric Wong (6):
Unbind listeners as before stopping workers
Retry listen() on EADDRINUSE 5 times every 500ms
Re-add support for non-portable socket options
Minor cleanups to core
always set FD_CLOEXEC on sockets post-accept()
unicorn 0.8.2
FD_CLOEXEC portability fix (v0.8.2 port)
Minor cleanups, set FD_CLOEXEC on accepted listen sockets
instead of relying on the flag to be inherited across accept.
The 0.9.x series (including this release) is NOT recommended for
production use, try 0.8.x instead.
Eric Wong (10):
Avoid temporary array creation
Favor Struct members to instance variables
Minor cleanups to core
Unbind listeners as before stopping workers
Retry listen() on EADDRINUSE 5 times ever 500ms
Re-add support for non-portable socket options
Minor cleanups to core (cherry picked from commit ec70433f84664af0dff1336845ddd51f50a714a3)
always set FD_CLOEXEC on sockets post-accept()
unicorn 0.8.2
unicorn 0.9.1 (merge 0.8.2)
bodies: "Transfer-Encoding: chunked", rewindable streaming
We now have support for "Transfer-Encoding: chunked" bodies in
requests. Not only that, Rack applications reading input bodies
get that data streamed off to the client socket on an as-needed
basis. This allows the application to do things like upload
progress notification and even tunneling of arbitrary stream
protocols via bidirectional chunked encoding.
See Unicorn::App::Inetd and examples/git.ru (including the
comments) for an example of tunneling the git:// protocol over
HTTP.
This release also gives applications the ability to respond
positively to "Expect: 100-continue" headers before being rerun
without closing the socket connection. See Unicorn::App::Inetd
for an example of how this is used.
This release is NOT recommended for production use.
Eric Wong (43):
http_request: no need to reset the request
http_request: StringIO is binary for empty bodies (1.9)
http_request: fix typo for 1.9
Transfer-Encoding: chunked streaming input support
Unicorn::App::Inetd: reinventing Unix, poorly :)
README: update with mailing list info
local.mk.sample: publish_doc gzips all html, js, css
Put copyright text in new files, include GPL2 text
examples/cat-chunk-proxy: link to proposed curl(1) patch
Update TODO
Avoid duplicating the "Z" constant
Optimize body-less GET/HEAD requests (again)
tee_input: Don't expose the @rd object as a return value
exec_cgi: small cleanups
README: another note about older Sinatra
tee_input: avoid defining a @rd.size method
Make TeeInput easier to use
test_upload: add tests for chunked encoding
GNUmakefile: more stringent error checking in tests
test_upload: fix ECONNRESET with 1.9
GNUmakefile: allow TRACER= to be specified for tests
test_rails: workaround long-standing 1.9 bug
tee_input: avoid rereading fresh data
"Fix" tests that break with stream_input=false
inetd: fix broken constant references
configurator: provide stream_input (true|false) option
chunked_reader: simpler interface
http_request: force BUFFER to be Encoding::BINARY
ACK clients on "Expect: 100-continue" header
Only send "100 Continue" when no body has been sent
http_request: tighter Transfer-Encoding: "chunked" check
Add trailer_parser for parsing trailers
chunked_reader: Add test for chunk parse failure
TeeInput: use only one IO for tempfile
trailer_parser: set keys with "HTTP_" prefix
TrailerParser integration into ChunkedReader
Unbind listeners as before stopping workers
Retry listen() on EADDRINUSE 5 times ever 500ms
Re-add support for non-portable socket options
Move "Expect: 100-continue" handling to the app
tee_input: avoid ignoring initial body blob
Force streaming input onto apps by default
unicorn 0.9.0
safer timeout handling, more consistent reload behavior
This release features safer, more descriptive timeout handling, more
consistent reload behavior, and is a miniscule amount faster on
"Hello World" benchmarks
Eric Wong (7):
doc: cleanup summary/description
Fix potential race condition in timeout handling
SIGHUP reloads app even if preload_app is true
Make our HttpRequest object a global constant
Avoid instance variables lookups in a critical path
Consistent logger assignment for multiple objects
unicorn 0.8.1
enforce Rack dependency, minor performance improvements and fixes
The RubyGem now has a hard dependency on Rack. Minor performance
improvements and code cleanups. If RubyGems are in use, the Gem index
is refreshed when SIGHUP is issued.
Eric Wong (66):
test_request: enable with Ruby 1.9 now Rack 1.0.0 is out
Small cleanup
test_upload: still uncomfortable with 1.9 IO encoding...
Add example init script
app/exec_cgi: GC prevention
Add TUNING document
Make speculative accept() faster for the common case
app/old_rails: correctly log errors in output
http_request: avoid StringIO.new for GET/HEAD requests
http_response: luserspace buffering is barely faster
benchmark/*: updates for newer versions of Unicorn
http_request: switch to readpartial over sysread
No point in unsetting the O_NONBLOCK flag
Merge commit 'origin/benchmark'
Safer timeout handling and test case
Ignore unhandled master signals in the workers
TUNING: add a note about somaxconn with UNIX sockets
Remove redundant socket closing/checking
Instant shutdown signals really mean instant shutdown
test_signals: ready workers before connecting
Speed up the worker accept loop
Fix a warning about @pid being uninitialized
Inline and remove the HttpRequest#reset method
Preserve 1.9 IO encodings in reopen_logs
configurator: fix rdoc formatting
http_request: use Rack::InputWrapper-compatible methods
app/exec_cgi: use explicit buffers for read/sysread
Enforce minimum timeout at 3 seconds
Avoid killing sleeping workers
Remove trickletest
HttpRequest::DEF_PARAMS => HttpRequest::DEFAULTS
exec_cgi: don't assume the body#each consumer is a socket
Reopen master logs on SIGHUP, too
Require Rack for HTTP Status codes
http_response: allow string status codes
test_response: correct OFS test
privatize constants only used by old_rails/static
Disable formatting for command-line switches
GNUmakefile: glob all files in bin/*
test_request: enable with Ruby 1.9 now Rack 1.0.0 is out
test_upload: still uncomfortable with 1.9 IO encoding...
Add example init script
app/exec_cgi: GC prevention
Add TUNING document
app/old_rails: correctly log errors in output
Safer timeout handling and test case
Ignore unhandled master signals in the workers
TUNING: add a note about somaxconn with UNIX sockets
Fix a warning about @pid being uninitialized
Preserve 1.9 IO encodings in reopen_logs
configurator: fix rdoc formatting
Enforce minimum timeout at 3 seconds
http_response: allow string status codes
test_response: correct OFS test
Disable formatting for command-line switches
GNUmakefile: glob all files in bin/*
Merge branch '0.7.x-stable'
Define HttpRequest#reset if missing
Merge branch 'benchmark'
unicorn 0.7.1
Merge commit 'v0.7.1'
Refresh Gem list when building the app
Only refresh the gem list when building the app
Switch to autoload to defer requires
remove trickletest from Manifest
unicorn 0.8.0
minor fixes, cleanups and documentation improvements
Eric Wong (18):
test_request: enable with Ruby 1.9 now Rack 1.0.0 is out
test_upload: still uncomfortable with 1.9 IO encoding...
Add example init script
app/exec_cgi: GC prevention
Add TUNING document
app/old_rails: correctly log errors in output
Safer timeout handling and test case
Ignore unhandled master signals in the workers
TUNING: add a note about somaxconn with UNIX sockets
Fix a warning about @pid being uninitialized
Preserve 1.9 IO encodings in reopen_logs
configurator: fix rdoc formatting
Enforce minimum timeout at 3 seconds
http_response: allow string status codes
test_response: correct OFS test
Disable formatting for command-line switches
GNUmakefile: glob all files in bin/*
unicorn 0.7.1
rack.version is 1.0
Rack 1.0.0 compatibility, applications are now passed
env["rack.version"] == [1, 0]
Eric Wong (5):
doc: formatting changes for SIGNALS doc
configurator: "listen" directive more nginx-like
Fix log rotation being delayed in workers when idle
Rack 1.0.0 compatibility
unicorn 0.7.0
cleanups + optimizations, signals to {in,de}crement processes
* Mostly OCD-induced yak-shaving changes
* SIGTTIN and SIGTTOU are now used to control incrementing and
decrementing of worker processes without needing to change
the config file and SIGHUP.
Eric Wong (46):
test_upload: ensure StringIO objects are binary
http11: cleanup #includes and whitespace
GNUmakefile: Fix ragel dependencies
GNUmakefile: kill trailing whitespace after ragel
Move absolute URI parsing into HTTP parser
http11: remove unused variables/elements
http_request: freeze modifiable elements
HttpParser: set QUERY_STRING for Rack-compliance
GNUmakefile: mark test_signals as a slow test
const: remove unused QUERY_STRING constant
http11: formatting cleanups
http11: remove callbacks from structure
replace DATA_GET macro with a function
http11: minor cleanups in return types
http11: make parser obey HTTP_HOST with empty port
http11: cleanup some CPP macros
http11: rfc2616 handling of absolute URIs
http_response: small speedup by eliminating loop
Stop extending core classes
rename socket.rb => socket_helper.rb
Remove @start_ctx instance variable
http11: support underscores in URI hostnames
test: empty port test for absolute URIs
Cleanup some unnecessary requires
Cleanup GNUmakefile and fix dependencies
Fix data corruption with small uploads via browsers
Get rid of UNICORN_TMP_BASE constant
GNUmakefile: mark test_upload as a slow test
unicorn_rails: avoid nesting lambdas
test_exec: cleanup stale socket on exit
Merge commit 'v0.5.4'
http_request: micro optimizations
IO_PURGATORY should be a global constant
Make LISTENERS and WORKERS global constants, too
test_socket_helper: disable GC for this test
http_response: just barely faster
http_response: minor performance gains
make SELF_PIPE is a global constant
Describe the global constants we use.
Fixup reference to a dead variable
Avoid getppid() if serving heavy traffic
minor cleanups and save a few variables
Allow std{err,out}_path to be changed via HUP
SIGTT{IN,OU} {in,de}crements worker_processes
cleanup: avoid duped self-pipe init/replacement logic
unicorn 0.6.0
fix data corruption with some small uploads (not curl)
Eric Wong (2):
Fix data corruption with small uploads via browsers
unicorn 0.5.4
fix 100% CPU usage when idle, small cleanups
fix 100% CPU usage when idle
Eric Wong (7):
update Manifest (add test_signals.rb)
Fix forgotten Rails tests
Fix my local.mk file to always run Rails tests
fix 100% CPU usage when idle
remove DATE constant
Small garbage reduction in HttpResponse
unicorn 0.5.3
force Status: header for compat, small cleanups
* Ensure responses always have the "Status:" header. This
is needed for compatibility with some broken clients.
* Other small and minor cleanups
Eric Wong (10):
Explicitly trap SIGINT/SIGTERM again
s/rotating/reopening/g in log messages
before_commit and before_exec can never be nil/false
worker_loop cleanups, var golf, and yak-shaving
http11: default server port is 443 for https
ensure responses always have the "Status:" header
test: fix dependency issue with "make test-unit"
GNUmakefile: small dependency cleanups
unicorn/const: kill trailing whitespace
unicorn 0.5.2
exit correctly on INT/TERM, QUIT is still recommended, however
We now exit correctly on INT/TERM signals, QUIT is still
recommended as it does graceful shutdowns.
Eric Wong (2):
Fix SIGINT/SIGTERM handling (broken in 0.5.0)
unicorn 0.5.1
{after,before}_fork API change, small tweaks/fixes
* There is an API change in the {after,before}_fork hooks
so now the entire Worker struct is exposed to the user.
This allows Unicorn to unofficially support user/group
privilege changing.
* The "X-Forwarded-Proto:" header can be set by proxies
to ensure rack.url_scheme is "https" for SSL-enabled
sites.
* Small cleanups and tweaks throughout, see shortlog (below)
or changelog for details.
Eric Wong (32):
test_helper: redirect_io uses append and sync
configurator: allow hooks to be passed callable objects
Add a test for signal recovery
Documentation updates
Enforce umask 0000 with UNIX domain sockets
local.mk: touch files after set-file-times
Add test for :preload_app config option
GNUmakefile: remove unnecessary asterisks in output
GNUmakefile: allow "make V=1 ..." for verbosity
test_configurator: rename test name that never ran
cleanup some log messages
test_request: tests esoteric/rare REQUEST_URIs
http11: Remove qsort/bsearch code paths
http11: handle "X-Forwarded-Proto: https"
close listeners when removing them from our array
config: handle listener unbind/replace in config file
README: doc updates
Restore unlinked UNIX sockets on SIGHUP
listen backlog, sndbuf, rcvbuf are always changeable
Remove _all_ non-POSIX socket options
http11: cleanup+safer rack.url_scheme handling
test_exec: fix potential races in fd leak test
test_http_parser: fix broken URL in comment
Save one fcntl() syscall on every request
Remove unnecessary sync assignment
Don't bother restoring ENV or umask across reexec
old_rails: try harder to ensure valid responses
small cleanups in signal handling and worker init
Remove unnecessary local variables in process_client
Expose worker to {before,after}_fork hooks
Configurator: add example for user/group switching
unicorn 0.5.0
fix Rails ARStore, FD leak prevention, descriptive proctitles
Eric Wong (16):
Manifest: updates
Merge unicorn
test_exec: add test case for per-worker listeners
Remove set_cloexec wrapper and require FD_CLOEXEC
All IOs created in workers have FD_CLOEXEC set
FD_CLOEXEC all non-listen descriptors before exec
Close std{err,out} redirection targets
test_upload: fix a race condition in unlink test
More descriptive process titles
unicorn_rails: cleanup redundant bits
test/rails: v2.1.2 + ActiveRecordStore all around
Use File.basename instead of a regexp
Add log directories to tests
unicorn: remove unnecessary lambda generation
GNUmakefile: "install" preserves unicorn_rails
unicorn 0.4.2
Rails support, per-listener backlog and {snd,rcv}buf
Eric Wong (50):
All new benchmarks, old ones removed
benchmark: header values must be strings
Merge commit 'origin/benchmark' into release
HttpResponse: speed up non-multivalue headers
Streamline rack environment generation
Don't bother unlinking UNIX sockets
unicorn_rails: support non-Rack versions of Rails
HttpRequest: small improvement for GET requests
simplify the HttpParser interface
Socket: add {snd,rcv}buf opts to bind_listen
Merge commit 'v0.2.3'
Don't allow failed log rotation to to break app
Deferred log rotation in workers
style: symbols instead of strings for signal names
No need to disable luserspace buffering on client socket
test_server: quieter tests
Remove needless line break
Always try to send a valid HTTP response back
test_response: ensure closed socket after write
test_response: ensure response body is closed
TODO: update roadmap to 1.0.0
configurator: per-listener backlog, {rcv,snd}buf config
configurator: favor "listen" directive over "listeners"
http11: use :http_body instead of "HTTP_BODY"
Avoid having two pid files pointing to the same pid
test_exec: fix race conditions
test_exec: fix response bodies
Fix default listener setup
test_exec: fix another race condition
bin/*: parse CLI switches in config.ru sooner
app/old_rails/static: define missing constant
unicorn_rails: give more info when aborting
GNUmakefile: add test-exec and test-unit targets
cgi_wrapper: ensure "Status:" header is not set
Better canonicalization of listener paths + tests
configurator: remove unnecessary SocketHelper include
unicorn_rails: minor cleanup for dead variable
Use {read,write}_nonblock on the pipe
unicorn_rails: cleanup path mapping usage
Rails stack tests for unicorn_rails
test: factor out exec helpers into common code for Rails tests
cgi_wrapper: fix cookies and other headers
GNUmakefile: prefix errors with $(extra) variable
cgi_wrapper: HTTP status code cleanups
Add more tests for Rails
test_rails: 4x speedup
Manifest update
Documentation updates, prep for 0.4.1 release
Add local.mk.sample file that I use
unicorn 0.4.1
Unlink Tempfiles after use (they were closed, just not unlinked)
Eric Wong (3):
Don't bother unlinking UNIX sockets
Ensure Tempfiles are unlinked after every request
unicorn 0.2.3
small bug fixes, fix Rack multi-value headers (Set-Cookie:)
Eric Wong (19):
Fix link to Rubyforge releases page
start libifying common launcher code
unicorn_rails: fix standard pid path setup
Move listen path and address expansion to Configurator
Trap WINCH to QUIT children without respawning
Remove Mongrel stuff from CHANGELOG
HttpResponse: close body if it can close
Add Unicorn::App::ExecCgi
Process management cleanups
documentation/disclaimer updates
unicorn_rails: remove unnecessary Rack-loading logic
unicorn/http11: remove GATEWAY_INTERFACE
http11: don't set headers Rack doesn't like
HttpRequest test so our requests pass Rack::Lint
HttpRequest: correctly reference logger
Rotate master logs before workers.
Simplify code for sleeping/waking up the master
Handle Rack multivalue headers correctly
unicorn 0.2.2
Fix broken Manifest that cause unicorn_rails to not be bundled
Eric Wong (1):
unicorn v0.2.1, fix the Manifest
unicorn_rails launcher script.
Eric Wong (8):
Start _Known Issues_ section in README
Allow binding to UNIX sockets relative to "~"
tests: do not trust (our correct use of) 1.9 encodings
gracefully die if working dir is invalid at fork
Add signal queueing for test reliability
Add unicorn_rails script for Rails 2.3.2
Documentation updates, prepare for 0.2.0
unicorn 0.2.0
Unicorn - UNIX-only fork of Mongrel free of threading initial
Generated with the Darkfish Rdoc Generator 1.1.6.