unicorn Ruby/Rack server user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Paul Sponagl <paul@sponagl.de>
To: Eric Wong <normalperson@yhbt.net>
Cc: mongrel-unicorn@rubyforge.org
Subject: Re: Unicorn
Date: Thu, 9 Jul 2009 10:06:03 +0200	[thread overview]
Message-ID: <3D052B79-A43B-4A7C-9ED4-032B31CBE664@sponagl.de> (raw)
In-Reply-To: <20090708220413.GA32416@dcvr.yhbt.net>

Eric - you're a genius ! This patch solved it!
Indeed i am forking a sleeping cache refresh process at requests to  
'/' via a system call.
Now i am ready to give it a try. Thank you very much for your help!

All the best for you and unicorn
Paul

PS: Last time i forgot to cc to the list - i added my previous mail  
below to keep searchers- and engines happy.

Am 09.07.2009 um 00:04 schrieb Eric Wong:

> Paul Sponagl <paul@sponagl.de> wrote:
>
> <snip>
>
>> hmmm - everything works as it should...
>
> Very odd, nothing out of the ordinary there.  Is there any chance your
> application forks/execs long-running processes in the background?  I'm
> relying on the FD_CLOEXEC flag to be inherited by accepted sockets  
> from
> the original listen socket.  Maybe that's not the case with OSX...
>
> Perhaps this patch can fix things under OSX?
>
> diff --git a/lib/unicorn.rb b/lib/unicorn.rb
> index 281aa7d..f3073f4 100644
> --- a/lib/unicorn.rb
> +++ b/lib/unicorn.rb
> @@ -444,6 +444,7 @@ module Unicorn
>     # once a client is accepted, it is processed in its entirety here
>     # in 3 easy steps: read request, call app, write app response
>     def process_client(app, client)
> +      client.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
>       response = app.call(env = REQUEST.read(client))
>
>       if 100 == response.first.to_i
>
>> i also tried this config.ru
>> ---8<---
>> # config.ru
>> require "config/environment"
>> use Rack::Lint
>> run ActionController::Dispatcher.new
>> ---8<---
>>
>> does this activate Rack::Lint ?
>
> Yes it should.
>
> Thanks for looking into this issue and doing detailed analysis
> on it!
>
> -- 
> Eric Wong
>
> 
>
>

Hi Eric,

ok, let me write down a few tests:


unicorn_rails with static content:
-------------------------------------------

