Hongli Lai <[email protected]> wrote:
> On Thu, Apr 12, 2012 at 10:39 PM, Eric Wong <[email protected]> wrote:
> > paddor wrote:
> >> The problem persists even when multiple workers are started. And the
> >> problem was not present in the old setup with Passenger.
> >
> > The difference between nginx+unicorn and Passenger is probabably: nginx
> > relies on unicorn generating an EOF to signal the end-of-response (nginx
> > <-> unicorn uses HTTP/1.0), this I'm sure about.  I think Passenger uses a
> > protocol which can signal the end-of-request inline without relying on
> > an EOF on the socket (Hongli can correct me on this if I'm wrong).
> 
> We don't. We call #close_write on the socket to prevent this problem.
> #close_write calls shutdown(fd, SHUT_WR) which isn't affected by the
> number of processes that have inherited the socket handle.

Ah, thanks for that clarification.  It's an extra syscall for an
uncommon case, but I doubt most apps will notice the hit...

Might as well shutdown(SHUT_RDWR), too:

diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb
index ede6264..f942e2f 100644
--- a/lib/unicorn/http_server.rb
+++ b/lib/unicorn/http_server.rb
@@ -536,6 +536,7 @@ class Unicorn::HttpServer
     end
     @request.headers? or headers = nil
     http_response_write(client, status, headers, body)
+    client.shutdown # in case of fork() in Rack app
     client.close # flush and uncork socket immediately, no keepalive
   rescue => e
     handle_error(client, e)
_______________________________________________
Unicorn mailing list - [email protected]
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying

Reply via email to