about summary refs log tree commit homepage
DateCommit message (Collapse)
2015-02-04http: standalone require + reduction in binary size
This allows requiring just the C extension part of "unicorn_http", without requiring the rest of unicorn, allowing other HTTP servers using the same parser to be slimmer. On my x86-64 Debian 7.0 system: text data bss dec hex filename 44026 1976 488 46490 b59a lib/unicorn_http.so 43930 1976 456 46362 b51a lib/unicorn_http.so
2015-02-04remove old inetd+git examples and exec_cgi
While it was technically interesting and fun to tunnel arbitrary protocols over a semi-compliant Rack interface, nobody actually does it (and anybody who does can look in our git history). This was from back in 2009 when this was one of the few servers that could handle chunked uploads,were one of the few users of chunked uploads, nowadays everyone does it! (or do they? :) A newer version of exec_cgi.rb still lives on in the repository of yet another horribly-named server, but there's no point in bloating the installation footprint of somewhat popular server such as unicorn.
2015-01-28http: -Wshorten-64-to-32 warnings on clang
Tested on x86_64, clang version 3.5-1ubuntu1 (trunk) (LLVM 3.5) These warnings were introduced on commit 4b2782a926d8f131b1e7382be35e3abb77bf4be5 ("http: reduce parser from 72 to 56 bytes on 64-bit") and did not affect any releases. These length checks should not be necessary in reality because HTTP header sizes never come close to 4GB in size. Fixup a minor coding style (inherited from Mongrel) violation while we're at it (tabs => spaces).
2015-01-18use the monotonic clock under Ruby 2.1+
The monotonic clock is immune to time adjustments so it is not thrown off by misconfigured clocks. Process.clock_gettime also generates less garbage on 64-bit systems due to the use of Flonum.
2015-01-17gemspec: fixup olddoc migration
rdoc_options is no longer necesary with olddoc as olddoc can infer document titles and only generates cgit-compatible URLs to source code.
2015-01-10README: clarify/reduce references to unicorn_rails
unicorn_rails is an ancient compatibility wrapper for ancient versions of Rails which did not use Rack. Those applications have likely moved on, so stop promoting unicorn_rails.
2015-01-10switch docs + website to olddoc
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.
2014-12-28tmpio: drop the "size" method
It is redundant given the existence of File#size in Ruby 1.9+ This saves 1440 bytes of bytecode on x86-64 under 2.2.0, and at least another 120 bytes for the method entry, hash table entry, and method definition overhead.
2014-12-21remove SSL support
We implemented barely-advertised support for SSL for two reasons: 1) to detect corruption on LANs beyond what TCP offers 2) to support other servers based on unicorn (never happened) Since this feature is largely not useful for unicorn itself, there's no reason to penalize unicorn 5.x users with bloat. In our defense, SSL support appeared in version 4.2.0 :)
2014-12-21t/t0002-parser-error.sh: relax test for rack 1.6.0
This overly zealous test was broken by: rack commit be28c6a2ac152fe4adfbef71f3db9f4200df89e8 ("update HTTP status codes to IETF RFC 7231")
2014-11-27http_server: save 450+ bytes of memory on x86-64
Replacing the Regexp argument to a rarely-called String#split with a literal String can save a little memory. The removed Regexp memsize is 469 bytes on Ruby 2.1: ObjectSpace.memsize_of(/,/) => 469 Is slightly smaller at 453 bytes on 2.2.0dev (r48474). These numbers do not include the 40-byte object overhead. Nevertheless, this is a waste for non-performance-critical code during the socket inheritance phase. A literal string has less overhead at 88 bytes: * 48 bytes for table entry in the frozen string table * 40 bytes for the object itself The downside of using a literal string for the String#split argument is a 40-byte string object gets allocated on every call, but this piece of code is only called once in a process lifetime.
2014-11-01worker: remove old tmp accessor
This has not been used since unicorn 4.0.0 over three years ago. This is an incompatible change, but hopefully nobody uses this in before_fork/after_fork hooks anywhere.
2014-10-04examples: add run_once to before_fork hook example
There may be code in a before_fork hook which should run only once, document an example using a guard variable since it may not be immediately obvious to all users. Inspired-by: BrĂ¡ulio Bhavamitra <braulio@eita.org.br> http://bogomips.org/unicorn-public/m/20141004015707.GA1951@dcvr.yhbt.net.html
2014-09-17http: reduce parser from 72 to 56 bytes on 64-bit
This allows the parser struct to fit in one cache line on x86-64 systems where cache lines are 64 bytes. Using 32-bit integer lengths is safe here because these are only for tracking offsets within the HTTP header buffer. We can safely limit HTTP headers and in-memory buffers to be less than 4GB without anybody complaining. HTTP bodies continue to use off_t (usually 64-bit, even on 32-bit systems) sizes and support as much as the OS/hardware can handle.
2014-08-18http: remove the keepalive requests limit
This was a hack for some event loops such as those found in nginx and some Rainbows! concurrency models. Using epoll/kqueue with one-shot notification (which yahns does) avoids all fairness problems.
2014-08-18remove mongrel.rubyforge.org references
mongrel.rubyforge.org has been dead longer than rubyforge.org!
2014-08-17remove RubyForge and Freecode references
Both sites are gone.
2014-08-17http_response: remove Status: header
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.
2014-08-17unicorn.gemspec: depend on test-unit 3.0
test-unit 3 and minitest 5 will have equal support status as a bundled gems when Ruby 2.2.0 is released in December 2014. These bundled gems will appear in the user-oriented tarball installations, but do not get installed by "make install" when installing Ruby from SVN or git. test-unit appears to be actively maintained and good at keeping backwards compatibility even on a major version change, so this means no code changes on our end. I am not convinced switching to minitest is worth the effort. Cc: Ken Dreyer <ktdreyer@ktdreyer.com>
2014-08-17dev: remove isolate dependency
It seems unnecessary with current versions of RubyGems supporting development dependencies.
2014-07-03FAQ: add entry for Rails autoflush_log
Thanks to Cedric Maion for bringing this up on the mailing list: http://bogomips.org/unicorn-public/m/20140703144048.GA6674@cedric-maion.com
2014-05-29http: remove xftrust options
This has long been considered a mistake and not documented for very long. I considered removing X-Forwarded-Proto and X-Forwarded-SSL handling, too, so rack.url_scheme is always "http", but that might lead to compatibility issues in rare apps if Rack::Request#scheme is not used.
2014-05-29GIT-VERSION-GEN: start 5.0.0 development
Incompatible changes ahead!
2014-05-08ISSUES: update with mailing list subscription
mlmmj seems quite usable and maintainable, so we'll run it.
2014-05-07unicorn 4.8.3 - the end of an era v4.8.3
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: unicorn-public@bogomips.org (no subscription required, plain text only) ssoma[2] git archives: git://bogomips.org/unicorn-public browser-friendly archives: http://bogomips.org/unicorn-public/ Using, getting help for, and contributing to unicorn will never require any of the following: 1) non-Free software (including SaaS) 2) registration or sign-in of any kind 3) a real identity (we accept mail from Mixmaster) 4) a graphical user interface Nowadays, plain-text email is the only ubiquitous platform which meets all our requirements for communication. There is also one small bugfix to handle premature grandparent death upon initial startup. Most users are unaffected. [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)
2014-05-06swap out most of the rubyforge.org links
Update the old mailing list info with our new public-inbox info. The old mongrel.rubyforge.org links have been dead for years, oh well. There's only a few days left of RubyForge left...
2014-05-04http_server: handle premature grandparent death
When daemonizing, it is possible for the grandparent to be terminated by another process before the master can notify it. Do not abort the master in this case. This may fix the following issue: https://github.com/kostya/eye/issues/49 (which I was notified of privately via email)
2014-04-21add slrnpull.conf example for gmane archives
In case anybody else wants to verify/check the archive or use this for other projects, we'll document what we did here.
2014-04-02oob_gc: link to Discourse OobGC for Ruby 2.0 users
Thanks to Sam Saffron for the heads up.
2014-03-29oobgc: link to Aman's gctools for Ruby 2.1+
I've never liked OobGC, so "hot potato!" :)
2014-02-19script/isolate_for_tests: bump to latest versions
kgio and raindrops were both updated for Ruby 2.2.0dev r44955 and later, so depend on them in our tests.
2014-02-19remove SSL tests
This feature is on hold for now, since it never really took off and kgio-monkey is more-or-less abandoned. I'm not looking forward to supporting OpenSSL unless there's interest. This was mainly intended as an experiment to deal with a bad hardware/firmware situation on a LAN I have. It allowed SSL to abort on corrupt packets.
2014-02-05unicorn 4.8.2 - avoid race condition during worker startup v4.8.2
We close SELF_PIPE in the worker immediately, but signal handlers do not get setup immediately. So prevent workers from erroring out due to invalid SELF_PIPE.
2014-02-01avoid race condition during worker startup
We close SELF_PIPE in the worker immediately, but signal handlers do not get setup immediately. So prevent workers from erroring out due to invalid SELF_PIPE.
2014-01-29unicorn 4.8.1 v4.8.1
fix races/error handling in worker SIGQUIT handler This protects us from two problems: 1) we (or our app) somehow called IO#close on one of the sockets we listen on without removing it from the readers array. We'll ignore IOErrors from IO#close and assume we wanted to close it. 2) our SIGQUIT handler is interrupted by itself. This can happen as a fake signal from the master could be handled and a real signal from an outside user is sent to us (e.g. from unicorn-worker-killer) or if a user uses the killall(1) command.
2014-01-29fix races/error handling in worker SIGQUIT handler
This protects us from two problems: 1) we (or our app) somehow called IO#close on one of the sockets we listen on without removing it from the readers array. We'll ignore IOErrors from IO#close and assume we wanted to close it. 2) our SIGQUIT handler is interrupted by itself. This can happen as a fake signal from the master could be handled and a real signal from an outside user is sent to us (e.g. from unicorn-worker-killer) or if a user uses the killall(1) command.
2014-01-11unicorn 4.8.0 - big internal changes, but compatible v4.8.0
This release contains fairly major internal workings of master-to-worker notifications. The master process no longer sends signals to workers for most tasks. This works around some compatibility issues with some versions of the "pg" gem (and potentially any other code which may not handle EINTR properly). One extra benefit is it also helps stray workers notice a rare, unexpected master death more easily. Workers continue to (and will always) accept existing signals for compatibility with tools/scripts which may signal workers. PID file are always written early (even on upgrade) again to avoid breaking strange monitoring setups which use PID files. Keep in mind we have always discouraged monitoring based on PID files as they are fragile. We now avoid bubbling IOError to the Rack app on premature client disconnects when streaming the input body. This is usually not a problem with nginx, but may be on some LAN setups without nginx). Thanks to Sam Saffron, Jimmy Soho, Rodrigo Rosenfeld Rosas, Michael Fischer, and Andrew Hobson for their help with this release. Note: the unicorn mailing list will be moved/changed soon due to the RubyForge shutdown. unicorn will always rely only on Free Software. There will never be any sign-up requirements nor terms-of-service to agree to when communicating with us.
2014-01-11GNUmakefile: add "check" target for running all tests
"check" rolls off the fingers of users familiar with GNU Automake more easily. The "test-all" target is preserved for compatibility.
2013-12-09unicorn 4.8.0pre1 v4.8.0.pre1
Eric Wong (6): tests: fix SO_REUSEPORT tests for old Linux and non-Linux stream_input: avoid IO#close on client disconnect t0300: kill off stray processes in test always write PID file early for compatibility doc: clarify SIGNALS and reference init example rework master-to-worker signaling to use a pipe
2013-12-09rework master-to-worker signaling to use a pipe
Signaling using normal kill(2) is preserved, but the master now prefers to signal workers using a pipe rather than kill(2). Non-graceful signals (:TERM/:KILL) are still sent using kill(2), as they ask for immediate shutdown. This change is necessary to avoid triggering the ubf (unblocking function) for rb_thread_call_without_gvl (and similar) functions extensions. Most notably, this fixes compatibility with newer versions of the 'pg' gem which will cancel a running DB query if signaled[1]. This also has the nice side-effect of allowing a premature master death (assuming preload_app didn't cause the master to spawn off rogue child daemons). Note: users should also refrain from using "killall" if using the 'pg' gem or something like it. Unfortunately, this increases FD usage in the master as the writable end of the pipe is preserved in the master. This limit the number of worker processes the master may run to the open file limit of the master process. Increasing the open file limit of the master process may be needed. However, the FD use on the workers is reduced by one as the internal self-pipe is no longer used. Thus, overall pipe allocation for the kernel remains unchanged. [1] - pg is correct to cancel a query, as it cannot know if the signal was for a) graceful unicorn shutdown or b) oh-noes-I-started-a-bad-query-ABORT-ABORT-ABORT!!
2013-11-26doc: clarify SIGNALS and reference init example
"interactive terminal" needed clarification. While we're at it, link to the init.sh example since it may be shared with nginx. Reported-by: Rodrigo Rosenfeld Rosas ref: <5294E9D4.5030608@gmail.com>
2013-11-26always write PID file early for compatibility
This reduces the window for a non-existent PID for folks who monitor PIDs (not a great idea anyways). Unfortunately, this change also brings us back to the case where having a PID later (for other process monitors) is beneficial but more unicorn releases exist where we write the PID early. Thanks to Jimmy Soho for reporting this issue. ref: <CAHStS5gFYcPBDxkVizAHrOeDKAkjT69kruFdgaY0CbB+vLbK8Q@mail.gmail.com> This partially reverts 7d6ac0c17eb29a00a5b74099dbb3d4d015999f27 Folks: please monitor your app with HTTP requests rather than checking processes, a stuck/wedged Ruby VM is still a running one.
2013-11-08t0300: kill off stray processes in test
We shouldn't leave processes running after the test.
2013-11-07stream_input: avoid IO#close on client disconnect
This can avoid IOError from being seen by the application, and also reduces points where IO#close may be called. This is a good thing if we eventually port this code into a low-level server like cmogstored where per-client memory space is defined by FD number of a client. Reported-by: Andrew Hobson <ahobson@gmail.com>
2013-11-04tests: fix SO_REUSEPORT tests for old Linux and non-Linux
On BSD-derived platforms the getsockopt true value may be any (>= 0) value, not just one as it is on Linux. Additionally, SO_REUSEPORT is only supported since Linux 3.9, so folks on older kernels may not have it available. We still define it for Linux since kernel upgrades are usually more common than glibc upgrades. Note: we will still raise an exception at runtime if a user explicitly requests :reuseport in their config and runs an older Linux kernel. Reported-by: Andrew Hobson <ahobson@gmail.com>
2013-11-04unicorn 4.7.0 - minor updates, license tweak v4.7.0
* support SO_REUSEPORT on new listeners (:reuseport) This allows users to start an independent instance of unicorn on a the same port as a running unicorn (as long as both instances use :reuseport). ref: https://lwn.net/Articles/542629/ * unicorn is now GPLv2-or-later and Ruby 1.8-licensed (instead of GPLv2-only, GPLv3-only, and Ruby 1.8-licensed) This changes nothing at the moment. Once the FSF publishes the next version of the GPL, users may choose the newer GPL version without the unicorn BDFL approving it. Two years ago when I got permission to add GPLv3 to the license options, I also got permission from all past contributors to approve future versions of the GPL. So now I'm approving all future versions of the GPL for use with unicorn. Reasoning below: 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. Note: we currently prefer GPLv3 Two improvements thanks to Ernest W. Durbin III: * USR2 redirects fixed for Ruby 1.8.6 (broken since 4.1.0) * unicorn(1) and unicorn_rails(1) enforces valid integer for -p/--port A few more odd, minor tweaks and fixes: * attempt to rename PID file when possible (on USR2) * workaround reopen atomicity issues for stdio vs non-stdio * improve handling of client-triggerable socket errors
2013-11-01bin/*: enforce -p/--port argument to be a valid integer
Users may confuse '-p' with the (to-be-deprecated) '-P/--pid' option, leading to surprising behavior if a pathname is passed as a port, because String#to_i would convert it to zero, causing: TCPServer.new(host, port = 0) to bind to a random, unused port.
2013-11-01construct listener_fds Hash in 1.8.6 compatible way
This renables the ability for Ruby 1.8.6 environments to perform reexecs [ew: clarified this is for 1.8.6, favor literal {} over Hash.new, tweaked LISTENERS.map => LISTENERS.each, thanks to Hleb Valoshka ] Signed-off-by: Eric Wong <normalperson@yhbt.net>
2013-10-29configurator: validate :reuseport for boolean-ess
In case we (and Linux) supports other values in the future, we can update it then. Until now, ensure users only set true or false for this option.
2013-10-26license: allow all future versions of the GNU GPL
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.