Macintosh-2:> echo -n "7 bytes" > public/test.html
Macintosh-2:> unicorn_rails
I, [2009-07-08T09:46:53.445542 #25037]  INFO -- : listening on  
addr=0.0.0.0:8080 fd=3
I, [2009-07-08T09:46:53.647616 #25037]  INFO -- : worker=0 spawning...
I, [2009-07-08T09:46:53.648553 #25037]  INFO -- : master process ready
I, [2009-07-08T09:46:53.651324 #25039]  INFO -- : worker=0 spawned  
pid=25039
I, [2009-07-08T09:46:53.651812 #25039]  INFO -- : Refreshing Gem list
worker=0 ready

Macintosh-2:~> telnet 127.0.0.1 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.html HTTP/1.1
Host: test.local

HTTP/1.1 200 OK
Date: Wed, 08 Jul 2009 07:47:33 GMT
Status: 200 OK
Connection: close
Last-Modified: Wed, 08 Jul 2009 07:46:42 GMT
Content-Type: text/html
Content-Length: 7

7 bytesConnection closed by foreign host.

Worked ...

unicorn_rails with simple rails content:
--------------------------------------------------

class HomeController < ApplicationController
  layout 'home'
  def test
    render :text => '7 bytes'
  end

Macintosh-2:~> telnet 127.0.0.1 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /home/test HTTP/1.1
Host: test.local

HTTP/1.1 200 OK
Date: Wed, 08 Jul 2009 07:50:23 GMT
Status: 200 OK
Connection: close
X-Runtime: 2059
ETag: "4028bd3c2c4b2eec87994d1a46c86878"
Content-Type: text/html; charset=utf-8
Cache-Control: private, max-age=0, must-revalidate
Content-Length: 7
Set-Cookie: flash=%7B%7D; path=/
Set-Cookie: _bilderbuch_session=...; path=/; HttpOnly

7 bytesConnection closed by foreign host.

worked...

thin with more complex rails content:
--------------------------------------------------

Macintosh-2:~> wget --server-response http://127.0.0.1:8080/
--10:01:52--  http://127.0.0.1:8080/
           => `index.html.3'
Verbindungsaufbau zu 127.0.0.1:8080... verbunden.
HTTP Anforderung gesendet, warte auf Antwort...
1 HTTP/1.1 200 OK
2 X-Runtime: 446
3 ETag: "0eda35d2574d23011a57cff8043800c8"
4 Content-Type: text/html; charset=utf-8
5 Cache-Control: private, max-age=0, must-revalidate
6 Set-Cookie: flash=%7B%7D; path=/
7 Set-Cookie: _bilderbuch_session=...; path=/; HttpOnly
8 Content-Length: 24340
9 Connection: keep-alive
10 Server: thin 1.0.0 codename That's What She Said

100%[======>] 24,340        23.21M/s    ETA 00:00

10:01:53 (23.21 MB/s) - »index.html.3« gespeichert [24340/24340]

Macintosh-2:~> ls -la index.html.3
-rw-r--r--    1 paulspon paulspon    24340  8. Jul 10:01 index.html.3

worked (content-length and filesize matches)...

unicorn_rails with more complex rails content:
-------------------------------------------------------------

Macintosh-2:~> wget --server-response http://127.0.0.1:8080/
--10:02:50--  http://127.0.0.1:8080/
           => `index.html.4'
Verbindungsaufbau zu 127.0.0.1:8080... verbunden.
HTTP Anforderung gesendet, warte auf Antwort...
1 HTTP/1.1 200 OK
2 Date: Wed, 08 Jul 2009 08:02:51 GMT
3 Status: 200 OK
4 Connection: close
5 X-Runtime: 1541
6 ETag: "e750924df3f2890ab7d8a560d0088c1a"
7 Content-Type: text/html; charset=utf-8
8 Cache-Control: private, max-age=0, must-revalidate
9 Content-Length: 24376
10 Set-Cookie: flash=%7B%7D; path=/
11 Set-Cookie: _bilderbuch_session=...; path=/; HttpOnly

0% [ ] 0             --.--K/s    ETA --:--

does not work (waiting forever...) but - after killing unicorn_rails

Macintosh-2:~> ls -la index.html.4
-rw-r--r--    1 paulspon paulspon    24376  8. Jul 10:02 index.html.4

its there...

unicorn_rails with more complex rails content:
( after adding your suggested socket.flush: )
-------------------------------------------------------------

no changes - still timeouts...


a few more tests:
----------------------------
      socket.write("HTTP/1.1 #{status}\r\n" \
                   "Date: #{Time.now.httpdate}\r\n" \
                   "Status: #{status}\r\n" \
                   "Connection: close\r\n" \
                   "#{OUT.join(Z)}\r\n")
      size = 0
      puts "after socket.write HEADER"
      body.each { |chunk|
        size += chunk.length
        socket.write(chunk)
      }
      puts "after socket.write BODY #{size}"
      socket.flush
      exit!(0)

Content lengt matches output
wget :...
9 Content-Length: 25257
...

after socket.write HEADER
after socket.write BODY 25257
I, [2009-07-08T10:18:16.137773 #25334]  INFO -- : reaped  
#<Process::Status: pid=25336,exited(0)> worker=0
I, [2009-07-08T10:18:16.161050 #25334]  INFO -- : worker=0 spawning...
...

hmmm - everything works as it should...

i also tried this config.ru
---8<---
# config.ru
require "config/environment"
use Rack::Lint
run ActionController::Dispatcher.new
---8<---

does this activate Rack::Lint ?



this is all really strange - do i miss something simple in here ???

Best
Paul


!DSPAM:4a55a7665173716248820!

  parent reply	other threads:[~2009-07-09  8:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-06  8:21 Unicorn Paul Sponagl
2009-07-06 23:16 ` Unicorn Eric Wong
2009-07-07  8:23   ` Unicorn Paul Sponagl
2009-07-07 20:48     ` Unicorn Eric Wong
     [not found]       ` <CE7F2AC4-4088-44ED-A5FF-2A41FE2B61EF@sponagl.de>
     [not found]         ` <20090708220413.GA32416@dcvr.yhbt.net>
2009-07-09  8:06           ` Paul Sponagl [this message]
2009-07-09 10:10             ` Unicorn Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://yhbt.net/unicorn/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3D052B79-A43B-4A7C-9ED4-032B31CBE664@sponagl.de \
    --to=paul@sponagl.de \
    --cc=mongrel-unicorn@rubyforge.org \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhbt.net/unicorn.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).