BIG requests/responses to POST and post_handler return value

Antoine BONAVITA antoine_bonavita at yahoo.com
Tue Mar 1 00:25:45 MSK 2011


First, a BIG thanks to you and Maxim for helping out newbies like me around. It 
feels good to talk to people who know what they are talking about yet take the 
time to share their knwoledge.


Now, I officially adopted valgrind + no-pool and am trying to configure this 
with Eclipse. That will definitely be very helpful.

Test::Nginx looks good too. To be honest, when I looked at the source code for 
the echo module I looked at the t directory and got scared. And I went to 
writing my test cases in Python. On second look, your library looks much better 
(especially the config/test relationship which is very explicit in the t files). 
I guess I just will have to learn the syntax. I'll try to move my test cases to 
this. I'll ask for help if I get lost in the process.

Looked at taobao.com on google trends. Looks like you guys are handling a little 
bit of load and know what scalable means... ;) Impressive.

Antoine.


----- Original Message ----
> From: agentzh <agentzh at gmail.com>
> To: Antoine BONAVITA <antoine_bonavita at yahoo.com>
> Cc: nginx-devel at nginx.org
> Sent: Mon, February 28, 2011 5:04:05 AM
> Subject: Re: BIG requests/responses to POST and post_handler return value
> 
> On Thu, Feb 24, 2011 at 1:01 AM, Antoine BONAVITA
> <antoine_bonavita at yahoo.com>  wrote:
> > The good old UTSL. Yes, I do that a lot. Except that the code is  not the 
>easiest
> > thing I had to read. And it takes some time/effort to  get used to the 
style,
> > finding what the usual suspects are  (ngx_http_finalize_request,
> > ngx_http_terminate_request, etc.) and  understanding what they are supposed 
>to
> > do.
> 
> Right :)
> 
> >  But, from having done the same with proprietary software in the past (M$, 
>not  to
> > name it), being able to read the code (and debug it) is definitely  
better...
> >
> 
> *GRIN*
> 
> > Actually, I was considering myself  lucky to have run into the bug. It 
>appears
> > only on POST requests with  big request and big response. All my other tests 
>were
> > fine...
> 
> I  want to say more on this.
> 
> It's especially common to get (simple) tests  passing with totally
> broken C code in the context of nginx development,  because of its
> streaming and non-blocking and asynchronous nature. And  nginx's memory
> pool can make things even worse: that is, its various  optimizations
> for space and time tragically prevent tools like valgrind's  memcheck
> from spotting lots of memory-related bugs.
> 
> To overcome these  problems and to find as many bugs as possible in
> dozens of our nginx C  modules, we've developed some tools to help
> uncovering bugs. To be honest, I  was even meant to write an article on
> this topic, so just to name a few  here:
> 
> 1. etcproxy, written by chaoslawful in pure Erlang for emulate  extreme
> network conditions:
> 
>         https://github.com/chaoslawful/etcproxy
> 
>     this simple  TCP proxy has helped us capture lots of state-machine
> related bugs in  ngx_drizzle, ngx_rds_json,
>     ngx_srcache, ngx_form_input, and  even 3rd-party C libraries like
> libdrizzle. There's a (Chinese) post  analyzing a real-world case for
> using this
>    tool to spot a serious  and weird bug in ngx_drizzle:
> 
>          
>http://agentzh.blogspot.com/2010/01/erlang-tcp-proxy-etcproxy-ngxdrizzle.html
> 
> 2.  the no-pool patch from one of my intern students, shrimp:
> 
>          https://github.com/shrimp/no-pool-nginx
> 
>    This simple patch  can disable the nginx memory pool altogether, and
> thus help valgrind's  memcheck to
>    find a lot more memmory invalid read/write and  double-free errors
> that used to be hidden
>    by the memory pool's  optimizations. This patch is for devel version
> of nginx only. One  surely
>    don't want to disable the pool for production ;)
> 
> 3. our  Test::Nginx test scaffold on CPAN for nginx C development
> written in pure  Perl:
> 
>      http://search.cpan.org/perldoc?Test::Nginx
> 
>    This test driver  supports pure declarative test case syntax that
> does *not* require any real  Perl knowledge and our
>    QA enineers who do not know Perl at all have  been offering lots of
> test cases to us.
> 
>    Piotr Sikora has  established a test farm with a small hybrid
> cluster based on lots of  functionalities provided by Test::Nginx.
> 
> These have formed the nginx  development tool-chain used extensively
> here in Taobao.com's Quantum Team. And we cannot live  without it if we
> want to ensure our nginx server running 7x24 hours without  any leaks
> and crashes.
> 
> > I try to avoid luck as much as I can. I  always say "untested code
> > doesn't work". But you cannot test a test case  you don't know to exist...
> 
> Creating (clever) test cases for our C code  written for nginx usually
> cost us much more time ;)
> 
> > If you have  any recommendation on the best way to get going with this thing, 
>I'm
> > all  ears...
> >
> 
> Please see above ;)
> 
> I'm sorry if my previous mail  sounds like some kind of destructive noises.
> 
> > Noticed that. "Devil is  in the details" should be the tagline for nginx... 
>;)
> >
> 
> I cannot  agree more ;) Fortunately there's so many good-quality
> 3rd-party C modules  out there for reference and so many good debugging
> and testing tools that  have been proven useful in practice :D
> 
> Happy hacking!
> -agentzh
> 


      



More information about the nginx-devel mailing list