Hi,
Apologies for it not being in the correct format.
Below is a small section of code that I'm having problems with.
Essentially, it puts all the data into a big buffer, and when the buffer
hits 500K, it should stop adding data to the buffer, print the buffer
out, and decline all further data, so as to pass the data through
unmodified.
If I try and download a 650MB file through it, it initially does what is
expected and fills the buffer up to 500K. This can be observed by
looking at /tmp/BigFileTest.result. However, if I then look at the
memory usage of httpd, it continues to grow - eventually to stupidly
huge sizes. The memory usage by far exceeds the amount of data that was
downloaded. In addition to this, if I then cancel my download, the httpd
process appears to carry on running, and doesn't free off any memory. It
still consumes more and more memory, even though the client cancelled
the download.
I have also tried removing the code that deals with buffers completely,
so essentially all it does is reads 1024 bytes, then declines the data,
and the same problem occurs.
I am using the Apache 2.0.47 and the latest version of mod_perl.
Sorry if this is me being dumb, but I really am stuck here.
========================================================================
httpd.conf Extract
Listen 8081
LoadModule perl_module modules/mod_perl.so
PerlModule Apache2
PerlModule Test::BigFileTest
<VirtualHost *:8081>
ServerName my_server_name:8081
ServerAdmin [EMAIL PROTECTED]
ProxyRequests On
ProxyRemote * http://corporate_proxy_server:8080
<Proxy *>
Order Allow,Deny
Allow from all
PerlOutputFilterHandler Test::BigFileTest
</Proxy>
</VirtualHost>
========================================================================
#file:Test/BigFileTest.pm
#---------------------------
#
# Version: 0.1.001
# Author: Chris Pringle
# Date of last update: 09/12/2003
# Copyright (C) 2003 Hewlett Packard Limited
#
package Test::BigFileTest;
use strict;
use warnings;
use Apache::Filter();
use Apache::RequestRec();
use Apache::Connection();
use APR::Table();
use Apache::Const -compile => qw(OK);
use Apache::Const -compile => qw(DECLINED);
use constant BUFF_LEN => 1024;
sub handler
{
# Get the filter object
my($f,$bb) = @_;
my $c = $f->c;
# Declare a buffer
my($buffer) = "";
my($scratch) = "";
# Only done on the FIRST pass of the filter
unless($f->ctx)
{
$f->r->headers_out->unset('Content-Length');
$f->ctx(1);
# Ensure there is a buffer variable in the filter
context
$f->ctx({buffer => ''});
}
# Get buffer from ctx - will contain buffer from previous
buckets
$buffer = $f->ctx->{buffer};
# Read as much data as there is available and put it into
$buffer
while($f->read($scratch, BUFF_LEN))
{
# If buffer > 500K print buffer and stop
if(length($buffer) > 500000)
{
$f->print($buffer);
return Apache::DECLINED;
}
else
{
$buffer = $buffer . $scratch;
}
open(FD, ">>/tmp/BigFileTest.result");
print FD "Buffer size is " . length($buffer) ."\n";
close(FD);
}
# If this is the last bucket
if($f->seen_eos)
{
#
# Do some filtering here ....
#
#
$f->print($buffer);
}
$f->ctx({ buffer => $buffer});
return Apache::OK;
} # handler
1;
---
Regards,
Chris Pringle
UK PSG
Hewlett-Packard, Bristol
Tel: +44 117 31 29664
> -----Original Message-----
> From: Stas Bekman [mailto:[EMAIL PROTECTED]
> Sent: 08 December 2003 19:04
> To: Pringle, Chris (HP-PSG)
> Cc: [EMAIL PROTECTED]
> Subject: Re: Memory Leak
>
>
> Pringle, Chris (HP-PSG) wrote:
> > Hi All,
> >
> > Anyone experience problems with filters and large files?
> >
> > I tried to download a 650MB ISO image through my proxy with
> a filter
> > enabled and it caused the box to run out of memory, thrash and
> > eventually panic.
> >
> > Its a stream based output filter that sits in a loop doing
> > $f->read(...). Even when I do a return Apache::DECLINED to
> after every
> > read, I still get massive memory usage eventually leading
> to a crash.
> >
> > Any ideas?
>
> Chris, in the future please always report bugs following the
> guidelines at: http://perl.apache.org/bugs/.
>
> I assume that you are talking about mp2 filters as you mention
> Apache::DECLINED, which is supposed to pass the data through
> unmodified. How
> do you send the data through? Does the filter read the data
> from default
> apache handler or do you feed it with a mod_perl response handler?
>
> __________________________________________________________________
> Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
> http://stason.org/ mod_perl Guide ---> http://perl.apache.org
> mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
> http://modperlbook.org http://apache.org http://ticketmaster.com
>
>
--
Reporting bugs: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html