On Wednesday 17 March 2010 12:15:15 Torsten Förtsch wrote: > On Tuesday 16 March 2010 21:09:33 Pavel Georgiev wrote: > > for (<some condition>) { > > $request->print("--$this->{boundary}\n"); > > $request->print("Content-type: text/html; charset=utf-8;\n\n"); > > $request->print("$data\n\n"); > > $request->rflush; > > } > > > > And the result is endless memory growth in the apache process. Is that > > what you had in mind? > > > > I can confirm this. I have tried this little handler: > > sub { > my $r=shift; > > until( -e "/tmp/stop" ) { > $r->print(("x"x70)."\n"); > $r->rflush; > } > > return Apache2::Const::OK; > } > > The httpd process grows slowly but unlimited. Without the rflush() it > grows slower but still does. > Here is a bit more stuff on the bug. It is the pool that grows.
To show it I use a handler that prints an empty document. I think an empty file shipped by the default handler will do as well. Then I add the following filter to the request: $r->add_output_filter(sub { my ($f, $bb)=...@_; unless( $f->ctx ) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } my $eos=0; while( my $b=$bb->first ) { $eos++ if( $b->is_eos ); $b->delete; } return 0 unless $eos; my $ba=$f->c->bucket_alloc; until( -e '/tmp/stop' ) { my $bb2=APR::Brigade->new($f->c->pool, $ba); $bb2->insert_tail(APR::Bucket->new($ba, ("x"x70)."\n")); $bb2->insert_tail(APR::Bucket::flush_create $ba); $f->next->pass_brigade($bb2); } my $bb2=APR::Brigade->new($f->c->pool, $ba); $bb2->insert_tail(APR::Bucket::eos_create $ba); $f->next->pass_brigade($bb2); return 0; }); The filter drops the empty document and emulates our infinite output. With this filter the httpd process still grows. Now I add a subpool to the loop: [...] until( -e '/tmp/stop' ) { my $pool=$f->c->pool->new; # create a subpool my $bb2=APR::Brigade->new($pool, $ba); # use the subpool $bb2->insert_tail(APR::Bucket->new($ba, ("x"x70)."\n")); $bb2->insert_tail(APR::Bucket::flush_create $ba); $f->next->pass_brigade($bb2); $pool->destroy; # and destroy it } [...] Now it does not grow. Torsten Förtsch -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net