Hello,
Over the weekend I posted here with questions about a problem where
variables stored in pnotes did not get garbage collected. Thanks to
some very helpful hints I was able to determine that mod_perl was
leaking pnotes in a request with an internal redirect. A patch to fix
that was posted to the dev list. If you have pages with internal
redirects where the redirected-to code uses pnotes then you should
watch out for leaks until the patch makes it into a full release.
I also had a second more serious problem I was hoping that would also
be solved, but it turns out it was completely different and not related
to mod_perl at all. Here is an example of the second leak we had:
my $dbh = DBI->connect(...);
$dbh->disconnect();
$dbh->do("create database 20030107_test");
$dbh->do("drop database 20030107_test");
That example leaks around 4k every request. In our server, there was
something else going on causing it to leak multiple megabytes per
request (I still don't know what). Simply adding in checks to reconnect
unless $dbh->{Active} does the trick. I'll submit a bug to the DBI
people, even though that is a horrible abuse of the class.
That example makes us look pretty dumb, let me explain how it happened
since it may affect you too. We do inter-request caching of $dbh in
pnotes. We rely on the destructor of DBI to disconnect; we don't use
disconnect() anywhere in our code. We do however use
Apache::AuthTIcket-- which does disconnect-- and we pass it our cached
$dbh. So you can see how the above example could occur: AuthTicket
grabs a dbh, then disconnects it, we still use it because we assume it
is connected like normal, but the DBI doesn't like that sequence of
events (it recovers the connection, but leaks).
Thanks for all your help, esp. the good hints about the per request
cleanup!
John