[PATCH] ngx_upstream do not cleanup file buffers in subrequest

magz nginx-forum at nginx.us
Wed Mar 9 21:46:56 MSK 2011


Maxim Dounin Wrote:
-------------------------------------------------------
> Hello!
> 
> On Tue, Mar 08, 2011 at 03:24:47PM -0500, magz
> wrote:
> 
> > Hello,
> > 
> > Is it reasonable to add following check to not
> clean/discard fd in case
> > if it's sub request?
> > 
> > I developed nginx module and when it started to
> use tmp buffers under
> > load I had following error:
> > 
> >  29663#0: *45789 sendfile() failed (9: Bad file
> descriptor) while
> > sending request to upstream, client: 10.1.24.14,
> server: hss, request:
> > "POST 
> > 
> > So that sub-request cleared file before main
> request reached it. 
> > Probably this bug should not appear if  request
> body was discarded for
> > sub request. But  in case if you need request
> body for sub-request you
> > should be sure that sub-request does not erases
> main request buffers.
> 
> In official nginx, subrequests can't appear before
> main 
> request.
> 
> On the other hand, main request may clear body as
> well, and it 
> won't be available for subrequests as a result. 
> This problem may 
> be easily seen with ssi module.  The other
> possible case when this 
> problem may appear is filter finalization (e.g. as
> done by image 
> filter module).
> 
> That is, just disabling body cleanup for
> subrequests is clearly 
> not enough.
> 
> I've already posted the patch which removes the
> code in question 
> at all (as a reply to some real problems seen with
> ssi and POSTs, 
> somewhere in russian mailing list).  Probably it
> should be made 
> controllable via some configuration directive if
> there are some 
> real use cases which may be seriously affected by
> removing this 
> code.  I would like to hear something from Igor
> about this.
> 
> BTW, just for history: the code in question was
> introduced in 
> nginx 0.3.3 with the following log message:
> 
>     *) Bugfix: a temporary file with client
> request body now is removed 
>        just after the response header was
> transferred to a client.
> 
> Maxim Dounin
> 

additional flag to ngx_http_subrequest() has to work for this issue.


> 
> > 
> > 
> > -- src/http/ngx_http_upstream.c_orig	2011-03-08
> 08:01:20.000000000
> > -0800
> > +++ src/http/ngx_http_upstream.c	2011-03-08
> 08:01:41.000000000 -0800
> > @@ -2033,7 +2033,7 @@
> ngx_http_upstream_send_response(ngx_http
> >  
> >      u->header_sent = 1;
> >  
> > -    if (r->request_body &&
> r->request_body->temp_file) {
> > +    if (r->request_body &&
> r->request_body->temp_file && r == r->main)
> > {
> >          ngx_pool_run_cleanup_file(r->pool,
> > r->request_body->temp_file->file.fd);
> >          r->request_body->temp_file->file.fd =
> NGX_INVALID_FILE;
> >      }
> > 
> > Posted at Nginx Forum:
> http://forum.nginx.org/read.php?2,181400,181400#ms
> g-181400
> > 
> > 
> > _______________________________________________
> > nginx mailing list
> > nginx at nginx.org
> > http://nginx.org/mailman/listinfo/nginx
> 
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://nginx.org/mailman/listinfo/nginx

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,181400,181710#msg-181710




More information about the nginx mailing list